まつもと ゆきひろです

In message "[ruby-list:18852] Re: Why Mix-in? (Re: [book] $*, etc.)"
    on 99/11/23, Toyofuku <toyofuku / juice.or.jp> writes:

|> Ruby本、p.175図4-5と、p.178図4-9の周辺ではいかが?
|
|  ダメです。:-)

そうですか。

|というか。多重継承も Mix-in も使ったことないので
|実感がわきません。

うーん、「使ったこと無いんで実感がわかない」んですから、使っ
てみていただかないことにはどのような説明も無効のように思いま
す。やっぱり経験によって学んでいただかないと。:-)

ともあれ、まず最初に理解していただきたいのはMix-inは多重継承
のサブセットだと言うことです。つまり、「多重継承にできないこ
とがMix-inにできる」というのではないということです。逆に「多
重継承ではまずい設計ができてしまう可能性があるが、Mix-inが強
制されればそれはできない(まずい設計になりにくい)」ということ
ですね。引き算の発想。

gotoであらゆる制御構造が構成できるが現代の言語の多くにgotoが
採用されていないようなものですね。

|どういう流れでこう出力されるのかよくわかって
|ないのですが多重継承にはこの仕掛は入れられ
|ないのでしょうか。またこの仕掛が入れている
|ことによる Mix-in のデメリットはないので
|しょうか。

仕掛けそのものは不可能ではないです、つーか、まったくおんなじ
やり方が可能です。繰り返しますがMix-inは多重継承のサブセット
ですから。が、多重継承はクラス関係の任意のDirected Acyclic
Graph構造を許しますから、この仕掛けが直感に沿う保証はどこに
もありません。一方、単純継承+Mix-inはそのかなり小さなサブセッ
トですので、直感に沿わない可能性がかなり低いです。

Mix-inにおけるこの仕掛けのデメリットってのは思い付きませんね。
あるのかもしれませんが。

|  「複数回実行」以外の「クラスの挙動が予想しに
|くくなる」具体例とそれを Mix-in で書いたときの
|例の比較などもあるともっとぴんとくると思います。

うーん、実はかなり深いクラス階層が構成されないとこの問題は発
生しないのですが、この問題が発生するような深いクラス階層は、
ほとんどの場合そもそも問題のあるクラス設計ですから、Mix-inに
よって「クラスの挙動が予想しにくくなる具体例」ってのはなかな
か作りにくいんですね。

ちょっと無理矢理な例ですが

  Window
  TitledWindow
  ShadowedWindow
  TitledShadowedWindow
  TerminalWindow
  TitledTerminalWindow
  ShadowedTerminalWindow
  TitledShadowedTerminalWindow

というクラス階層を、Mix-inを使わないで

  Window<Object
  TitledWindow<Window
  ShadowedWindow<Window
  TitledShadowedWindow<TitledWindow,ShadowedWindow
  TerminalWindow<Window
  TitledTerminalWindow<TitledWindow,TerminalWindow
  ShadowedTerminalWindow<ShadowedWindow,TerminalWindow
  TitledShadowedTerminalWindow<TitledTerminalWindow,ShadowedTerminalWindow

と設計するのと、Mix-inを使って

  Window<Object
  Titled(モジュール)
  Shadowed(モジュール)
  TitledWindow<Window; include Titled
  ShadowedWindow<Window; include Shadowed
  TitledShadowedWindow<Window; include Titled, Shadowed
  TerminalWindow<Window
  TitledTerminalWindow<TerminalWindow; include Titled
  ShadowedTerminalWindow<TerminalWindow; include Shadowed
  TitledShadowedTerminalWindow<TerminalWindow; include Titled, Shadowed

と設計するのとどっちが良いかというような感じです。伝わるかな。
上の例でクラス図書いてみると良いかも。

「良い」というのは客観的に示せないのでちょっとつらいですけど。

|  それとクジラの Mix-in の例ですが、哺乳類を主
|に、海棲を従に考えていると思うのですが、別の
|ケースで哺乳類を従に考えることもあるかもしれない
|から module Mammalia にしておこうというように
|何でも module になってしまわないんでしょうか。

それは見方の問題(解決すべき問題のとらえ方)ですから、そうする
のが好ましいと思えばそうすれば良いと思います。が、それで使い
やすいかどうかはまた別の問題なので、結局はバランスのとれたと
ころで収束するのではないかと思います、普通は。

                                まつもと ゆきひろ /:|)