memo/20070425
created 2007-04-25 modified 2007-04-25
memo/20051221のところに書いていた、多重継承の話を整理していてふと思ったこと。
多重継承が要るか要らないかの議論の最初で、「多重継承は必要だ派」が
いろんな物事を「オブジェクト」の概念で整理しようとしたとき、整理する軸が1本だけっていうのは、数学を例にとってみても貧弱でしょ、だから、多重継承はきっと必要だよ、ジタジタ
と言っていたのではないかと。
それに対して現実に対する直感の高いひとたちが「多重継承をなくすべきだ派」となって、「現実的に言語を実装するのにこんなに大変だし、実際それって何のメリットがあるのさ」と言ったと。
整理してみたら継承には
- 実体継承(差分プログラミング)
- インタフェース継承(利用側が使えるインタフェースを保障する)
- データ継承(データの多様性を継承で表現する)
があって、よくよく考えたら、多重継承が、ソフトウェア工学的な観点で「有効に」機能するのはインタフェース継承だけだったと。
差分プログラミングについてはほとんどウィンドウシステムだけに有効な単なる語彙のひとつであったし、データ継承については今ではテンプレートを使ったり、継承ツリーを工夫したりすれば多重継承を解消できる。
継承って実際にはあんまし使えないジャンと言われた時期があったり、よーしパパ、パターンという考え方をプラスしてこんなに継承が役に立つ例を挙げちゃうぞとかいうひとがでてきたり、別軸としてテンプレートの概念が出てきたり、そんでそういう机上の細かい議論よりうんと現実の問題世界に近い「マルチパラダイム」で喝破するひとがでたりしたと。
穴に向かって独り言でした。
はて
でもアレか。「差分プログラミングは使えない」と烙印を押すのはちょっと性急なのかな?私が「ソフトウェア工学で」というときの前提には
- プロジェクトが(無手勝流では破綻してしまい納品できなくなるくらい)大規模である
もともとオブジェクトの継承の概念が出てきた背景は、「数学では概念の積み上げがこんなに有効に働いてるじゃん、ソフトも概念を積み上げてどんどん高いレベルで語るようにしないと問題が爆発するよ。だからソフトも概念の積み上げで書こうよ」ということだと思う。
なんでうまくいかないのかね。
もしかして、数学では概念の積み上げをすると複数ステップが1ステップになるけど、ソフトウェアではそうならないからかな。
(「ムーアの法則」というのがあるけど、実際にはムーアの法則に頼ってばかりでソフトの動作速度が遅いプロジェクトは破綻するので、本来の目的を満たしてないことになる)
うーむ。
概念の積み上げがうまくいく例
通信では「概念の積み上げをすると複数ステップが1ステップになる」ことがあるかもしれない。黒田先生の情報理論の講義で、情報量とは何か、という話があった。
たとえば、自動車の教習で、赤い旗を揚げたら「右によけろ」白い旗を揚げたら「左によけろ」という「事前約束」を伝えると、「右によけろ=自分の両手でステアリングホイールを次々に持ち替えながら、ステアリングホイールを右に回転させ、自動車の進行方向を右向きに変えろ」という情報を1ビットで伝えることができる。(講義としては、でもそのことを指して「右によけろ」の情報量は1ビットである、といえるか、とかそういう話だった気ガス)
あるいは、ある社長がいて、部下に目配せをしてあごをちょっと動かすだけで部下が社長の意図を汲んでササッと動くとする。
この情報量は何ビットか?
ソフトウェア工学にこれを活かすとすれば、どうなるか。
ある電文があり、プロトコル上「赤旗」「白旗」を1ビットであらわすとする。3台のコンピュータが直列に接続されていて、真ん中の一台が中継機だとすると、「事前約束」を決めることによって、中継機のCPU使用率はものすごく低減される。
ただし、(有限の予算があらかじめ決まっているとして)2台構成と比較して中継機を置くデメリットを注意深く検討する必要があるし、結局、システム全体での命令ステップ数は小さくならない。
うーん。だめか。
信号待ちで自動車のドアを開けて吸殻を捨てるアフォみたいに、「道路に吸殻を捨てると自分の車内という環境はクリーンになるけど、メタレベルの大きい環境(街全体)としては非クリーンになる」みたいな感じだな。