たなかこういちの開発ノート

システム開発に携わる筆者が、あれこれアウトプットするブログ

「犬と猫の話」のまとめから得られた、OOPに関する課題感のメモ

先日、OO論でTLが盛り上がったので、可能な範囲でまとめた。
 
"犬と猫の話(または、オブジェクト指向とか型とか型クラスとかの話)":
 
まとめを読んで、いくつか課題感を整理できそうだったので、メモっておく。なお、本記事の整理は、私の現時点での理解や解釈においてのもので、ほんとに"正しい"かどうかは不明。
 
 
その「オブジェクト指向」は、「クラス指向」の方?「メッセージ指向」の方?
 
まず、「クラス指向」の方の話なのか、「メッセージ指向」の方の話なのか、どっちの話か常に文脈を明示する必要がある。両者は「Java」と「JavaScript」くらい別の話。"強い人"たちも、いずれか片方の世界(のみ)に住んでいる場合がほとんどで、「オブジェクト」といっても、両者は多分別のことを考えている。
 
<クラス指向の方の話>
・Simula 〜 C++ 〜 Java 〜 の系譜の話。
・かなり明示的に静的型付けを指向。
・概ね、実装するためのプログラミング言語の問題として語られる。たぶん、"オブジェクト"に想定する粒度が相対的に小さい。
 
<メッセージ指向の方の話>
・アラン・ケイ 〜 Smalltalk(初期) 〜 GUI 〜 MVC 〜 RESTful 〜 アクターモデルの系譜の話。
・暗黙的に、自ずとそうなるものとして、動的型付けに親和性があると思われる。
・ほとんどモデリングの問題として語られる。たぶん、"オブジェクト"として想定する粒度が相対的に大きい。
 
「犬と猫は哺乳類」というメタファーについても、クラス指向の観点からは、あまり良い例示ではないとされる一方、メッセージ指向の観点からは、ひとつのエッセンスを描いている良い例示、とされている様子。
 
クラス指向の方についての課題
 
・犬猫を哺乳類で抽象するのが誤り。すなわち、分類と多態を結び付けてるのが誤り。
・やるなら、機能的な側面、例えば「ペット」で抽象せよ。
・継承は、最低でもOCP/DIPに貢献する形での抽象データ型として説明しないとダメ。
・継承を差分プログラミングとして使うといろいろまずい。
・クラスと型が密結合なのが問題。
・差分プログラミングするなら、構造的部分型とか型クラスとかの方向性の方が全然いい。
・型とクラスの違いを理解すべき。
・Nominalもローカルには使える?
・実行効率を考えるとNominalは捨てられない。
・「オブジェクト指向は現実を写し取る」といった言説が不適当
 
私は、今だに「型」と「クラス」の違いを理解していないので、さらに深掘るにはやはり「型」の問題に進む必要がありそうだ。
 
それでも下記点ははっきりしていると思う。
 
・多態を分類に適用してしまうとLSP違反とかややこしいことになる。多態は、機能/役割の定義とその実装、にのみ用いるべき。
・前項の別の側面として、継承は最低でもOCP/DIPに貢献する形での抽象データ型として説明する必要がある。
・差分プログラミングしたいなら、継承ではなく、Structural SubtypingやType Classに進め。
 
ここで気付くのは、クラス指向の方の文脈では、ほぼほぼ下記のような主張となっている様子な点である。
 
「クラス(オブジェクト)」は、(DCIの言うところの)ロールとして(のみ)用いるべきで、素朴実在論的存在を表すことに用いるべきではない。
 
メッセージ指向の方についての課題
 
・"真"のマイクロサービスは、アクターモデルになるはず。
・「決定の遅延」を突き詰めていくと、アクターというランタイムと宣言的言語へ進む未来があるはず。
 
メッセージ指向の方の文脈では、素朴実在論的観点については、次のような主張となっている様子。
 
「オブジェクト」は、むしろ素朴実在論的存在をまさにモデル化したものだ。
 
まとめ
 
「クラス指向」の方の話と、「メッセージ指向」の方の話は、前者が型システムの在り方に強くリンクしていて、後者がモデル表現上のFIrst-Class Citizenの扱いに重心があって、時として相反する結論を導く様子なことが、今回分かってきた。
 
◆以上