そのif文、いつまで書き直すつもりですか? ポリモーフィズムが教える「ペンギンを鳥として扱う」勇気と、コピペ地獄からの最終解脱

AI・テクノロジー

新しいキャラクターや機能を追加するたびに、ソースコード中に散らばった無数のif文を検索し、一つひとつ書き換えて回る……。そんな終わりのない「奴隷の労働」に疲弊していませんか?

「仕様変更が入るのが怖い」「一箇所直すと、どこが壊れるか分からない」
そんなエンジニアの悲鳴に対する、オブジェクト指向からの最終回答。それが最強の武器「ポリモーフィズム(多体性)」です。

ペンギンや鳩を「鳥」という抽象概念で一括管理し、世界をより自然な言葉で記述する。それは単なるコードの短縮技術ではなく、ビトゲンシュタインの哲学とも響き合う、人類の知性がたどり着いた「秩序」の形です。知的好奇心に満ちた、エレガントな「抽象化」の旅へ、共に出かけましょう。

今回の配信内容🎧

  • コピペ地獄を焼き払う「継承」の魔法と、親子の呪縛。
  • 共通の枠組みの中で「個性」を爆発させる、オーバーライドの妙。
  • if文の山を消し去るポリモーフィズム。なぜ一流は「鳥」に命令を出すのか。
  • ビトゲンシュタインと認知言語学。プログラミングは「世界の再構築」である。

1. コピペ地獄からの脱却!「継承」がもたらす設計の革命

ゲーム制作において、戦士、魔法使い、盗賊といった複数のキャラクターを作る場面を想像してください。彼らには「名前がある」「HPがある」「戦う」「逃げる」といった共通の性質が数多く存在します。

これらを、新しいキャラを作るたびに「力技のコピペ」で記述してしまったらどうなるか。
後に「逃げる確率を全キャラ一律で5%下げたい」という修正が入った瞬間、地獄の門が開きます。全てのファイルを開き、似たようなコードを探し出し、手作業で修正する……。どこか一箇所でも忘れたら、それは致命的なバグへと繋がります。

「戦士は人間である。……人間の特徴、人間で記述した戦うとか逃げるとかが全部そのまま受け継がれるんですよ」

この問題をエレガントに解決するのが「継承(インヘリタンス)」です。まず「人間」という共通のベース(親クラス)を定義し、戦士を作る際には「戦士は人間を継承する」と一行宣言するだけ。これだけで、人間で定義したすべての性質が戦士に受け継がれます。共通処理を一括管理できるこの仕組みは、二度手間という名の悪魔を退治し、メンテナンス性を劇的に向上させます。

ただし、注意も必要です。安易な継承は「親を直すと子が壊れる」という強い呪縛を生むこともあります。現代では「継承より委譲」という言葉も囁かれますが、この親子関係をどう築くかというトレードオフこそが、設計の醍醐味なのです。

2. 「オーバーライド」でイレギュラーを華麗にさばく

継承の真骨頂は、親の性質を単に引き継ぐだけでなく、「一部だけ書き換える」ことができる柔軟性にあります。これが「オーバーライド(上書き)」です。

例えば、「人間」の基本的な攻撃アクションが「殴る」だったとしましょう。しかし、魔法使いに「殴れ」と命じるのは少し無粋ですよね。そこで、魔法使いの定義の中でだけ「戦う」という命令の中身を「魔法を放つ」に書き換えます。

こうすることで、システム全体としては「戦え」という共通の合図を送りつつ、魔法使いだけが独自の個性を発揮できるようになります。
「オーバーライド気をつけて。オーバーロードと間違いがちですけど、この場合オーバーライドなんで」
この微細な言葉の使い分けの裏には、共通の枠組みを維持しながらイレギュラーを許容するという、極めて高度な設計思想が隠されています。

しかし、ここでエンジニアは一つの哲学的な壁にぶつかります。それが「ペンギン問題」です。
「鳥」というクラスを作って「空を飛ぶ」と定義したとしましょう。そこに「ペンギン」を継承させようとした瞬間、設計者は天を仰ぎます。ペンギンは鳥ですが、空は飛ばないからです。
「フライ定義できないなみたいな感じで悩んだりするっていうのよくありますね」
どこまでを共通概念(抽象)とし、どこからを特殊(具体)とするか。この境界線を引き直す苦しみこそ、エンジニアが知性を最も磨く瞬間なのです。

