1. 序章

辞書は、ポリモーフィズムを「いくつかの異なる形式で発生する状態」と定義しています。 多型は科学の複数の分野に現れるので、それは一般的な定義です。 おそらく、コンピューティングの定義は私たちにとってより意味のあるものになるでしょう。「[ポリモーフィズムは]ルーチンがさまざまな時間にさまざまなタイプの変数を使用できるようにするプログラミング言語の機能です」。

このチュートリアルでは、この文の意味を探ります。 しかし、最初に、私たちは周囲の世界をどのように認識しているかを理解する必要があります。

2. 実世界のポリモーフィズム

私たちの心は私たちの周りのものを一般化します。それはそれらの間の類似点を探し、それらをカテゴリーに分類します。 これらのカテゴリは一般的なものである可能性があるため、動物などの多くのアイテムが含まれます。 一方、それらはかなり具体的である可能性があります。 したがって、含まれる要素は大幅に少なくなります。たとえば、黒の3本足のテーブルなどです。

これを分類プロセス分類と呼びます。 その結果、カテゴリはクラスと呼ばれます。

進化は、私たちがより良く、より迅速な決定を下すのに役立ったので、私たちがこの行動を発達させるように導きました。 その結果、私たちは生き残る可能性が高くなりました。 先史時代の人が直面する可能性のある日常の状況を考えてみてください。 彼らが剣歯虎を見た場合、彼らは走ったり隠れたりしました。 彼らがウサギを見た場合、彼らは見ませんでした。 彼らはすべてのウサギや剣歯虎に会ったわけではありませんが、クラスを作成するのに十分な数の動物を見たので、それらを見たときにそれらを認識しました。

しかし、似たようなものは、似たような特性を持っているだけではありません。 その上、それらは同様の振る舞いをします。 そして、それがポリモーフィズムを本当に強力にするものです。

従業員のことを考えてください。 雇用主の観点から、従業員の最も重要な行動は働くことです。 そして、すべての雇用主は彼らの仕事をする方法を知っています。 少なくとも理想的な世界では、しかし私たちが1つに住んでいると仮定しましょう。

つまり、毎朝、上司は従業員に仕事を始めるように指示するだけで済みます。 そして、彼らは上司の干渉なしにそうします。 (はい、それはばかげた仮定です。 しかし、覚えておきましょう。それは理想的な世界です。)上司はすべての従業員に何をすべきかを指示する必要はありません。 彼らは自律的に彼らがしなければならないことをします。

彼らが自律的でなかったら、それはどのように見えるでしょうか? 上司は次のように回ります。

  • あなたの役割は何ですか?
  • 私はバックエンド開発者です。
  • 次に、バッチジョブを実行するエンドポイントを作成します。 ジョブが完了したら、結果をデータベースに保存し、ユーザーに通知を送信します。

次に、彼は次の従業員に移動します。

  • あなたの役割は何ですか?
  • 私はUXデザイナーです。
  • 次に、アクセシビリティに焦点を当てたワイヤーフレームを作成します。 モバイルファーストのアプローチを使用します。 準備ができたら、フォーカスグループで調査を実行します。

そして、これはどんどん続きます。 (これが存在することを認識しています。 それはマイクロマネジメントと呼ばれています。 しかし幸いなことに、それは私たちの小さなユートピスティックな世界には存在しません。)

大企業の場合、2番目のアプローチは実行可能ではありません。 そのため、彼らは仕事のやり方を知るために従業員に頼っています。

3. プログラミングにおけるポリモーフィズム

プログラミングでは、通常、ポリモーフィズムをオブジェクト指向パラダイムに関連付けます。 これは最も人気のあるパラダイムなので、それについても説明します。 ただし、関数および構造プログラミングには、高階関数や関数ポインターなどのポリモーフィック機能があることに注意してください。

オブジェクト指向プログラミングの従業員の例をもう一度見てみましょう。 これをどのようにモデル化しますか?

最も簡単な解決策は、Employeeスーパークラスと2つの子BackendDeveloperUxDesignerを使用することです。

ご覧のとおり、 Employee クラスには、 work()という単一の抽象メソッドがあります。 両方の子クラスは、そのメソッドを異なる方法で実装します。

これにより、 Boss クラスを作成できます。このクラスは、従業員に仕事を簡単に指示できます。

4. 利点

マイクロマネジメントには理由があります(たとえそれが悪いものであっても)。 コントロールフリークであり、周りをボスするのが大好きなボスがいます(しゃれを意図しています)。 プログラミングでは、別のアプローチに従うのが好きです。

別のクラスの動作を完全に制御したい場合は、それについてすべてを知る必要があります。 細部に至るまで。 これは、1つまたは2つの外部クラスで管理できますが、それを超えると、問題が発生します。 さらに、他のクラスでシステムを拡張することは困難です。

会社がハードウェアの拡張と製造を望んでいると仮定しましょう。 つまり、上司は電気技師、機械技師、およびその他の新しい役割が何をするかを知らなければなりませんでした。 (彼は現在の従業員が何をしているのかさえ知らないことを考えると、これはさらに困難です。 彼は自分が知っていると思うだけです。)

プログラミングでは、Bossクラスにすべての新しいロールの動作を実装する必要があることを意味します。 それはかなり早く手に負えなくなるでしょう。

代わりに、ポリモーフィズムを使用します。 新しいElectricalEngineerおよびMechanicalEngineerクラスに機能を実装します。

その後、私たちがしなければならないのは、彼らを雇って、Bossクラスのemployeeリストに追加することだけです。

5. 結論

この短い記事では、ポリモーフィズムとは何かを見ました。 その知識があれば、定義を再検討して解釈することができます。「[ポリモーフィズムは]ルーチンがさまざまなタイプの変数をさまざまな時間に使用できるようにするプログラミング言語の機能です」。

Employee タイプの変数には、任意の従業員の子孫を含めることができます。 私たちが知っている(そして必要としている)唯一のことは、彼らに働きかけてもらいたいということです。 したがって、 work()メソッドを呼び出します。 変数が保持する従業員の正確なタイプに応じて実行時に決定されるため、正確にどのように実行されるかはわかりません。 しかし、私たちはすべての従業員が自分の仕事のやり方を知っていると信じているので、それで十分です。