Interface Segregation Principle (ISP) ระบุว่า "Clients should not be forced to depend upon interfaces that they don't use" (Client ไม่ควรถูกบังคับให้พึ่งพา Interface ที่ไม่ได้ใช้)
แทนที่จะสร้าง "Fat Interface" (ใหญ่เกินไป) ควรแยกเป็น "Small Interfaces" (เล็กและเฉพาะเจาะจง) ตามกลุ่มหน้าที่ (Role/Responsibility)
ตัวอย่าง: ก่อนใช้ ISP (Violation - Fat Interface)
// Fat Interface - รวม Properties ทั้งหมดไว้ด้วยกัน
public interface IProduct
{
int ID { get; set; }
double Weight { get; set; }
int Stock { get; set; }
int Inseam { get; set; } // สำหรับกางเกง
int WaistSize { get; set; } // สำหรับกางเกง
int HatSize { get; set; } // สำหรับหมวก
}
// Jeans ต้อง Implement HatSize แม้ไม่ใช้
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 int HatSize { get; set; } // ไม่เกี่ยวข้อง แต่บังคับต้องมี!
}
// BaseballCap ต้อง Implement Inseam, WaistSize แม้ไม่ใช้
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; }
}
ตัวอย่าง: หลังใช้ ISP (Compliant - Segregated Interfaces)
// Base Interface สำหรับ Product ทุกประเภท
public interface IProduct
{
int ID { get; set; }
double Weight { get; set; }
int Stock { get; set; }
}
// Interface เฉพาะสำหรับกางเกง
public interface IPants
{
int Inseam { get; set; }
int WaistSize { get; set; }
}
// Interface เฉพาะสำหรับหมวก
public interface IHat
{
int HatSize { get; set; }
}
// Jeans Implement เฉพาะที่เกี่ยวข้อง
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; }
// ไม่มี HatSize
}
// BaseballCap Implement เฉพาะที่เกี่ยวข้อง
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; }
// ไม่มี Inseam, WaistSize
}
ประโยชน์
- ลด Coupling: Client พึ่งพาแค่ Interface ที่ใช้จริง
- เพิ่ม Cohesion: Interface เล็ก มีหน้าที่ชัดเจน
- ง่ายต่อการทดสอบ (Mock เฉพาะที่ต้องการ)
- รองรับ Multiple Implementations ได้ดี
- ป้องกัน "Interface Pollution" (Implement เมธอดว่าง/ทิ้ง NotImplementedException)
เครื่องมือช่วย
- ReSharper / Rider: Detect "Interface members not implemented" หรือ "Unused interface members"
- Roslyn Analyzers: CA1040, CA1044
ความสัมพันธ์กับ SOLID อื่นๆ
- SRP: Interface เล็ก = Responsibility เดียว
- DIP: พึ่งพา Abstraction (Interface) ที่เล็กและเฉพาะเจาะจง