« 海外有名エンジニア来日! | トップページ | RUPによるCMMIの実装について »

2005年6月 6日 (月)

「汎化-特化」関係と「継承」について

 今日、同僚とオブジェクト指向について雑談していた。オブジェクト指向分析・設計のときにUMLで「汎化ー特化」関係を用いてモデリングするときに、「継承」と呼ぶけど、実は正確には”「汎化ー特化」=「継承」では無い”と言うことを意外と多くの方が知らないことに気付いた。

これは結構重要なことなので知っておいた方が良い。

 「汎化ー特化」は実は色々な方法で実装できるが、その実装方法の1つに「継承」がある。C++やJavaは言語設計で「汎化ー特化」の実装のメカニズムに「継承」を選択しているに過ぎない。

言い方を替えると「汎化ー特化」を実現するメカニズムの1つに継承があるに過ぎないということである。

実はオブジェクト指向言語と呼ばれるもので、「継承」とは別のメカニズムを使っている言語もあるが、メジャーな言語は全て「継承」により実現されている。Java、C++などが代表例。

だから、普段は「汎化ー特化」=「継承」と言ってしまうだけの話しだ。継承が一番多く使われる理由は言語設計者にとってもコンパイラーベンダーにとっても最もバランスが良いからである。

このバランスとはメカニズムの実装の複雑さやメモリーの消費などである。

もちろんデメリットもある、多くのプログラム言語設計者は、「継承」をコンパイル時に決定する(スパークラスの属性やメソッドのアライメントのオフッセットのバイト数分をサブクラスに埋め込む)ことを意識するが多いので、スパークラスに修正を加えるとリコンパイルが必要となる点だ。

これは、ソフトウエア作成の堅牢性確保と実行時のパフォーマンス確保の理由が大きい。

その他のメカニズムとして、(呼び方は人により異なるけど)「オブジェクト・スライシング法」、「状態マシン法」、「デリゲーション」などがある。

「デリゲーション」などを「汎化ー特化」を実現しているかと言う議論もあるが、それはまた今度話しをしたい。

この辺の話しを詳しく知りたい方は、James Odellの本を読むと良い。

「継承」についてさらに補足すると、オブジェクト指向言語であるかどうかの1つの基準として、「継承」の機能を持つことが良く言われるが、「継承」機能を持たないオブジェクト指向言語もある。

つまり、「汎化ー特化」を実現するメカニズム(機能)を持たないオブジェクト指向言語が存在するということだ。

そればかりではない、カプセル化の機能を持たないオブジェクト指向言語も存在する。

さらに、さらに、クラスという考えを持たないオブジェクト指向言語も存在する。クラス定義が無いからJavaやC++とは全く異なる言語設計となっている。

昔と異なり現在では何を持って「オブジェクト指向言語か?」という議論はあまりされなくなったが、オブジェクト指向に対して何を期待するか?プログラム言語に何を反映させるか?という最初の狙いによってきまってきる。

世界的に広く知られているオブジェクト指向言語についての定義はEiffel言語の設計者のメイヤー氏のものがある。ただし、これが一番支持されている訳ではない。

今現在では、オブジェクト指向言語と扱われるのは「オブジェクト」単位で処理を扱えるかという点であるようだ。

クラスやカプセル化はプログラム言語に堅牢性を持たせたり、型理論を利用することが狙いであるから、オブジェクト指向の持つ本質的な性質か?というと学術的にも議論が多いのが本当のところである。

=HSCI Takanari Hashimoto(URL:http://hsc-i.com/)=

|

« 海外有名エンジニア来日! | トップページ | RUPによるCMMIの実装について »

「パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/112989/4445076

この記事へのトラックバック一覧です: 「汎化-特化」関係と「継承」について:

« 海外有名エンジニア来日! | トップページ | RUPによるCMMIの実装について »