वादिम के बहुत अच्छे उत्तर पर विस्तार करने के लिए, मैं "नहीं, वास्तव में नहीं" के साथ "यह विवादास्पद है" सवाल का जवाब देगा।
सामान्य तौर पर, इंटरफ़ेस पृथक्करण एक अच्छी बात है, इसमें शामिल विभिन्न वस्तुओं के "कारणों को बदलने" की कुल संख्या को कम करके। मुख्य सिद्धांत यह है, जब कई तरीकों के साथ एक इंटरफ़ेस को बदलना होगा, इंटरफ़ेस विधियों में से एक में एक पैरामीटर जोड़ने के लिए कहें, तो इंटरफ़ेस के सभी उपभोक्ताओं को कम से कम recompiled होना चाहिए, भले ही उन्होंने उस पद्धति का उपयोग न किया हो जो बदल गया हो। "लेकिन यह सिर्फ एक recompile है!", मैंने सुना है आप कहते हैं; यह सच हो सकता है, लेकिन ध्यान रखें कि आम तौर पर, जो कुछ भी आप recompile करते हैं, उसे सॉफ्टवेयर पैच के हिस्से के रूप में बाहर धकेल दिया जाना चाहिए, चाहे वह बाइनरी में कितना भी महत्वपूर्ण क्यों न हो। इन नियमों को मूल रूप से 90 के दशक में शुरू किया गया था, जब आपकी डेस्कटॉप में औसत डेस्कटॉप वर्कस्टेशन फोन की तुलना में कम शक्तिशाली था, 14.4k बॉड डायल-अप ब्लेज़िन था, और 3.5 "1.44MB" फ्लॉपीज़ "प्राथमिक हटाने योग्य मीडिया थे। यहां तक कि 3 जी / 4 जी के वर्तमान युग में, वायरलेस इंटरनेट उपयोगकर्ताओं के पास अक्सर सीमा के साथ डेटा योजनाएं होती हैं, इसलिए जब एक नवीनीकरण जारी किया जाता है, तो कम बायनेरिज़ को डाउनलोड किया जाना चाहिए, बेहतर।
हालांकि, सभी अच्छे विचारों की तरह, यदि अनुचित तरीके से लागू किया जाता है तो इंटरफ़ेस अलगाव हो सकता है। सबसे पहले, एक संभावना है कि वस्तु को रखते हुए इंटरफेस को अलग करते हुए जो उन इंटरफेस को लागू करता है (निर्भरता को पूरा करते हुए) अपेक्षाकृत अपरिवर्तित होता है, आप "देव वस्तु" के एक विरोधी "हाइड्रा" के साथ समाप्त हो सकते हैं, जहां विरोधी पैटर्न सभी-जानने, ऑब्जेक्ट की सभी-शक्तिशाली प्रकृति संकीर्ण इंटरफेस द्वारा निर्भर से छिपाई गई है। आप एक कई-सिर वाले राक्षस के साथ अंत करते हैं जो कम से कम भगवान वस्तु के रूप में बनाए रखने के लिए कठिन है, साथ ही इसके सभी इंटरफेस को बनाए रखने का ओवरहेड। ऐसे कई कठिन इंटरफेस नहीं हैं, जिन्हें आपको पार नहीं करना चाहिए, लेकिन किसी एक ऑब्जेक्ट पर आपके द्वारा लागू किया गया प्रत्येक इंटरफ़ेस प्रश्न का उत्तर देने से पहले होना चाहिए, "क्या यह इंटरफ़ेस ऑब्जेक्ट में योगदान देता है '
दूसरा, प्रति विधि एक इंटरफ़ेस आवश्यक नहीं हो सकता है, इसके बावजूद कि एसआरपी आपको बता सकता है। आप "रैवियोली कोड" के साथ समाप्त हो सकते हैं; इतने सारे काटने के आकार के टुकड़े, जिनके माध्यम से यह पता लगाना मुश्किल है कि वास्तव में चीजें कहां होती हैं। यदि इंटरफ़ेस के सभी मौजूदा उपयोगकर्ताओं को दोनों विधियों की आवश्यकता है, तो दो तरीकों के साथ एक इंटरफ़ेस को विभाजित करना भी अनावश्यक है। यहां तक कि अगर आश्रित वर्गों में से किसी एक को केवल दो तरीकों में से एक की आवश्यकता होती है, तो यह आम तौर पर इंटरफ़ेस को विभाजित करने के लिए स्वीकार्य नहीं है यदि इसके तरीकों में वैचारिक रूप से बहुत अधिक सामंजस्य है (अच्छे उदाहरण "एनटोनिक तरीके" हैं जो एक दूसरे के सटीक विपरीत हैं)।
इंटरफ़ेस पृथक्करण उन वर्गों पर आधारित होना चाहिए जो इंटरफ़ेस पर निर्भर हैं:
यदि इंटरफ़ेस पर केवल एक वर्ग निर्भर है, तो अलग न करें। यदि वर्ग इंटरफ़ेस विधियों में से एक या अधिक का उपयोग नहीं करता है, और यह इंटरफ़ेस का एकमात्र उपभोक्ता है, तो संभावना है कि आपको उन तरीकों को पहले स्थान पर उजागर नहीं करना चाहिए।
यदि इंटरफ़ेस पर निर्भर एक से अधिक वर्ग है, और सभी आश्रित इंटरफ़ेस के सभी तरीकों का उपयोग करते हैं, तो अलग न करें; यदि आपको इंटरफ़ेस बदलना है (एक विधि जोड़ने या हस्ताक्षर बदलने के लिए), तो सभी मौजूदा उपभोक्ता इस बदलाव से प्रभावित होंगे कि आप अलग हैं या नहीं (हालांकि यदि आप एक ऐसी विधि जोड़ रहे हैं जिसमें कम से कम एक आश्रित को ज़रूरत नहीं होगी, तो विचार करें ध्यान से अगर परिवर्तन को नए इंटरफ़ेस के रूप में लागू किया जाना चाहिए, संभवतः मौजूदा से विरासत में मिला है)।
यदि इंटरफ़ेस पर निर्भर एक से अधिक वर्ग हैं, और वे सभी समान विधियों का उपयोग नहीं करते हैं, तो यह अलगाव के लिए एक उम्मीदवार है। इंटरफ़ेस के "सुसंगतता" को देखें; क्या सभी तरीके आगे एकल, बहुत विशिष्ट प्रोग्रामिंग लक्ष्य हैं? यदि आप इंटरफ़ेस (और इसके कार्यान्वयनकर्ता) के लिए एक से अधिक मुख्य उद्देश्य की पहचान कर सकते हैं, तो उन पंक्तियों के साथ इंटरफेस को विभाजित करने पर विचार करें, जिनमें "कम से कम" परिवर्तन करने के लिए छोटे इंटरफेस बनाने के लिए।