इंटरफ़ेस पृथक्करण सिद्धांत का कहना है:
किसी भी ग्राहक को उन तरीकों पर निर्भर होने के लिए मजबूर नहीं किया जाना चाहिए जो इसका उपयोग नहीं करते हैं। आईएसपी ने उन इंटरफेस को विभाजित किया है जो छोटे और अधिक विशिष्ट लोगों में बहुत बड़े हैं ताकि ग्राहकों को केवल उन तरीकों के बारे में जानना होगा जो उनके लिए रुचि रखते हैं।
यहाँ कुछ अनुत्तरित प्रश्न हैं। एक है:
कितना छोटा?
तुम कहो:
वर्तमान में मैं इसके क्लाइंट की आवश्यकताओं के आधार पर मॉड्यूल के नाम स्थान को विभाजित करके इससे निपटता हूं।
मैं इस मैनुअल बतख टाइपिंग को कॉल करता हूं । आप उन इंटरफेस का निर्माण करते हैं जो केवल एक ग्राहक की जरूरत को उजागर करते हैं। इंटरफ़ेस पृथक्करण सिद्धांत केवल मैनुअल बतख टाइपिंग नहीं है।
लेकिन आईएसपी केवल "सुसंगत" भूमिका इंटरफेस के लिए एक कॉल नहीं है जिसका पुन: उपयोग किया जा सकता है। कोई "सुसंगत" रोल इंटरफ़ेस डिजाइन पूरी तरह से एक नए ग्राहक को जोड़ने के खिलाफ नहीं है, जिसके पास इसकी स्वयं की भूमिका की आवश्यकता है।
आईएसपी ग्राहकों को सेवा में परिवर्तन के प्रभाव से अलग करने का एक तरीका है। जैसे ही आप बदलाव करते हैं, यह निर्माण को और तेज करने का इरादा था। यकीन है कि इसके अन्य लाभ हैं, जैसे कि ग्राहकों को नहीं तोड़ना, लेकिन यह मुख्य बिंदु था। अगर मैं सेवाओं के count()
फंक्शन सिग्नेचर को बदल रहा हूं तो यह अच्छा है यदि क्लाइंट जो उपयोग नहीं करते count()
हैं उन्हें संपादित करने और पुन: संपादित करने की आवश्यकता नहीं है।
यह इंटरफ़ेस अलगाव सिद्धांत का मुझे ध्यान क्यों है। यह कुछ ऐसा नहीं है जिसे मैं विश्वास के रूप में महत्वपूर्ण मानता हूं। यह एक वास्तविक समस्या हल करता है।
तो जिस तरह से इसे लागू किया जाना चाहिए वह आपके लिए एक समस्या को हल करना चाहिए। ISP को लागू करने के लिए कोई ब्रेन डेड रॉट तरीका नहीं है जिसे एक आवश्यक बदलाव के सही उदाहरण के साथ हराया नहीं जा सकता है। आपको यह देखना है कि सिस्टम कैसे बदल रहा है और विकल्प बनाएं जो चीजों को शांत कर देगा। चलिए विकल्प तलाशते हैं।
पहले खुद से पूछें: अभी सर्विस इंटरफ़ेस में बदलाव करना मुश्किल है? यदि नहीं, तो बाहर जाओ और तब तक खेलो जब तक तुम शांत न हो जाओ। यह एक बौद्धिक अभ्यास नहीं है। कृपया सुनिश्चित करें कि इलाज बीमारी से बदतर नहीं है।
यदि कई क्लाइंट फ़ंक्शन के समान सबसेट का उपयोग करते हैं, जो "सुसंगत" पुन: प्रयोज्य इंटरफेस के लिए तर्क देता है। सबसेट की संभावना एक विचार के आसपास केंद्रित होती है जो हम सोच सकते हैं कि ग्राहक को जो सेवा प्रदान की जा रही है वह भूमिका है। यह अच्छा है जब यह काम करता है। यह हमेशा काम नहीं करता है।
यदि कई क्लाइंट फ़ंक्शंस के विभिन्न सबसेट का उपयोग करते हैं, तो संभव है कि क्लाइंट वास्तव में कई भूमिकाओं के माध्यम से सेवा का उपयोग कर रहा हो। यह ठीक है, लेकिन यह भूमिकाओं को देखना कठिन बनाता है। उन्हें खोजें और उन्हें अलग करने की कोशिश करें। यह हमें मामले में वापस डाल सकता है। क्लाइंट केवल एक से अधिक इंटरफ़ेस के माध्यम से सेवा का उपयोग करता है। कृपया सेवा की कास्टिंग शुरू न करें। अगर कुछ भी मतलब है कि ग्राहक में सेवा को एक से अधिक बार पारित किया जाएगा। यह काम करता है लेकिन यह मुझे सवाल बनाता है कि क्या सेवा कीचड़ की एक बड़ी गेंद नहीं है जिसे तोड़ने की आवश्यकता है।
यदि कई क्लाइंट अलग-अलग सबसेट का उपयोग करते हैं, लेकिन आप भूमिकाओं को देखते हुए भी अनुमति नहीं देते हैं कि क्लाइंट एक से अधिक का उपयोग कर सकते हैं, तो आपके पास अपने इंटरफेस को डिजाइन करने के लिए बतख टाइपिंग से बेहतर कुछ भी नहीं है। इंटरफेस को डिजाइन करने का यह तरीका सुनिश्चित करता है कि ग्राहक एक ऐसे फ़ंक्शन के संपर्क में न आए जिसका वह उपयोग नहीं कर रहा है, लेकिन यह लगभग गारंटी देता है कि एक नया क्लाइंट जोड़ने में हमेशा एक नया इंटरफ़ेस जोड़ना शामिल होगा, जबकि सेवा कार्यान्वयन को जानने की आवश्यकता नहीं होती है इसके बारे में इंटरफ़ेस जो भूमिका इंटरफेस को एकत्रित करता है। हमने बस एक दर्द का दूसरे के लिए व्यापार किया है।
यदि कई ग्राहक अलग-अलग सबसेट का उपयोग करते हैं, तो ओवरलैप करते हैं, नए ग्राहकों से यह अपेक्षा की जाती है कि उन्हें अप्रत्याशित सबसेट की आवश्यकता होगी, और आप इस सेवा को तोड़ने के लिए तैयार नहीं हैं तो एक अधिक कार्यात्मक समाधान पर विचार करें। चूंकि पहले दो विकल्प काम नहीं करते थे और आप वास्तव में एक बुरी जगह पर थे जहां कुछ भी एक पैटर्न का पालन नहीं कर रहा है और अधिक परिवर्तन आ रहे हैं तो प्रत्येक फ़ंक्शन को अपना इंटरफ़ेस प्रदान करने पर विचार करें। यहां समाप्त होने का मतलब यह नहीं है कि आईएसपी विफल हो गया है। यदि कुछ भी विफल रहा तो वह वस्तु उन्मुख प्रतिमान था। एकल विधि इंटरफेस चरम में आईएसपी का पालन करते हैं। यह कीबोर्ड टाइपिंग का एक अच्छा सा हिस्सा है, लेकिन आपको यह अचानक मिल सकता है कि इंटरफेस फिर से उपयोग करने योग्य है। फिर से, यकीन है कि वहाँ isn '
तो यह पता चला कि वे वास्तव में बहुत छोटे हो सकते हैं।
मैंने इस सवाल को सबसे चरम मामलों में आईएसपी को लागू करने के लिए एक चुनौती के रूप में लिया है। लेकिन ध्यान रखें कि चरम सीमाओं से बचा जाता है। एक अच्छी तरह से सोचे हुए डिज़ाइन में, जो अन्य SOLID सिद्धांतों को लागू करता है, ये मुद्दे आमतौर पर घटित नहीं होते हैं या लगभग उतने ही मायने रखते हैं।
एक और अनुत्तरित प्रश्न है:
इन इंटरफेस का मालिक कौन है?
अधिक से अधिक मैं उन इंटरफ़ेसों को देखता हूं जिन्हें मैं "लाइब्रेरी" मानसिकता कहता हूं। हम सभी बंदर-देख-बंदर-डो कोडिंग के दोषी हैं जहां आप सिर्फ कुछ कर रहे हैं क्योंकि आपने इसे कैसे देखा है। हम इंटरफेस के साथ एक ही बात के दोषी हैं।
जब मैं एक पुस्तकालय में कक्षा के लिए डिज़ाइन किए गए इंटरफ़ेस को देखता हूं, तो मैं सोचता था: ओह, ये लोग पेशेवरों हैं। यह एक इंटरफ़ेस करने का सही तरीका होना चाहिए। जो बात मुझे समझ में नहीं आ रही थी, वह यह है कि एक पुस्तकालय सीमा की अपनी आवश्यकताएं और मुद्दे हैं। एक बात के लिए, एक पुस्तकालय पूरी तरह से इसके ग्राहकों के डिजाइन से अनभिज्ञ है। हर सीमा एक जैसी नहीं होती। और कभी-कभी यहां तक कि एक ही सीमा के पास इसे पार करने के लिए अलग-अलग तरीके होते हैं।
इंटरफ़ेस डिज़ाइन देखने के दो सरल तरीके यहां दिए गए हैं:
सेवा स्वामित्व वाला इंटरफ़ेस। कुछ लोग हर इंटरफ़ेस को डिजाइन कर सकते हैं जो एक सेवा कर सकती है। तुम भी IDE में refactoring विकल्प मिल सकता है कि आप जो भी वर्ग इसे खिलाने का उपयोग करते हुए आपके लिए एक इंटरफ़ेस लिखेंगे।
ग्राहक स्वामित्व वाला इंटरफ़ेस। आईएसपी का तर्क है कि यह सही है और स्वामित्व वाली सेवा गलत है। आपको ग्राहकों की जरूरतों को ध्यान में रखते हुए हर इंटरफेस को तोड़ना चाहिए। चूंकि क्लाइंट इंटरफ़ेस का मालिक है इसलिए इसे इसे परिभाषित करना चाहिए।
तो कौन सही है?
प्लगइन्स पर विचार करें:
यहाँ इंटरफेस का मालिक कौन है? ग्राहकों? सेवाएं?
दोनों को बाहर कर दिया।
यहां के रंग परतदार हैं। लाल परत (दाएं) को हरी परत (बाएं) के बारे में कुछ भी पता नहीं है। लाल परत को छुए बिना हरे रंग की परत को बदला या बदला जा सकता है। इस तरह किसी भी हरे रंग की परत को लाल परत में प्लग किया जा सकता है।
मुझे यह जानना पसंद है कि क्या जानना चाहिए और क्या नहीं जानना चाहिए। मेरे लिए, "क्या पता है?", सबसे महत्वपूर्ण वास्तुशिल्प प्रश्न है।
आइए कुछ शब्दावली स्पष्ट करें:
[Client] --> [Interface] <|-- [Service]
----- Flow ----- of ----- control ---->
एक क्लाइंट एक ऐसी चीज है जो उपयोग करता है।
एक सेवा एक ऐसी चीज है जिसका उपयोग किया जाता है।
Interactor
दोनों होता है।
आईएसपी का कहना है कि ग्राहकों के लिए इंटरफेस को तोड़ना। ठीक है, इसे यहाँ लागू करें:
Presenter
(एक सेवा) Output Port <I>
इंटरफ़ेस को निर्देशित नहीं करना चाहिए । इंटरफ़ेस को Interactor
यहां संकुचित किया जाना चाहिए कि (ग्राहक के रूप में कार्य करने के लिए) क्या चाहिए। इसका मतलब है कि Interactor
ISP का अनुसरण करने के लिए, इसके बारे में इंटरफ़ेस पता है , इसके साथ बदलना होगा। और यह ठीक है।
Interactor
(यहां एक सेवा के रूप में कार्य करना) Input Port <I>
इंटरफ़ेस को निर्देशित नहीं करना चाहिए । इंटरफ़ेस क्या Controller
(एक ग्राहक) की जरूरत के लिए संकुचित किया जाना चाहिए । इसका मतलब है कि Controller
ISP का अनुसरण करने के लिए, इसके बारे में इंटरफ़ेस पता है , इसके साथ बदलना होगा। और यह ठीक नहीं है।
दूसरी परत ठीक नहीं है क्योंकि लाल परत को हरी परत के बारे में पता नहीं है। तो क्या ISP गलत है? हाँ उस जैसा। कोई सिद्धांत निरपेक्ष नहीं है। यह एक ऐसा मामला है, जहां सेवा को सब कुछ दिखाने के लिए इंटरफ़ेस पसंद करने वाले नासमझ सही हो सकते हैं।
कम से कम, वे सही हैं अगर Interactor
इस उपयोग के मामले की जरूरत के अलावा कुछ नहीं करता है। यदि Interactor
अन्य उपयोग के मामलों के लिए चीजें होती हैं तो कोई कारण नहीं Input Port <I>
है कि उनके बारे में यह पता चले। सुनिश्चित नहीं हैं कि Interactor
केवल एक उपयोग के मामले पर ध्यान केंद्रित क्यों नहीं किया जा सकता है, इसलिए यह एक गैर मुद्दा है, लेकिन सामान होता है।
लेकिन input port <I>
इंटरफ़ेस बस Controller
ग्राहक को गुलाम नहीं कर सकता है और यह एक सच्चा प्लगइन है। यह एक 'पुस्तकालय' सीमा है। एक पूरी तरह से अलग प्रोग्रामिंग शॉप लाल परत के प्रकाशित होने के बाद हरे रंग की परत के वर्षों को लिख सकती है।
यदि आप एक 'लाइब्रेरी' की सीमा पार कर रहे हैं और आपको आईएसपी लागू करने की आवश्यकता महसूस होती है, भले ही आप दूसरी तरफ के इंटरफ़ेस के मालिक न हों, तो आपको इंटरफ़ेस को बिना बदले उसे संकीर्ण करने का तरीका खोजना होगा।
एक तरीका है कि बंद एक अनुकूलक है। इसे क्लाइंट Controler
और Input Port <I>
इंटरफ़ेस के बीच रखें । एडेप्टर Interactor
एक के रूप में स्वीकार करता है Input Port <I>
और प्रतिनिधियों को यह काम करता है। हालाँकि, यह केवल उसी ग्राहक को उजागर करता है जिसे Controller
रोल इंटरफ़ेस या ग्रीन लेयर के स्वामित्व वाले इंटरफेस के माध्यम से आवश्यकता होती है। एडेप्टर स्वयं ISP का पालन नहीं करता है, लेकिन अधिक जटिल वर्ग Controller
को ISP का आनंद लेने की अनुमति देता है । यह उपयोगी है अगर वहाँ ग्राहकों की तुलना में कम एडेप्टर हैं Controller
जो उनका उपयोग करते हैं और जब आप असामान्य स्थिति में होते हैं जहां आप एक पुस्तकालय की सीमा पार कर रहे हैं और प्रकाशित होने के बावजूद, पुस्तकालय बदलना बंद नहीं करेगा। आप फ़ायरफ़ॉक्स देख रहे हैं। अब वे परिवर्तन केवल आपके एडेप्टर को तोड़ते हैं।
अच्छा तो इसका क्या मतलब है? इसका मतलब है कि ईमानदारी से आपने मुझे यह बताने के लिए पर्याप्त जानकारी नहीं दी है कि आपको क्या करना चाहिए। मुझे नहीं पता कि ISP का पालन नहीं करने से आपको कोई समस्या हो रही है। मुझे नहीं पता कि अगर यह खत्म हो जाता तो आपको और अधिक समस्याएँ नहीं होतीं।
मुझे पता है कि आप एक सरल मार्गदर्शक सिद्धांत की तलाश कर रहे हैं। ISP बनने की कोशिश करता है। लेकिन यह बहुत कुछ नहीं छोड़ता है। मैं उसमे विश्वास करता हूँ। हां, कृपया ग्राहकों को उन तरीकों पर निर्भर होने के लिए मजबूर न करें, जिनका वे उपयोग नहीं करते हैं, बिना अच्छे कारण के!
यदि आपके पास एक अच्छा कारण है, जैसे कि आपके डिजाइनिंग प्लगइन्स को स्वीकार करने के लिए कुछ है, तो आईएसपी कारणों का पालन नहीं करने वाली समस्याओं के बारे में जागरूक रहें (यह ग्राहकों को तोड़ने के बिना बदलना मुश्किल है), और उन्हें कम करने के तरीके (रखें Interactor
या कम से कम Input Port <I>
एक स्थिर पर ध्यान केंद्रित करें) उदाहरण)।