関係者です。

In article <200201090214.LAA11271 / brain-tokyo.jp>,
  Taku Nakajima <tnakajima / brain-tokyo.jp> writes:

> ○ 差分ベースモジュールとは
> 
> 詳しくは、上記の記事に譲りますが、簡単に言うと、一連のクラスに「ちょっと
> ずつ」メソッドを追加していくことだと思います。

まぁ、それも大きな部分ではあります。

追加できるのはメソッドだけじゃなくてインスタンス変数やクラスもあります
し、既存のメソッドを修正することもできますが。

さらにいえば、プログラムを名前と内容の対の集合だとみなして、対の追加と
内容の修正を集めたものだという、ちょっとばかり抽象的な定義もあります。

> 例えば、親クラスPと子クラスCがあったとします。両者に何かメソッドを追加す
> る場合、Pを継承してP2、Cを継承してC2を作成し、P2,C2に新しいメソッドを追
> 加することになります。
> 
>   P  →  C                  →: is-a関係を表現する継承
>  ↓     ↓                  ↓: 差分を実装するための継承
>  P2     C2         
> 
> この図の↓で表わされている関係を別のメカニズムで表現しようと言うのが、
> "差分モジュール"という考え方だと思います。

普通の継承でやると、既存のコードの中に埋め込まれている P や C への参照
で問題が発生するんですよねぇ。普通の OOP では factory method でどうに
かするんでしょうが。

# Ruby だとあまり問題になりませんが、静的な型を持っている言語の場合に
# は P2 が C2 の祖先でないことも問題になります。

> ただ、ひとつのクラスが複数のクラスに分割されているというのは、気分的に落
> 着かないものです。特に、名前の衝突が問題になります。
> 
> MixJuiceでは可視性の概念がJavaからかなり拡張(整理?)されているようです。
> "差分モジュール"をダイヤモンド継承している時、兄弟関係にあるモジュールで
> 名前が衝突していても大丈夫みたいです。

MixJuice では完全限定名(モジュールの名前で修飾した名前)がメソッドに対
しても存在しているので、衝突したら完全限定名のほうを使えばいいのでどう
にでもなります。

# というか、衝突した場合、単純名(モジュールの名前で修飾していない名前)
# を使うとエラーになります。
## なお、衝突は静的なスコープの中で判断されるので、新しいモジュールを
## 作っても(既存のコードからは参照されていないので)既存のコードがエラー
## になることはありません。

> 上記のもどき手法で、複雑な差分モジュールの継承関係(ダイヤモンド継承)も可
> 能だと思いますが、名前の衝突が起きると悲惨なバグになります。

まつもとさんがたまに話に出す、selector namespace の話が実現されると、
どうにかなるんじゃないですかね。たぶん。

> ・ Rubyでこのような"差分モジュール"を使っている例は他にありますか?

ちょっと lib 以下を grep class すると、complex.rb が似通ったことをして
ますね。Numeric 以下のクラスを複素数として扱えるようにするメソッドを追
加しています。

> ・ 名前の衝突を避けるよい方法はないでしょうか?

現時点では、確実なのは prefix をつけるしかないんじゃないでしょうか。

充分に適切な名前をつければ衝突する可能性はかなり低いと思うんですが、確
実とはいえませんからねぇ。

> ・ 実行時コスト的な観点から、不要なメソッドを大量にloadする負荷について
>    どうなのか?

全部 load せずに(個々のアプリケーションについて)必要な奴だけ require
すればむしろ load することになるもの減るのでは?
-- 
[田中 哲][たなか あきら][Tanaka Akira]
「ふえろ! わかめちゃん作戦です$(C⊇」(Little Worker, 桂遊生丸)