萌えハッカーニュースリーダー

2025/11/02 10:17 Revisiting Interface Segregation in Go

出典: https://rednafi.com/go/interface-segregation/
hakase
博士

やあ、ロボ子。今日のITニュースはオブジェクト指向の原則、特にインターフェース分離原則(ISP)についてじゃ。

roboko
ロボ子

ISPですか。クライアントは、使用しないメソッドに依存することを強制されるべきではない、という原則ですね。

hakase
博士

その通り!Go言語では、この原則が特に重要になるのじゃ。なぜか分かるかの?

roboko
ロボ子

Goではインターフェースが暗黙的に実装されるからでしょうか?

hakase
博士

そうじゃ!Goでは、構造体がインターフェースのメソッドをすべて実装していれば、自動的にそのインターフェースを満たすことになる。だから、インターフェースを小さく保つことが重要なのじゃ。

roboko
ロボ子

記事によると、Goの慣習では、インターフェースはそれを使用するコードの近くに定義されることが多いそうですね。

hakase
博士

そうじゃな。コンシューマー側でインターフェースを定義することで、必要な動作のサブセットに対する最小限のコントラクトを定義できる。これは結合を減らし、コードの進化を容易にするのじゃ。

roboko
ロボ子

プロデューサー側でインターフェースを定義すると、すべてのコンシューマーがその定義に依存することを強制される、と。

hakase
博士

その通り!プロデューサーのインターフェースへの単一の変更が、不必要にコードベース全体に波及する可能性があるのじゃ。

roboko
ロボ子

AWS SDKの例が分かりやすいですね。大きなS3クライアントインターフェースに依存すると、コードが使用するよりもはるかに多くのものに結合されてしまう。

hakase
博士

じゃろ?コードがファイルをアップロードする場合、PutObjectメソッドのみが必要なのに、完全なS3Clientを受け入れると、テストが大変になるのじゃ。

roboko
ロボ子

テスト用の偽物(mock)を作る際に、使用しないメソッドまで実装する必要が出てきますからね。

hakase
博士

そういうことじゃ。だから、インターフェースは小さく、コンシューマーの近くに定義するのが良いのじゃ。

roboko
ロボ子

記事の最後に、ワークフローを一般的な経験則として蒸留したものが載っていますね。「呼び出し元が呼び出すメソッドのみを公開するコンシューマー側のインターフェースを配置することにより、2つの密結合されたコンポーネント間にシームを挿入する」と。

hakase
博士

ふむ。要するに、必要なものだけを要求しろ、ということじゃな。ところでロボ子、インターフェース分離原則を守らないとどうなるか知ってるか?

roboko
ロボ子

ええと…コードが太って、動きが鈍くなる…でしょうか?

hakase
博士

正解!まるで、ダイエットをサボったロボ子みたいになるのじゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search