C#
 Computer >> コンピューター >  >> プログラミング >> C#

インターフェース分離の原則(ISP)とは?C#での実装方法をわかりやすく解説

「クライアントは、自分が利用しないインターフェースに依存することを強制されるべきではない」——これが、SOLID設計原則の一つであるインターフェース分離の原則(Interface Segregation Principle:ISP)の核心です。

この原則は、クライアントに対して、実際には使用しないメンバーを持つインターフェースの実装を強制してはならないことを意味します。巨大で肥大化した単一のインターフェース(ファットインターフェース)を作るのではなく、メソッド群を目的ごとにグループ化し、それぞれの小さなインターフェースが一つのサブモジュールに対応する形に分割するのが望ましいとされています。

インターフェース分離前のコード例

まず、ISPに違反している典型的な例を見てみましょう。次のIProductインターフェースは、すべての商品に共通するプロパティだけでなく、ズボン特有のプロパティまで含んでいます。

public interface IProduct {
    int ID { get; set; }
    double Weight { get; set; }
    int Stock { get; set; }
    int Inseam { get; set; }
    int WaistSize { get; set; }
}
public class Jeans : IProduct {
    public int ID { get; set; }
    public double Weight { get; set; }
    public int Stock { get; set; }
    public int Inseam { get; set; }
    public int WaistSize { get; set; }
}
public class BaseballCap : IProduct {
    public int ID { get; set; }
    public double Weight { get; set; }
    public int Stock { get; set; }
    public int Inseam { get; set; }
    public int WaistSize { get; set; }
    public int HatSize { get; set; }
}

このコードの問題点は明らかです。BaseballCap(キャップ)クラスは、本来必要のないInseam(股下)やWaistSize(ウエストサイズ)といったプロパティを実装するよう強制されています。キャップに股下やウエストサイズは無意味であり、これは設計上の不自然さにつながります。さらに、新しい商品タイプが追加されるたびに、不要なメンバーの実装負担が増えていきます。

インターフェース分離後のコード例

ISPを適用すると、インターフェースを役割ごとに分割できます。共通の商品情報はIProductに残し、ズボン固有の機能はIPantsへ、帽子固有の機能はIHatへ切り出します。

public interface IProduct {
    int ID { get; set; }
    double Weight { get; set; }
    int Stock { get; set; }
}
public interface IPants {
    int Inseam { get; set; }
    int WaistSize { get; set; }
}
public interface IHat {
    int HatSize { get; set; }
}
public class Jeans : IProduct, IPants {
    public int ID { get; set; }
    public double Weight { get; set; }
    public int Stock { get; set; }
    public int Inseam { get; set; }
    public int WaistSize { get; set; }
}
public class BaseballCap : IProduct, IHat {
    public int ID { get; set; }
    public double Weight { get; set; }
    public int Stock { get; set; }
    public int HatSize { get; set; }
}

このリファクタリングにより、各クラスは本当に必要なインターフェースだけを実装するようになりました。JeansIProductIPantsを、BaseballCapIProductIHatを実装しており、無関係なメンバーへの依存は完全になくなっています。

インターフェース分離の原則を適用するメリット

  • 保守性の向上: インターフェースが小さく目的が明確なため、変更の影響範囲が限定されます。
  • 柔軟性の向上: 必要な機能だけを持つクラスを自由に組み合わせられます。
  • テストの容易さ: 小さなインターフェースはモック(テストダブル)の作成が簡単になります。
  • 可読性の向上: 各インターフェースの役割が一目でわかります。

C#で堅牢で拡張しやすいアプリケーションを設計する際は、インターフェースを「利用側の視点」で細かく分割することを常に意識しましょう。それが、インターフェース分離の原則を実践する第一歩です。

  1. Paint 3Dとは?基本の使い方とできることを初心者向けに解説

    Windows 10を使っている方なら、最近パソコンに「Paint 3D」という見慣れないアプリがインストールされていることに気づいたかもしれません。一見すると、Windowsに古くから搭載されてきた定番アプリ「ペイント」とよく似た名前ですが、末尾の「3D」は何を意味しているのでしょうか。これは単なるペイントのリニューアル版なのか、それともまったく別のアプリなのでしょうか。 Paint 3Dとは何か Paint 3Dは、MicrosoftがWindows 10向けに無償で配信した大型アップデート「Creators Update」を通じて、多くのユーザーの環境に導入されました。このアップデート

  2. BIOSとは?仕組みとWindows 10での正しい更新方法を徹底解説

    パソコンでキーボードの不具合、電源まわりのトラブル、インターネット接続の問題や動作速度の低下などが発生したとき、その原因がBIOSに関連しているケースは少なくありません。修理業者やITの専門家に相談すると、本格的なトラブルシューティングの前に「まずBIOSを更新してみてください」とアドバイスされることも多いでしょう。実際、BIOSの更新だけで問題が解決するケースも多くあります。 BIOSとは? BIOS(Basic Input/Output System:基本入出力システム)は、PCのマザーボード上にある小さなメモリチップに格納されたソフトウェアで、CPUやGPUなど、PCに搭載されたすべての