概要
オブジェクト指向という言葉はもうすっかりIT業界に馴染んでしまいました
一方で、これほど人によって解釈がばらついている概念もなかなか無いと思います
ここでは実際にオブジェクト指向開発を行ってきた中で、入門書や専門書に書かれている言葉と現実との食い違いについて感じていることを書いてみたいと思います
ただし、あくまでも私がどう感じているかであり、他の方の考えを否定するものではないことを最初に述べておきます
オブジェクト指向技術を使えば、現実の世界をそのままシステム化できる
これもオブジェクト指向が流行り始めた当初からずっと言われ続けてきた言葉だと思いますが、これは現実から大きく離れており、理解の妨げになっています
実際には、現実にある業務や概念をそのままシステムに落とし込むと却って不自然になることの方が多いです
例えば給与計算について考えてみます
現実には経理社員が居て、タイムカードや経費報告書があり、個々の社員が居ます
そして経理社員は社員が提出したタイムカードや経費報告書に従って、個々の社員の給与を計算します
しかしながらこの関係をモデル化していくと、タイムカードや経費報告書といったものは個々の社員が集約する形になると思います。つまり情報エキスパートパターンに照らして言うと、その社員の給与計算に関して、本人(社員)こそが情報エキスパートということになります
にも関わらず経理社員を実装して個々の社員の給与計算を行わせれば、その設計は非常に不自然なものになってしまいます
このように、現実の業務の形をそのままシステムに落とし込むことは必ずしも正しくないことがあるのです
参考までにモデル図とコードサンプルを示します
int salary = emproyee.getSalary();
salary += emproyee.getOvertimePayment() * emproyee.getTimeCard().getOvertime();
salary += emproyee.getExpenseReport().getExpenses();
int salary = salary;
salary += overtimePayment * timeCard.getOvertime();
salary += expenseReport.getExpenses();
オブジェクト指向の本質はオブジェクトにある
私はこれは違うと思います
オブジェクト指向の本質はメッセージングであり、それによって織り成されるオブジェクト間のコラボレーションだと思っています
ここで言うメッセージングとは、相手オブジェクトにしてほしいことを伝えれば相手オブジェクトは自らの責務に従って結果を返してくれる。伝える側が相手オブジェクトがどういう風に仕事を進めたかを気にする必要は一切ない、というものです
また、コラボレーションとは、お互いが意味のある仕事をし、協調して目的を果たす、ということです
そしてオブジェクトという属性と振る舞いの入れ物は、これを実現するための1つの手段でしかないと思います
※蛇足ですがオブジェクト指向の生みの親と言われるアラン・ケイ博士もオブジェクト指向というネーミングは失敗だったと語っています。オブジェクトという単語ばかりが注目を集めてしまい、より注目されるべきメッセージングが軽視されてしまうからです
もしも私が今改めて名前を付け直すならば、コラボレーション指向などという名前が良いのではないかと勝手に思っています
getterとsetterはオブジェクト指向の基本であり、必ず利用すべきである
これもあまりよろしくないと思います
確かにgetterとsetterという皮を1枚被せることでフィールドに直接アクセスしなくて済むかもしれません
しかし考えてみてほしいのですが、皆さんの周りにあるコードのgetterやsetterというのは単純に値を取得/設定するものがほとんどではありませんか?
(あるいはsetterならば引数のnullチェックくらいはしているかもしれませんが)
だとすれば、一体何が隠蔽されているというのでしょうか。ほとんどのgetter, setterはオブジェクトの中身を覆い隠す皮としては薄すぎるように思います
getterやsetterよりももっと意味のある処理をそのオブジェクトに任せられるのではないでしょうか?
一方がただデータの管理だけをさせられるような関係は隷属的であり、コラボレーション(協調)とは言えないと思うのです
蛇足:開発者の取るべきスタンス
「オブジェクト指向とは思想である」という言葉を時折耳にします。また、「これはオブジェクト指向っぽくないからダメだね」という言葉を聞くこともあります
果たして技術者にとってオブジェクト指向は思想であり、正義であるべきでしょうか?
私はオブジェクト指向もその他多くの技術と同じく、「顧客の満足いくシステムを作るための手段の1つ」であると思っています。それは部品のように、よりよいものが見つかれば取り換えられるべきものです
オブジェクトが状態を持つものとして作られてきた一方で、近年状態によって結果が左右されない関数型プログラミングが注目を集めました
これもそうしたオブジェクト指向では果たせない目的を果たすための流れの1つではないかと思います
願わくば技術者がうわべの聞こえの良いバズワードに流されることなく、技術の1つとして冷静な目でオブジェクト指向を取り込んでいくことを願います