「多重継承」と「実装継承」について考える~脱C++的発想
開発現場で使われているオブジェクト指向言語の中で、多重継承をサポートしているものにC++がある。
C++の教科書では「多重継承」は、使うのが難しいので避けるべきとか、ダイヤモンド継承に注意しろとか解説がある。
単一継承でも継承関係の階層を浅くしろ(3階層程度)とか言われる。
さて、これらの注意であるが、あくまでC++言語の言語設計上の問題であり、オブジェクト指向設計や言語全般に言えることではない無い事を理解しよう。
C++の問題にも関わらず、どうもオブジェクト指向一般に言えることと勘違いている人が多い。
C++は、強い型づけ言語となっているが、C++は残念ながら型理論が首尾一貫した形で言語設計として導入されていない。
言語レベルでクラスとしての型階層が無い。
強い型付けのあるオブジェクト指向言語であるEiffelでは、言語として最上位のクラスの型がANYとなり、全てのクラスはこのANYのサブクラスになるように言語設計がされている。ちなみに最下位はNONEである。
このような型理論が首尾一貫した形で導入されている言語では様々な利益をプログラマーは得ることができる。
オブジェクト指向で大切なことは、色々あるがコードレベルでは、オブジェクト指向プログラミングの狙いとして「差分プログラム」がある。
差分ブログラミングとして威力を発揮するのが継承であるが、開発現場で継承を使い差分プログラミンやコードの再利用を行うための考慮がC++には決定的に欠落してるために、「多重継承」、「継承関係の階層の深さ」および「実装継承」に注意しなければならいのである。
一方、Eiffelは非常に数学的に設計(集合論と型理論)されている上に、契約に基づく設計(DesignByContoract)を言語の機能として持っているので、プログラマーが「多重継承」、「継承関係の階層の深さ」および「実装継承」が(必要以上に)注意しなくてよいようになっている。
なお、「実装継承」とは、「意味継承」と異なり共通コードの利用(差分プログラミング)のために、is-a関係にないクラスから継承することである。
分析レベルではこの「実装継承」は避けて、「意味継承」でモデリングすることは大切となる(述語論理学や集合論の一貫性から)。
実装レベルとなると話は異なる(設計や実装のポリシーの問題も関わるから単純でない話題ではあるが)。
詳細設計や実装では、分析で得られた主語-述語関係と、その正当性を集合や写像の数学的で視点で検討したクラス図をどのようにソースコード上に反映するかを検討する。
分析では継承はis-a関係にないモデルは間違いであるが、差分プログラミングやクラスの再利用を最大限に行うことを意識した場合には、実装継承は必要となってくる。
オブジェクト指向には、差分プログラミング以外にもモデルの再利用やカプセル化による保守性などの狙いやメリットがあるのは事実だが、しかし、オブジェクト指向プログラミングの大きなねらいとして、差分プログラミングがあるのも事実だ。
差分プログラミングを実現する継承の1つの方法である「実装継承」を避けることは、ナンセンスというのが、Eiffel言語設計者のバートランド・マイヤー博士の主張だ。
C++のような言語を用いると、効果的な再利用のコードを書きたくても書けなくリスクが大きい。
C++の世界では「実装継承」により差分プログラミングをすると、保守で色々な問題を引き起こすが、Eiffelではこの問題は起きない。
また、Eiffelでは継承階層の深さも、深ければ深いほど利益が得られる様になっている(本来継承とはそういう物であるから自然の帰結である)。
ソースコードは長い時間、再利用されれば、されるほど意味がありメリットとなる(これも当然)。
長く利用されれば、その間に差分プログラミングのために、上位クラスを利用することで、継承階層は深くなっていき、クラスの継承関係は複雑になることは自然である。
その際に起きる様々な問題事項(名前の衝突、重複した継承、上位クラスの機能の制限などなど)の問題は、現場で利用される言語として設計するならば言語設計として当然織り込んでおくべきであり、エンジニアに負担を掛けるのではなく、言語が全て面倒を見るべきというのがEiffelの言語設計ポリシーとなっている。
C++で不具合の温床となりやすいメモリー管理も、Eiffelでは全く気にならない。
ガーベージコレクション機能を備えているからである。
ガーベージコレクションが処理速度に影響を与えるという理由で、C++に無いというのも理由としてはやや消極的だ。
Ada言語にもガーベージコレクションが機能としてあるからだ。
Adaには、Eiifle同様、動作時の型チェックもできる(オプションで外すこともできる)。
Eifflelに興味がある方は、バートランド・マイヤーの「オブジェクト指向入門第2版」を読むとよい。
オブジェクト指向プログラミングの本質が理解でき、Eiffelがガーベジコレクション、並行処理機能SCOOPなどの解説もあるし、数学的な視点でソフトウエアコード開発が理解できる。
| 固定リンク
最近のコメント