[715] Re:オブジェクト指向「初」入門
投稿者:kit1
2007/02/20 02:13:25
> 唯一の正解は無いでしょう。場合によって、適切なものを選べば、それ
> が正解です。
これが CES さんのやり方の問題なんです。
「is-a の意味は常識的なものとは限らない。場合によって、適切なもの
を選べ」というのは、実のところ、まったく意味のない言明です。なぜな
ら、CES さんは、is-a という関係が具体的にどうあるべきかを一切述べ
ていないからです。
我々は、設計段階で、どういう継承関係にすればうまくいくかを知りたい
ため、設計原則を求めているわけです。
たとえば、「常識的に考えた is-a 関係に対して、継承を当てはめれば良
い」というのは、正方形と長方形の例のようにうまくいかない例外もあり
ますが、かなり使える原則です。
また、「LSPに従うオブジェクト同士に対して、継承を当てはめれば良い」
というのは、常に利用可能な原則です。
ところが、CES さんは、「継承してうまく動くような関係が is-a である。
したがって、継承してうまく動くような関係に対して、継承を当てはめれ
ば良い」と言ってるに過ぎないわけです。これは見て分かるようにトート
ロジーに過ぎず、設計の指針としては、全く役に立たないわけです。
結局、CES さんの主張は、LSP どころか、(常にうまくとは限らない)常識的
な is-a 関係による継承関係の設計よりも、さらに劣るものにしか見えません。
また、CES さんは下記のように書いていますが、これはそもそも意味不明です。
> 全く同じ属性と振る舞いを持つクラスは、同じクラスだと考えるべきです。
> これは、「LSP が成り立つならば is-a も成り立つ」と言い換えることもできます。
この二つの文章のうち、一つ目の文章は、クラスとクラスの等価関係に
関する文章です。
二つ目の文章は、クラスとクラスの包含関係に関する文章です。
等価関係に関する文章と、包含関係に関する文章が、同一の意味である
という発想は、まったくもって非論理的だと私は思います。
なぜ、この二つの文章が等価だと発想されたのか、残念ながら、私には
理解できません。
一つ目の文章は正しいと思います。
しかし、一つ目の文章から二つ目の文章を導くことはできません。
なお、Martin 氏の文章を読み返してみて、私がこれまで説明で使って
用語法が、Martin 氏の用語法と異なっているのに気づきました。
私がこれまで
1. オブジェクトの振舞いに関する is-a
2. オブジェクト自身に関する is-a
という二つの言葉で区別してきたことを、Martin 氏は
1. 振舞いの is-a == オブジェクト(CamelCase にした名詞)の is-a
2. 物(子文字で始まる名詞)の is-a
と呼んでいますね。
まあ、独立に読んでいれば意味は通じると思いますが、併せて読むと
混乱するのであまり良くありませんね。どうも申し訳ない。
> オブジェクト指向の第一目的は「わかりやすくすること」であると(今
> は)思っています
> 本来、無関係のオブジェクト同士を継承関係にするのがわかりやすいで
> すか?
私が欲しいのは良い設計指針であって、オブジェクト指向の第一目的は
何かという問いの答は実はどうでもいいんですが(なぜなら、人によって
答がそれぞれ違うので、そんなことの統一見解を決めても実益がないから
です)、それは置いておいて、かなり誤解されていると思います。
設計手順としては、まず常識的な is-a を使って継承関係を考えてみた
上で、それを LSP で検証すればいいんですよ。検証に通らない場合には、
たとえ常識的なis-a 関係であっても、継承関係にはしません。検証に通
れば、もちろん継承関係にします。
簡単でしょう?
本来無関係のオブジェクト同士うんぬんなどと悩む必要はありません。
なお、もし本来無関係だと思っていたオブジェクト同士にLSPが成り立つ
のであれば、実はそのオブジェクト同士は、たぶん無関係じゃないんですよ。
しかし、通常のソフトウェア開発で、そういう発見を必要とすることは
あまりありませんから、無関係だと思うオブジェクト同士について、
いちいちLSPを検証してみる必要はありません。