> 俺がプログラミングを初めてまだ7年、オブジェクト指向が分かっ
> てきたのはここ1、2年ほどのことですのでね。
意外と長いんですね。
私はプログラミング歴は24年ぐらい、オブジェクト指向に関しては
プログラミング言語C++第1版の和訳や、Smalltalk-80のオレンジブッ
クの和訳が出た頃からですから、20年弱くらいですかね。
その前に、先輩から米国byte誌のSmalltalk-80特集号を見せてもらっ
たこともありましたが。
> 正方形は長方形のサブクラスであるとしても成り立つ場合は既に
> 書きました。is-a と LSP をどうしても両立させられない例を一
> つでも出していただけませんか。
CES さんご自身が、正方形を長方形のサブクラスに『しない』方が
いい場合があると、[709]で認めているじゃないですか。常識的に
は、正方形 is-a 長方形ですから、当然、正方形は長方形のサブク
ラスとして継承関係を結ぶべきですし、Robert C. Martin 氏のエッ
セイでも、その方法をまず勧めています。しかし、そうしない方が
いい場合もあるわけですから、オブジェクト自身の is-a は必ずし
も判断基準に使えません。Robert C. Martin 氏が、エッセイの
「本当の問題」「何が悪いのか?」「Design By Contract」のとこ
ろで説明しているのは、そういうことです。オブジェクト自身の
is-a で考えるのは誤りであり、オブジェクトの振舞いに関する
is-a で考えないといけないのです。前に出た円と楕円の話も同じ
です。
このあたりは、和訳を読むよりも、原文
http://www.objectmentor.com/resources/articles/lsp.pdf
の "What Went Wrong" のところを読んだ方が、むしろ理解しやす
いかもしれません、「a Square object is definitely not a
Rectangle object.」と書いてありますから。和訳の「決定的な違
いがあるのです。」という表現では、残念ながら、ここの is-a と
is-not-a のニュアンスが消えてしまっています。私は原文の方を
先に読んだので、ここのところが非常に強く印象に残りました。
なぜ、オブジェクト自身の is-a 関係が継承関係の設計に使えない
場合があるのか、そのことを説明しているのが LSP です (ただし、
正方形や円のケースでは、LSP 以外にも、メモリ効率という別の理
由もあります)。継承関係の設計において、オブジェクト自身の
is-a 関係は使えない場合がある弱い判断基準なわけですが、LSP
は常に使える絶対的な判断基準なわけです。実はLSP(オブジェクト
の振舞いに関する is-a) の方が、オブジェクト自身のis-aよりも
むしろ本質的な原則なわけです。
現在では、has-a の関係は、継承よりも委譲を使うのが良い解だと
されていますが、昔は has-a でも継承を使うことが良くありまし
た。今でもたまにそういうプログラムを見ることがあると思います。
これも、アプリケーションを限定すれば、has-a で LSP を満たす
場合があることから来ているわけです。has-a で継承して問題のな
いアプリケーションは、オブジェクト自身の is-a 関係で継承して
問題のないアプリケーションよりも、はるかに少ないので廃れてき
ているわけですが。
has-a が廃れてきているのに is-a がそうではないのは、オブジェ
クト自身についてis-a の関係が成り立つ場合のほとんど(ただし全
てではない)で、同時に、オブジェクトの振舞いに関する is-a 関
係(すなわちLSP)も満たすからです。
> よろしければ、おすすめの本を紹介していただけないでしょうか。
今回紹介したエッセイ自身を含んだ、Robert C. Martin 氏の
「アジャイルソフトウェア開発の奥義」はいかがでしょう?
http://hamasyou.com/archives/System/aeeoeeueaconoeoeass.php
http://hamasyou.com/archives/System/aeeoeeueaoeeoeaass.php
に長めの紹介があります。
ただ、和訳だと上述したように、ニュアンスが失われる部分はある
でしょうね。また、data中心でモデリングした結果の扱いについて
は、この本の主張に異論がある場合もあるでしょう。この本では常
にOOAを優先すべしという方向ですが、data中心でモデリングした
結果の方を優先した方がいい場合もある筈です。
私は、Robert C. Martin 氏自身の名前は、亡くなられた石井勝さ
んのページで知りました。
http://www.objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/oo-principles.html
石井さんがこのページを書かれたのは1999年ですね。
今ではLSPは有名な原則ですが、これが広まったのは Liskov 氏自
身の功績というよりは、Robert C. Martin 氏の功績の方が大きい
と思います。私がこの法則を知ったのも今回のエッセイを読んだ
からですし、google で The Liskov Substitution Principle を
検索して最初に出てくるのも、このエッセイですし。