เมื่ออ่านบทความบน 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
ขอบคุณ