インターフェース
Interface
概要(サマリー)
インターフェース(Interface)とは、人やシステム、プログラム、機器などが情報をやり取りするための接点や共通仕様である。
たとえば、画面上のボタンは人とソフトウェアをつなぎ、USBは機器同士をつなぎ、APIはプログラム同士をつなぐ。何を接続するかによって意味は変わるが、「相手の内部をすべて知らなくても、決められた方法で利用できる」という考え方は共通している。
プログラミング言語の機能としてのインターフェースは、オブジェクトやクラスが備えるべきプロパティやメソッドの形を表すために使われる。
詳細解説
1. 接点や共通仕様という考え方
身近な例として、電気製品のプラグとコンセントがある。形状や電圧などの規格が合っていれば、製品内部の回路を知らなくても接続できる。
ソフトウェアでも同様に、入力するデータ、利用できる操作、返される結果などを決めておけば、内部の実装を入れ替えても利用する側への影響を抑えやすい。
インターフェースは物理的な端子だけを指す言葉ではない。画面、通信規約、関数の呼び出し方、型の契約など、接続のための仕組みを幅広く表す。
2. 文脈によって変わるインターフェース
IT分野では、次のような意味で使われる。
- ユーザーインターフェース:人とコンピュータの接点。GUIやCLIなどがある
- API:プログラムが別のプログラムの機能やデータを利用するための窓口
- ハードウェアインターフェース:USBやHDMIなど、機器を接続する規格
- プログラミング言語のインターフェース:型やクラスが満たすべき構造や操作の契約
単に「インターフェース」と書かれている場合は、画面の話か、APIの話か、型設計の話かを文脈から判断する必要がある。
3. TypeScriptのインターフェース
TypeScriptでは、interfaceを使ってオブジェクト型へ名前を付け、必要なプロパティやメソッドの形を定義できる。
interface Greeter {
language: string;
greet(name: string): string;
}
const japaneseGreeter: Greeter = {
language: "ja",
greet(name) {
return `こんにちは、${name}さん`;
}
};
console.log(japaneseGreeter.greet("佐藤"));
この例では、Greeter型として扱う値に、文字列のlanguageと、文字列を返すgreetメソッドが必要である。
TypeScriptは構造的型付けを採用しているため、常にimplements Greeterと明示する必要はない。必要な形を満たすオブジェクトであれば、Greeterとして扱える。
4. クラスに契約を適用する
クラスへimplementsを指定すると、そのクラスがインターフェースの形を満たしているかを型チェックできる。
interface StorageService {
save(value: string): void;
}
class MemoryStorage implements StorageService {
private values: string[] = [];
save(value: string): void {
this.values.push(value);
}
}
StorageServiceを利用する側は、保存先がメモリかデータベースかを意識せず、saveを呼び出せる。実装を交換しやすくする設計に役立つ。
ただし、インターフェースを追加するだけで自動的に疎結合になるわけではない。責任の分け方や依存関係も適切に設計する必要がある。
5. クラスや型エイリアスとの違い
クラスは、状態や処理を持ち、実行時にインスタンスを作成できる。TypeScriptのインターフェースは主に型チェックへ使われ、通常はJavaScriptへの変換時に消える。
TypeScriptでは、オブジェクト型へ名前を付ける方法としてtypeも利用できる。単純なオブジェクト型では似た用途に使えるが、宣言の結合や拡張方法、表現できる型の範囲などに違いがある。
JavaやC#など、ほかの言語のインターフェースはTypeScriptと同じ仕様ではない。言語によってはデフォルト実装を持てるため、「インターフェースは処理を一切持てない」と一般化するのは不正確である。
6. インターフェースを使う場面
外部サービスとの連携部分、複数の実装を切り替える部分、テスト用の代替実装を用意する部分などで役立つ。
一方、実装が一つしかなく、交換や共有の予定もない小さな処理に細かいインターフェースを大量に作ると、かえって理解しにくくなる場合がある。
「将来使うかもしれない」という理由だけで増やすのではなく、複数の実装を同じ方法で扱いたいか、利用側と実装側の境界を明確にしたいかを基準に判断する。
AIコーディングとの関係
AIへインターフェースを提示すると、必要な入力、出力、メソッド名が明確になるため、実装やテスト用データを生成させやすい。
たとえば、「このTypeScriptインターフェースを満たす実装を作成し、正常系と異常系のテストも追加する」と依頼できる。既存コードを変更するときも、公開インターフェースを維持する条件を伝えると影響範囲を抑えやすい。
ただし、型が一致しても処理内容が正しいとは限らない。AIが生成した実装について、エラー処理、性能、セキュリティ、実際の業務ルールを確認する必要がある。
また、AIへ「インターフェースを追加して疎結合にして」とだけ指示すると、不必要な抽象化が増えることがある。交換したい実装やテストで置き換えたい依存先を具体的に伝えるとよい。
よくある勘違い
インターフェースとは画面デザインのこと?
画面はユーザーインターフェースの一種だが、それだけではない。API、機器の接続規格、プログラミング言語の型契約などもインターフェースと呼ばれる。
クラスとインターフェースは同じ?
同じではない。クラスは実行時の処理や状態を持てるが、TypeScriptのインターフェースは主に値の形を型チェックするために使われる。
TypeScriptでは必ずimplementsが必要?
必要ではない。TypeScriptでは必要な構造を満たしていれば、明示的にimplementsしていないオブジェクトもそのインターフェース型として扱える。
インターフェースを増やせば設計は必ず良くなる?
必ずしも良くならない。目的のない抽象化は、ファイルや概念を増やして理解を難しくする。交換可能性や境界を明確にする必要がある場所で使うことが重要である。
まとめ
- インターフェースは、人やシステム、プログラム、機器をつなぐ接点や共通仕様である
- UI、API、ハードウェア規格、型の契約など、文脈によって意味が変わる
- TypeScriptではオブジェクトが持つべき構造へ名前を付けられる
- クラスや型エイリアスとは役割や使い方が異なる
- AIへ契約を明示すると実装を生成しやすいが、処理の正しさは別途確認する必要がある
情報ソース
より詳しくAIに聞いてみよう
- IT分野で使われるインターフェースの意味を、種類別に整理してください。
- TypeScriptの
interfaceとtypeの違いを具体例で説明してください。 - インターフェースと抽象クラスの使い分けを説明してください。
- 既存コードから適切なインターフェースを抽出する手順を提案してください。
- AIに不要な抽象化を増やさせず、疎結合な設計を依頼するプロンプトを作成してください。