『オブジェクト指向でなぜつくるのか』を読んだ感想

『オブジェクト指向でなぜつくるのか』を読んだ感想

押入れを漁っていたらずいぶん昔に買った本が出てきました。
SIerにいた頃に買った本ですが、そういえばちゃんと読んでなかったなと思い、幾星霜のときを経て読むことにしました。
(わけあってKindle版を読んでます)

この本を買った当時はJavaで開発していたこともあり、雰囲気でしか理解していなかったオブジェクト指向を正しく知りたいという思いがあった気がします。

さて、本書を改めて読んでみて、オブジェクト指向に対するモヤモヤ感がかなり解消されました。

本書曰く、オブジェクト指向はプログラミング技術と汎用の整理術という2つの側面を持っています。
この2つの側面を混同し、あたかも現実世界のすべてをオブジェクト指向(を使ったプログラミング)で表現できるという考えが、オブジェクト指向に対するモヤモヤ感を生んでいました。

プログラミング技術としてのオブジェクト指向

よく企業研修などでオブジェクト指向プログラミングを教える場合、現実世界の比喩を使って説明されます。
例えば、身長、体重という属性をもつ人というクラスからxxさんというインスタンスが生成されて…のような説明です。
こういった説明は確かにわかりやすいものの、あくまでオブジェクト指向プログラミング(OOP: Object Oriented Programing)が適用できる領域においてのみこの考えは適用できます。

よく考えればわかるとおり、OOPが適用できるのは現実世界の一部です。
例えば、OOPではインスタンスが帰属するクラスは1つですが、現実世界においては見る側の立場や視点によってインスタンスが帰属するクラスは変化します。
また、OOPではインスタンスに対して呼ばれたメソッド(命令)は必ず実行されますが、現実世界では全ての命令が忠実に実行されるなんていうことはありえません。

このように、オブジェクト指向のプログラミング技術はあくまで現実世界のコンピューターで置き換えられる一部の領域に対してだけ適用できます。

汎用の整理術としてのオブジェクト指向

汎用の整理術という側面は、OOP由来の集合論と役割分担の考え方を上流工程に応用したものです。
集合論はOOPにおけるクラスとインスタンスの関係性をもとにしています。
1つのクラスから実行時にたくさんのインスタンスを作る仕組みが、集合論における集合と要素の関係にしていることから集合論に発展しました。
また、役割分担の考え方はOOPにおけるメッセージパッシングの仕組みをもとにしています。
インスタンスに対してメソッドを呼び出す仕組みが、「ある特定の役割を持つもの同士が決められた方法で連絡しあう様子」を表現できるということで役割分担の考え方へと発展しました。

このように、汎用の整理術としてのオブジェクト指向は、OOPの仕組みにおいて都合のいいところだけを上流工程に応用したものといえます。

最後に

今更オブジェクト指向かよと思われるかもしれませんが、機械学習でおなじみのscikit-learnの各種のモデルもOOPで実装されています。
fitメソッドやpredictメソッドなんかはまさにポリモーフィズムを実装したものです。
このように、データサイエンティストが普段よく使っているツールも実はオブジェクト指向の恩恵にあずかっていたりします。
ツールを使う側の人間として、オブジェクト指向という考え方を知っておくことは損がなく、応用の幅も広がるのでは?と思いました。