インターフェースベースプログラミング(インターフェースベースアーキテクチャとも呼ばれる)は、モジュールシステムを持たないオブジェクト指向プログラミング言語において、コンポーネントレベルでモジュール型プログラミングを実装するためのアーキテクチャパターンです。そのような言語の一例として、 Java 9以前のJavaが挙げられます。Java 9以前のJavaには、Java 9で導入されたコンポーネントレベルのモジュールシステムであるJavaプラットフォームモジュールシステム( JPMS)がありませんでした。Java 8まではパッケージシステムしかありませんでしたが、Javaソフトウェアコンポーネントは通常、複数のJavaパッケージで構成されます。いずれにしても、コンポーネントが単一のJavaパッケージのみで構成されている場合であっても、インターフェースプログラミングはJavaパッケージのみを使用する場合よりも利点があります。
インターフェースベースのプログラミングでは、アプリケーションはコンポーネントの集合として定義され、コンポーネント間のアプリケーションプログラミングインターフェース(API)呼び出しは、具象クラスではなく抽象インターフェースを介してのみ行うことができます。クラスのインスタンスは、一般的にファクトリーパターンなどの手法を用いて、他のインターフェースを介して取得されます。
これはアプリケーションのモジュール性を高め、保守性を向上させるとされている。しかし、注意が必要である。アプリケーションをインターフェースを介して通信する任意のコンポーネントに分割するだけでは、結合度の低さや凝集度の高さといった、保守性にとって重要とされる他の2つの特性が保証されるわけではない。
インターフェースベースのアーキテクチャは、サードパーティ、あるいは同じ組織内の別々のチームが、既存のシステムに追加のコンポーネントやプラグインを開発する場合に利用できます。Eclipse IDEのコードベースは、インターフェースベースのプログラミングの一例です。Eclipse プラグインベンダーは、親アプリケーションベンダーである Eclipse Foundation が指定したインターフェースを満たすコンポーネントを開発するだけで済みます。実際、Eclipse では、Java 開発ツールなどのオリジナルコンポーネント自体もプラグインです。これは、携帯電話メーカーがモバイル充電器のインターフェース(ピン配置、想定される直流電圧など)を指定し、メーカーとサードパーティの両方がこの標準インターフェース仕様に準拠した独自の携帯電話充電器を製造するのと似ています。
異なるチームが共同作業できるようにするためにインターフェースを使用すると、インターフェースベースのプログラミングでインターフェースの変更がどのように行われるかという問題が生じます。問題は、インターフェースが変更された場合(たとえば、新しいメソッドを追加するなど)、そのインターフェースを実装するために記述された古いコードはコンパイルされなくなり、動的にロードまたはリンクされたプラグインの場合は、ロードまたはリンクに失敗するか、実行時にクラッシュすることです。この問題に対処するには、基本的に2つのアプローチがあります。
これらのアプローチはどちらもJavaプラットフォームで使用されています。
インターフェースの提供元は、一般的にソフトウェアのマイナーバージョンでインターフェースを変更しないことを約束し、実装者はインターフェースを実装することで、少なくとも必要な部分を逸脱なく実装したことを意味します。したがって、インターフェースは、提供者と利用者の間の「契約上の合意」と見なすことができます。この契約がソフトウェア仕様としてより正式に文書化されている場合、これは契約による設計の一例です。ただし、契約による設計自体は、すべてのコンポーネントにインターフェースを使用することを義務付けるものではありません。