TL;DR

モジュールやクラスを使う側に見せる境界である。使い方だけを定め、中身の実装とは切り離す。Java や C# のように、実装を持たない抽象型を「インタフェース」と呼ぶ言語もある。

なぜ必要か

A Philosophy of Software Design によると、モジュールをインタフェースと実装に分けることで、実装の複雑さをシステムの他の部分から隠せる。インタフェースが実装よりはるかにシンプルなモジュールは、他の部分に与える複雑さが小さい。インタフェースを変えずに実装を変更すれば、その変更は他のモジュールに影響しない。

仕組み

同書では、インタフェースが持つ情報を 2 種類に分けている。形式的な情報は、引数の名前や型、戻り値の型、例外のように、プログラミング言語が正しさを検査できる部分である。非形式的な情報は、「このメソッドは別のメソッドより先に呼ぶ必要がある」といった使い方の制約のように、言語では表現も強制もできない部分で、コメントでしか書けない。

オブジェクト指向プログラミングでは、インタフェースを共通の規格として定め、複数の種類のオブジェクトを多態性によって同じように扱う。インタフェースに従った操作ができるようにすることを「実装する(implement)」と呼ぶ。Java や C# では、クラスの継承は 1 つに限られるが、インタフェースはいくつでも実装できる。

例

Unix のファイル I/O は、open、read、write、lseek、close の 5 つのシンプルなインタフェースで多くの機能を提供している。A Philosophy of Software Design はこれを深いモジュールの例に挙げている。

注意点

インタフェースは、モジュールの機能を単純化した抽象化である。抽象化から詳細を省いてよいのは、その詳細が本当に重要でないときだけである。提供する機能に比べてインタフェースが複雑なモジュールは浅いモジュールになる。

関連

出典