3. if文の山を焼き払え。ポリモーフィズムがもたらす「命令の民主化」

オブジェクト指向の3大要素の中で、最も強力であり、かつ理解した瞬間に脳から快楽物質が出るのが「ポリモーフィズム(多体性)」です。
もし、あなたが新しいキャラクターが増えるたびに「もし戦士なら…もし魔法使いなら…」とif文を100箇所書き換えているなら、ポリモーフィズムはその100箇所を「なかったこと」にする魔法になります。

ポリモーフィズムの本質は、相手が誰であるかを詳しく知らなくても、共通の「型」を信じて命令を出せることにあります。
「抽象概念って全然扱えなかったわけじゃないですか。……自然言語っぽいものを扱えるようになったっていうのが多分すごいポイントですね」

例えば、あなたの手元に「鳥リスト」があるとします。中身はペンギン、鳩、キツツキ、ダチョウ……バラバラです。でも、あなたは中身を確認する必要はありません。ただ「鳥」という抽象概念に向かって、「餌を食べろ」と一言命じるだけでいいのです。
すると、ペンギンは魚を獲り、キツツキは木をつつきます。命令は一つなのに、振る舞いは多様。これこそが多体性(ポリモーフィズム)の正体です。
この「型」を信じて命令を投げる安心感があるからこそ、数万行、数百万行という巨大なシステムも、破綻することなく秩序を保てるのです。

4. ビトゲンシュタインと認知言語学:プログラミングは「世界の再構築」である

驚くべきことに、このポリモーフィズムの仕組みは、人文学的な深淵と深く響き合っています。
聞き手の水野さんは、オブジェクト指向の「世界を一つずつ定義して組み立てていくスタイル」に、哲学者ビトゲンシュタインの姿を重ねます。

「世界の中に言葉で世界を作り直す作業をしていた、どちらかっていう気がしたんですよね」

若き日のビトゲンシュタインが『論理哲学論考』で示した、世界を論理的に写し取ろうとする営み。それはまさに、プログラミングコードという言葉によって仮想世界を創り上げるエンジニアの姿そのものです。
また、「人間がメタファー(比喩)を通じて世界を理解する」という認知言語学の視点も、オブジェクト指向と通じます。「戦士は人間である」というメタファーをコードに落とし込み、人間の認知システムをコンピュータ上に再現する。

オブジェクト指向は単なる技術ではありません。私たちの「知の構造」をデジタルに投影し、抽象という翼でカオスな現実を飛び越えるための、知的な挑戦なのです。


まとめ:継承・オーバーライド・ポリモーフィズム:オブジェクト指向の奥義

この記事をまとめると…

  • 継承は、共通の性質を親から子へ受け継がせることで、コピペ地獄を解消し、修正コストを最小化する。
  • オーバーライドは、共通の枠組みを守りつつ、子クラスに独自の「個性」を与える柔軟なカスタマイズを可能にする。
  • ポリモーフィズムの真髄は「抽象化」。具体的な種別を問わず、共通の抽象概念に対して命令を出すことで、圧倒的にシンプルなコードを実現する。
  • オブジェクト指向の設計は、ビトゲンシュタインの哲学や言語学とリンクしており、人間の世界認識を再構築する営みである。

「ポリモーフィズム」を理解したとき、あなたの世界の見方は変わります。
目の前の具体的な事象に惑わされるのではなく、その背後にある「型」を見抜き、抽象という高い視点から命令を下す。そのとき、プログラミングは単なる作業を卒業し、秩序を創造するアートへと昇華するのです。

配信元情報

番組名:ゆるコンピュータ科学ラジオ
タイトル:オブジェクト指向の強烈な武器「ポリモーフィズム」で、ペンギンと鳩を同様に扱える【プログラミングパラダイム・シフト4】#67
配信日:2023-04-09

タイトルとURLをコピーしました