オブジェクト指向の難しさの根源と向き、不向き

ここのところしばらくオブジェクト指向でプログラムがうまく作れない(設計ができない、うまくクラスに分けられない)ということがあり、オブジェクト指向について色々と考えていました。

ajiyoshiさんのブログの オブジェクト指向が嫌われるのは、オブジェクト指向そのものの設計が間違っているからだ というエントリに、大変興味深い説明がありました。

なぜクラス設計が難しいのが自明かの説明を試みる。
Java/C++/C#オブジェクト指向的機能というのは、数学的なモデルとしては「包含関係を持つ集合をプログラマが任意に定義できる機能」と言える。
(中略)
一方で、興味深い集合を定義するのはすごく難しい。

処理をオブジェクトに切り分け、それを連携させて全体としてアプリケーションとして動作させることがなぜ難しいのか、その理由がここにあったと感じました。オブジェクト指向設計でのクラスの切り分けは職人技というか、恣意的になってしまいがちだと思うのですが、それについても説明がつきます。

上記で引用させていただいた中にある「Java/C++/C#オブジェクト指向」とは、id:sumim さんの「 “オブジェクト指向”の本質 」というエントリでいうところの「データ型にこだわるOO」だと思います。そこで考え方を「メッセージングにこだわるOO」に切り替えてみたところ、驚くほど設計がやりやすくなりました。

オブジェクトにメッセージを送信すると考えることによって「この処理はどのオブジェクトに頼むべきか」ということが考えやすくなりました。結果として、設計したオブジェクトの責任分割や凝集度、結合度が改善されている…のではないかと期待しています。

自分には、メッセージ送信メタファの方が向いているようです。