先日、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の扱いに重心があって、時として相反する結論を導く様子なことが、今回分かってきた。
◆以上