ISP पर लेख पढ़ते समय, ISP की दो विरोधाभासी परिभाषाएं प्रतीत होती हैं:
पहली परिभाषा (देखें 1 , 2 , 3 ) के अनुसार, आईएसपी कहता है कि इंटरफ़ेस को लागू करने वाले वर्गों को उन कार्यात्मकताओं को लागू करने के लिए मजबूर नहीं किया जाना चाहिए जिनकी उन्हें आवश्यकता नहीं है। इस प्रकार, वसा इंटरफ़ेस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 के तरीकों को आसान बनाने वाले ग्राहकों के जीवन को आसान बनाना " है।
आईएसपी की दो अलग-अलग परिभाषाओं में से कौन सी वास्तव में सही है?
@MARJAN VENEMA
1।
तो जब आप IFat को छोटे इंटरफ़ेस में विभाजित करने जा रहे हैं, तो कौन से तरीके समाप्त होते हैं, जिसमें ISmallinterface को यह तय करना चाहिए कि सदस्य कितने सामंजस्यपूर्ण हैं।
हालांकि यह एक ही इंटरफ़ेस के भीतर एक सुसंगत तरीकों को रखने के लिए समझ में आता है, मैंने सोचा कि आईएसपी पैटर्न के साथ क्लाइंट की जरूरतों को एक इंटरफ़ेस के "सामंजस्य" पर पूर्वता लेना चाहिए। दूसरे शब्दों में, मैंने सोचा था कि आईएसपी के साथ हमें उसी इंटरफ़ेस के भीतर गांठ लगाना चाहिए, जो विशेष क्लाइंट्स के लिए आवश्यक हैं, भले ही इसका मतलब है कि उस इंटरफ़ेस से बाहर निकलकर उन तरीकों को जो सामंजस्य के लिए चाहिए, उन्हें भी उसी इंटरफ़ेस के अंदर रखा जाना चाहिए?
इस प्रकार, अगर बहुत सारे क्लाइंट थे जिन्हें केवल कॉल करने की आवश्यकता होगी CutGreens
, लेकिन यह भी नहीं GrillMeat
, तो आईएसपी पैटर्न का पालन करने के लिए हमें केवल CutGreens
अंदर रखना चाहिए ICook
, लेकिन यह भी नहीं GrillMeat
, भले ही दो विधियां अत्यधिक सामंजस्यपूर्ण हों ?!
2।
मुझे लगता है कि आपका भ्रम पहली परिभाषा में छिपी धारणा से उपजा है: कि कार्यान्वयन कक्षाएं पहले से ही एकल जिम्मेदारी सिद्धांत का पालन कर रही हैं।
"एसआरपी का पालन नहीं करने वाली कक्षाएं लागू करने से" क्या आप उन कक्षाओं का जिक्र कर रहे हैं जो लागू होते हैं IFat
या उन कक्षाओं में लागू होते हैं जो ISmall_1
/ लागू होते हैं ISmall_2
? मुझे लगता है कि आप उन कक्षाओं का उल्लेख कर रहे हैं जो लागू होते हैं IFat
? यदि हां, तो आप यह क्यों मानते हैं कि वे पहले से ही एसआरपी का पालन नहीं करते हैं।
धन्यवाद