オブジェクト指向は真理ではなくドメインに依存する
オブジェクト指向の弱点は、細かいところを言えば色々ありますが、その根本的理由はドメイン(問題領域)に依存することから発生しています。巷で誤解が発生するような表現が有名なものの、開発しようとしているドメインに即したものとしてオブジェクトは作成されます。従って、森羅万象あらゆることがオブジェクトで表現できるという誇大広告は一部誤りです。
この理由は難しいので例を挙げます。例えば、オートマトンを実装するときのことを考えましょう。オートマトンをオブジェクト指向プログラミングで実装する場合、大概の人は状態をオブジェクトとして実装するでしょう。何故ならば、オートマトンの状態遷移関数と出力関数は、状態とセットで実装する方が保守性と拡張性が上がるからです。オートマトンの定義に正確に従って、状態を文字列として実装すると、長い多分岐処理(switch文やif文など)が必要となります。しかしながら、拡張性と保守性を考えると、この状態は好ましくありません。オブジェクト指向で考えたとき、そういう考えから、状態をオブジェクト化して、一部の関数で多分岐プログラムを書くことを避けます。こうすることにより、状態遷移が複雑化した時の、拡張と保守を容易にします。これがオブジェクト指向プログラミングの定石です。
オブジェクト指向プログラミングの多分岐を避ける定石は、正しく絶対的なように感じる人もいるでしょう。しかしながら、オートマトン本来の意味を改めて考えてみると、必ずしも正解とは言えない事に気づきます。というのも、状態遷移と関数は本来別々のものだからです。たまたま、そのドメイン内でそうなっているからと言って、状態が常にそうなるとは限っていません。状態の本質から離れてしまっています。
これは、システム開発の根源に起因する問題です。誰しも求められるシステム以外の要因をオブジェクトに求めません。学術的に正しいからと言って、ビジネスシステムの人間オブジェクトに、遺伝子などの詳細な情報を実装しません。すなわち、世界の真理とシステムとは明確な乖離があり、オブジェクトは真理ではなく、ドメインに依存しているのです。
この問題は取るに足りない問題だと考える人が大半でしょう。システム開発が我々のお仕事であり、使用しない真理を追い求める必要はありません。いえ、それどころか、そうする行為は有害だからです。しかしながら、真理とドメインが乖離している事を意識せず、オブジェクト指向が絶対的に正しい錯覚している状態でシステム開発をすれば、見落とされた矛盾がプロジェクトを失敗へと導きます。プロジェクトが失敗する原因は、大きな一つの要因ではなく、小さな無数の要因から構成されています。
しかし、勘違いしてはならなりません。弱点があるからオブジェクト指向を採用しないという考えは間違いです。何故ならば、全ての人間の思考法に間違いがあり、完璧な方法など存在しないからです。やはり、狼男を撃つ銀の弾丸は存在しません。
我々技術者およびシステム開発の関係者がするべきことは盲目的な否定でなく、妄信でもなく、長所と弱点をよく把握し、お客様を満足させることです。お客様がついていけない高尚なシステムは要りませんし、迷信に基づくシステムもいりません。お客様を満足させるのが唯一無二の目的であり、それだけを目指するべきと私は考えています。