🎉

オブジェクト指向の成り立ちについて考える必要性がそろそろある!

に公開

はじめに

オブジェクト指向を学んでいると、用語の定義や設計原則は追えるのに、どこか「分かったと言い切れない感覚」が残ることがあります。is-a、has-a、継承、カプセル化、SOLID原則──どれも説明できるのに、設計の場面で自信を持って選べない。この違和感は、理解不足というより、オブジェクト指向そのものの性質に由来しているように思えます。

最近、その理由が少しずつ見えてきました。オブジェクト指向とは、単なる「プログラムの書き方」ではなく、世界の複雑性をどう解釈し、どう切り取るかという技術なのではないか、という考えです。

  1. どこで区切り、何を同一視するか

現実世界の物事は、切り取り方次第でまったく違う姿を見せます。
• どこで境界を引くか
• 何を同一視し、何を区別するか
• どの観点を重視し、どれを捨てるか

これらに唯一の正解はありません。にもかかわらず、私たちは設計の場面で「正しいモデル」を作ろうとして迷います。

オブジェクト指向は、この正解のない複雑性に対して、インターフェースという境界を引き、依存関係を制御することで、扱いやすい構造に変換する試みだと捉えられます。

この視点に立つと、「なんとなく腑に落ちない」という感覚の正体が見えてきます。オブジェクト指向は、数学の定理のように一意に決まるものではなく、設計者の解釈を必ず含むからです。

  1. 「スマートフォン」をどう解釈するか

is-a(継承)や has-a(合成)は、現実をそのまま写せばよい関係だと思われがちです。しかし、そこには常に設計者の「解釈」という選択が介在します。

例えば「スマートフォン」をコードで表現するとしたら、どのようなモデルが考えられるでしょうか。

解釈A:スマホは「電話」の一種である

class Smartphone extends Telephone {}

電話としての歴史や、通話を中心とした振る舞いを重視するなら自然な設計です。しかし、通話機能がオプション化されたり、電話APIが廃止された瞬間に、この継承関係は重荷になります。

解釈B:スマホは「コンピュータ」の一種である

class Smartphone extends Computer {}

汎用計算機として捉えるなら合理的ですが、OSやCPU、入出力装置との密結合が強くなり、ハードウェアやプラットフォームの変化に弱くなります。

解釈C:スマホは機能の集合である

class Smartphone {
Phone phone;
CPU cpu;
}

一見すると遠回りに見えますが、電話機能だけを差し替えたり、計算能力の実装を変更したりする自由度が残ります。

どれも現実の一側面を正しく捉えています。しかし、どの解釈を選ぶかによって、そのシステムが何に強く、何に脆くなるかが決まるという点が重要です。

  1. is-a がもたらす重すぎる契約

経験を積んだエンジニアほど「継承より合成」と言うことがあります。その理由は、is-a が非常に強い契約の宣言だからです。

is-a を選ぶということは、「この型は常に置き換え可能である」と約束することを意味します。これは、Liskovの置換原則そのものです。

有名な「正方形と長方形」の例は、この問題を端的に示しています。
• 数学的には、正方形 is-a 長方形
• しかし、長方形に「幅だけを変更するメソッド」があるとどうなるか
• 正方形でそれを呼ぶと、縦横が等しいという定義が壊れる

ここで起きているのは、「現実世界の事実」をそのまま設計に持ち込んだ結果の矛盾です。

この矛盾を避けるために、あえて継承を使わず、has-a という距離感を選ぶ。この現実から一歩引いた判断こそが、オブジェクト指向設計の難しさであり、同時に面白さでもあります。

  1. 表面的な関係ではなく、副作用を見る

合成(Composition)については、「寿命が同じ」「包含関係にある」といった説明がよくされます。しかし、本当に重要なのは、その関係を選んだ瞬間に生じる副作用です。
• どの変更が難しくなるか
• どの依存が将来まで残るか
• どの責務が固定化されるか

is-a を選ぶと、振る舞いの自由度が下がる代わりに、実装の共有が容易になります。has-a を選ぶと、構造は複雑になりますが、変更耐性は上がります。

設計とは、このトレードオフを引き受ける行為です。

「この is-a は、将来の自分を縛らないか?」

最初からこう問い直すのは簡単ではありません。しかし、この問いを持てるようになると、オブジェクト指向は用語の暗記ではなく、判断の技術として立ち上がってきます。

おわりに

オブジェクト指向に「唯一の正解」を求めてしまうと、いつまでも手応えは得られません。

どのように世界を歪めて切り取れば、後の変更が楽になるのか。どの複雑性を引き受け、どれを捨てるのか。その選択の積み重ねが設計です。

そう自覚したとき、オブジェクト指向は単なるパズルではなく、現実世界の複雑さと折り合いをつけるための道具として見えてくるように思います。

最後に、こういうことをしっかり考えないと意見が通っていかないなと感じています。直感的な意見は便利ですが、設計の議論ではそれだけだと弱い。だからこそ、先人たちが積み上げてきた知見──いわば巨人の肩に乗り、その意味を自分なりに解釈することを大事にしていきたいと思います。

Discussion