🚀 ニフティ’s Notion

【オブジェクト指向2024 #9】インターフェース

一番馴染みがありそうな「インターフェース」の用例はUI(ユーザーインターフェース)だろうか。

プログラミング経験が豊富な人はAPI(Application Programming Interface)を知っているかもしれない。

インターフェース (一般論)

インターフェースは、オブジェクトとオブジェクトが相互に作用するための方法を表している。

例えば、ユーザーインターフェースの場合は、人間と機械。スマホであれば、

  • 機械は画面にボタンを表示する
  • 人間はそれをタッチする
  • 処理結果もまた画面に文字で表示する
  • 人間がその文字を読み取って結果を理解

ここでは人間と機械の境界、タッチパネル付きの画面であったり、そこに表示されるボタンがインターフェースである。

体から電気を放って機械のメモリを直接書き換えるわけではないし、機械が直接人間の脳に電波で結果を伝えるわけでもない。そんなことされたら簡単に予期しない状態になってしまう。それに、逆にそういう方法が想定される使い方になっている機械があったら難しすぎて私には使えない。

image block

image block

こういう見方をしてほしい。逆に言えば、 インターフェースによって操作が制限されることにより 、壊れにくくなったり、使いやすくなったりしたのだと。

Icon
個人的には、プログラミングでは「プログラマーができることをなるべく制限する」ことがなにより大切だと考えています。「できてしまう」と考慮事項が増え、考慮漏れも発生しやすくなり、そこから大事故につながることがあります。一方できることが少なければ、それしかできないので、使い方がわかりやすくなります。

カプセル化で直接変数を触れないようにするのもそう、先程の Campaign で文字列を渡せないようにしたのもそうです。詳しい人は型システムという言葉を知っているかもしれませんが、それも同じことです。

プログラミングにおけるインターフェース

☝️
インターフェース (きもち的な側面)

クラスに対して「何をすることができるのか」を規定するもの。具体的には、クラスにどのようなメソッドが存在するかを規定する。

☝️
インターフェース (プログラム的な側面)

(語弊を恐れずに言えば) メソッドの存在、引数や戻り値だけを定義し、すべてのメソッドを子クラスにオーバーライドしてもらうように要求する親クラス。

継承と何が違うの?

構文的にはかなり継承と重なる部分があるし、意味的にも一概に分類することは難しい。講師の感覚的な話になってしまうが、次のようなニュアンスの違いがあるというふうに思ってほしい。

  • 継承
    • is-a 関係
    • 具体的な子クラスの共通部分を抽象化した、総称的な親クラスを作る
  • インターフェース
    • オブジェクトの機能や能力を定め、相互に作用する際の境界線になる

次: 📄 【オブジェクト指向2024 #10】インターフェースでメール送信を切り離す