เมื่ออ่านบทความบน ISP ดูเหมือนว่ามีคำจำกัดความที่ขัดแย้งกันสองอย่างของ ISP:
ตามคำจำกัดความแรก (ดู1 , 2 , 3 ) ISP ระบุว่าคลาสที่ใช้อินเทอร์เฟซไม่ควรถูกบังคับให้ใช้ฟังก์ชันที่พวกเขาไม่ต้องการ ดังนั้นอินเตอร์เฟซไขมันIFat
interface IFat
{
void A();
void B();
void C();
void D();
}
class MyClass: IFat
{ ... }
ควรแบ่งออกเป็นอินเตอร์เฟสขนาดเล็กISmall_1
และISmall_2
interface ISmall_1
{
void A();
void B();
}
interface ISmall_2
{
void C();
void D();
}
class MyClass:ISmall_2
{ ... }
ตั้งแต่วิธีนี้ฉันMyClass
สามารถที่จะใช้เพียงวิธีการที่จำเป็น ( D()
และC()
) โดยไม่ต้องถูกบังคับให้ยังให้การใช้งานหุ่นสำหรับA()
, B()
และC()
:
แต่ตามคำจำกัดความที่สอง (ดู1 , 2 , คำตอบโดย Nazar Merza ) ผู้ให้บริการอินเทอร์เน็ตระบุว่าMyClient
วิธีการเรียกใช้MyService
ไม่ควรตระหนักถึงวิธีการMyService
ที่ไม่จำเป็น กล่าวอีกนัยหนึ่งหากMyClient
ต้องการเพียงแค่ฟังก์ชั่นของC()
และD()
แทนที่จะเป็น
class MyService
{
public void A();
public void B();
public void C();
public void D();
}
/*client code*/
MyService service = ...;
service.C();
service.D();
เราควรแยกMyService's
เมธอดออกเป็นอินเตอร์เฟสเฉพาะไคลเอ็นต์ :
public interface ISmall_1
{
void A();
void B();
}
public interface ISmall_2
{
void C();
void D();
}
class MyService:ISmall_1, ISmall_2
{ ... }
/*client code*/
ISmall_2 service = ...;
service.C();
service.D();
ดังนั้นด้วยคำจำกัดความเดิมเป้าหมายของ ISP คือ " ทำให้ชีวิตของคลาสที่ใช้อินเทอร์เฟซ IFat ง่ายขึ้น " ในขณะที่เป้าหมายหลังของ ISP คือ " ทำให้ชีวิตของลูกค้าเรียกวิธีการของ MyService ง่ายขึ้น "
คำจำกัดความที่แตกต่างกันสองอย่างของ ISP ใดที่ถูกต้องจริง
@MARJAN VENEMA
1
ดังนั้นเมื่อคุณจะแบ่ง IFat ออกเป็นส่วนต่อประสานที่เล็กลงวิธีการใดที่สิ้นสุดลงซึ่ง ISmallinterface ควรตัดสินใจตามความสัมพันธ์ของสมาชิก
ในขณะที่มันเหมาะสมที่จะใส่วิธีการที่เหนียวแน่นในอินเทอร์เฟซเดียวกันฉันคิดว่าด้วยรูปแบบ ISP ความต้องการของลูกค้าที่มีความสำคัญเหนือกว่า "cohesiveness" ของอินเทอร์เฟซ กล่าวอีกนัยหนึ่งฉันคิดว่ากับ ISP เราควรใช้วิธีเดียวกันกับวิธีการที่ลูกค้าต้องการโดยเฉพาะ ISP แม้ว่ามันจะหมายถึงการไม่ใช้ส่วนต่อประสานนั้นกับวิธีการเหล่านั้นที่ควรจะทำเพื่อความสามัคคี
ดังนั้นหากมีลูกค้าจำนวนมากที่จะต้องโทรCutGreens
แต่ไม่เช่นGrillMeat
นั้นถ้าเป็นไปตามรูปแบบ ISP เราควรใส่CutGreens
ข้างในICook
เท่านั้น แต่ไม่ใช่ด้วยGrillMeat
แม้ว่าทั้งสองวิธีจะเหนียวแน่นกันมาก!
2
ฉันคิดว่าความสับสนของคุณเกิดจากข้อสันนิษฐานที่ซ่อนอยู่ในคำจำกัดความแรก: การใช้คลาสนั้นได้ดำเนินการตามหลักการความรับผิดชอบเดียวแล้ว
โดย "การใช้คลาสที่ไม่ได้ติดตาม SRP" คุณหมายถึงคลาสที่ใช้IFat
หรือคลาสที่ใช้ISmall_1
/ ISmall_2
? ฉันคิดว่าคุณหมายถึงชั้นเรียนที่ใช้IFat
? ถ้าเป็นเช่นนั้นทำไมคุณถึงคิดว่าพวกเขาไม่ได้ติดตาม SRP
ขอบคุณ