मेरी मुख्य धारणा यह है कि सबसे महत्वपूर्ण बात यह है कि कार्यान्वयन के डोमेन हिस्से में पठनीयता को बनाए रखना सबसे महत्वपूर्ण बात है। इसलिए:
आप एक व्यवहार और एक संभव कार्यान्वयन है, तो सिर्फ एक इंटरफेस नहीं:
सार्वजनिक वर्ग StackOverflowAnswerGenerator {}
आप एक व्यवहार और कई संभव है, तो कार्यान्वयन, फिर कोई समस्या नहीं है और आप केवल "I" को छोड़ सकते हैं, और:
सार्वजनिक इंटरफ़ेस StackOverflowAnswerGenerator {}
सार्वजनिक वर्ग StupidStackOverflowAnswerGenerator: StackOverflowAnswerGenerator {}
सार्वजनिक वर्ग RandomStackOverflowAnswerGenerator: StackOverflowAnswerGenerator {}
सार्वजनिक वर्ग GoogleSearchStackoverflowAnswerGenerator: StackOverflowAnswerGenerator {}
// ...
वास्तविक समस्या है जब आता है आपके पास एक व्यवहार और एक संभावित कार्यान्वयन है लेकिन आपको इसके व्यवहार का वर्णन करने के लिए एक इंटरफेस की आवश्यकता है (उदाहरण के लिए सुविधाजनक परीक्षण के लिए, सी की वजह से आपकी परियोजना में रोकथाम, कुछ पुस्तकालय/ढांचे का उपयोग करके जो इसे लागू करता है ...)। संभावित समाधान, इंटरफ़ेस लगाकर से अन्य कर रहे हैं:
क) उपसर्ग या प्रत्यय कार्यान्वयन (के रूप में इस विषय में कुछ अन्य उत्तर)
ख) इंटरफेस के लिए एक अलग नाम स्थान का प्रयोग करें में कहा गया है:
नामस्थान StackOverflowAnswerMachine।इंटरफेस { सार्वजनिक इंटरफ़ेस StackOverflowAnswerGenerator {} }
नाम स्थान StackOverflowAnswerMachine { सार्वजनिक वर्ग StackOverflowAnswerGenerator: Interfaces.StackOverflowAnswerGenerator {} }
ग) कार्यान्वयन के लिए एक अलग नाम स्थान का उपयोग करें:
नामस्थान StackOverflowAnswerMachine { सार्वजनिक इंटरफ़ेस StackOverflowAnswerGenerator {} }
नाम स्थान StackOverflowAnswerMachine.Implementations { सार्वजनिक वर्ग StackOverflowAnswerGenerator: StackOverflowAnswerMachine.StackOverflowAnswerGenerator {} }
वर्तमान में मैं पिछले संभावना के साथ प्रयोग कर रहा हूँ। ध्यान दें कि कार्यान्वयन स्रोत फ़ाइल में आप अभी भी "StackOverflowAnswerMachine का उपयोग कर सकते हैं;" और डोमेन ऑब्जेक्ट्स तक सुविधाजनक पहुंच है।
अद्यतन: हालांकि मुझे अभी भी लगता है कि आखिरी संभावना सबसे साफ है, यह एक दोष है कि "स्टैक ओवरव्लोएन्सर माचिन का उपयोग करना;" आपको उन सभी डोमेन ऑब्जेक्ट्स तक पहुंच प्रदान करता है जिन्हें आपको सभी डोमेन इंटरफेस को उपसर्ग करना होगा, जो उनके कार्यान्वयन के साथ उलझन में नहीं हैं। ऐसा कुछ ऐसा नहीं हो सकता है जो बहुत सुविधाजनक नहीं है लेकिन साफ डिज़ाइन में आमतौर पर एक वर्ग कई अन्य डोमेन ऑब्जेक्ट्स का उपयोग नहीं करता है, और अधिकतर आपको फ़ील्ड घोषणा और कन्स्ट्रक्टर पैरामीटर सूची में उपसर्ग का उपयोग करने की आवश्यकता होती है। तो, यह मेरी वर्तमान सिफारिश है।
डोमेन कार्यक्षमता के क्लाइंट को यह जानने की आवश्यकता नहीं है कि वे एक इंटरफेस, एक अमूर्त वर्ग या ठोस वर्ग का उपयोग कर रहे हैं या नहीं। अगर उन्हें यह जानने की ज़रूरत है, तो ऐसी परियोजना में कुछ गंभीर समस्या है, क्योंकि इसमें डोमेन तर्क और आधारभूत संरचनाएं समान अमूर्त परत पर मिश्रित हैं। इसलिए मैं "" या "सी" समाधान की अनुशंसा करता हूं।
इसे वास्तव में जावा में बीएडी अभ्यास माना जाता है। जोशुआ ब्लोच द्वारा प्रभावी जावा देखें। यह बहुत अच्छा है, लेकिन यह भी उदास है कि सी # अभी भी इसका उपयोग करता है। – drozzy
@drozzy, (या इसे पढ़ने वाला कोई भी व्यक्ति) - क्या आपको याद है कि जे। ब्लोच ने इस विषय पर चर्चा की थी (मेरा मतलब पृष्ठ)? मेरे पास इस पुस्तक का दूसरा संस्करण है और मुझे "I" नामकरण सम्मेलन का कोई संदर्भ नहीं मिल रहा है। – greenoldman
@ ग्रीनोल्डमैन अच्छा बिंदु, वह वास्तव में यह नहीं कहता कि यह "बुरा" है, बस इसका जिक्र नहीं है। पी देखें 237-238 प्रभावी जावा 2। मेरी अति उत्साह के लिए खेद है। – drozzy