2008-09-21 2 views
10

इंटरफ़ेस को इंटरफ़ेस करना संभव नहीं है? एक सिस्टम को डिजाइन करते समय, मैं इंटरफेस से शुरू करूंगा और इंटरफेस के साथ यूनिट परीक्षणों को प्रगतिशील रूप से लिखूंगा जब तक कि मेरे पास एक ऐसा पैटर्न न हो जो अच्छी तरह से काम करता है .. मैं कुछ ठोस वर्गों को लिखने के लिए आगे बढ़ूंगा और यूनिट परीक्षणों को इनके खिलाफ सेट कर दूंगा ...NET - क्या आप इंटरफ़ेस से अधिक हो सकते हैं, और जब आप

अब मैं ऐसे व्यक्ति हूं जो इंटरफेस से प्यार करते हैं, मैं आम तौर पर कोड को नियंत्रित करते समय केवल कभी भी गुजरने/वापस आने वाले प्राइमेटिव या इंटरफेस को समाप्त कर दूंगा .. अब तक मुझे यह आदर्श माना गया है, आप आसानी से अनुकूलित और वृद्धि कर सकते हैं आमतौर पर निर्भर प्रणाली को प्रभावित किए बिना एक प्रणाली।

मुझे स्पष्ट रूप से इंटरफेस का उपयोग करने के कारणों को बेचने की आवश्यकता नहीं है, लेकिन मुझे आश्चर्य है कि इसके ओवरबोर्ड को सब कुछ इंटरफ़ेस करने के लिए, ps। मैं नहीं की तरह पागल कुछ में के रूप में खाली इंटरफेस के बारे में बात कर रहा हूँ:

interface ISomethingProvider 
{ 
    ISomething Provide(ISomethingOptions options); 
} 

यह वास्तव में शीर्ष पर है:

interface IStringCollection : ICollection<string> 
{ 
} 

मैं की तरह कुछ और बात कर रहा हूँ? मेरा तर्क यह है कि किसी भी प्रकार को किसी बिंदु पर इंटरफेसिंग से प्राप्त हो सकता है .. और मेरे पास एकमात्र वास्तविक समस्या यह है कि मुझे सीखना है कि मुझे लगता है कि कक्षाओं को डिजाइन करने का एक बेहतर तरीका है, क्योंकि आपके पास डाफ्ट नहीं है बातचीत और 'हैक' चल रहा है।

अगर यह एक timebomb है बारे में आपकी राय प्यार करोगे, और आप बनाम नहीं इंटरफेस करने ..

ps- यह वास्तव में कैसे इंटरफेस लिखने के बारे में इतना नहीं है तय करें कि कब।

उत्तर

1

यह एक वास्तविक दर्द अंतिम कॉल स्टैक बाहर काम करने से पहले आप डीबगर के साथ कदम अगर आप इंटरफेस हर जगह है हो सकता है। मैं केवल जब इंटरफेस पसंद करते हैं:

  1. आप टीम के सदस्यों की जरूरत है, जो करना चाहिए पर सहमत होने का क्या इससे पहले कि वे कोडिंग शुरू - एक अंतरफलक तो सीमा बिल्कुल
  2. दस्तावेजों जब आप वास्तव में समस्या का समाधान के लिए एक इंटरफेस की जरूरत है है, तो कम से कम दो कार्यान्वयन कि एक दूसरे
  3. विस्तार नहीं आप मामले की उम्मीद 2
1

मुझे लगता है कि इंटरफेस विशेष रूप से अन्य लोगों के लिए डिजाइन पेचीदा हो, अपना सामान पर cowork करने के लिए। मुझे गलत मत समझो, कई सामानों के लिए इंटरफेस बहुत अच्छे हैं, लेकिन अधिकतर यदि आप एक सामान्य इंटरफ़ेस साझा करने के लिए दो या दो से अधिक कक्षाएं चाहते हैं। संयम और के साथ उपयोग जहां आवश्यक -

आप स्थिति है जहाँ आप अचानक एक अंतरफलक की जरूरत है अपने आप को मिल जाए, Resharper जैसे उपकरणों के साथ रिफैक्टरिंग एक हवा :)

4

कुछ और के साथ के रूप में है। खुद से पूछें "क्या आपको इसकी आवश्यकता होगी?"।

5

इंटरफेस व्यवहार के लिए अनुबंध का वर्णन करते हैं। यदि आपको व्यवहार पैटर्न के अनुसार ऑब्जेक्ट्स के कुछ सेट को संबोधित करने की आवश्यकता है, तो इंटरफेस उपयोगी हैं, यदि आप ऑब्जेक्ट्स की संरचना का वर्णन कर रहे हैं तो इतना नहीं।मुझे लगता है कि आपको उनका उपयोग करने का एक अच्छा कारण होना चाहिए, जैसे कारखाने का उपयोग करना जो व्यवहारिक रूप से संबंधित वस्तुओं को बनाता है या पुस्तकालय के हिस्से के लिए व्यवहार अनुबंध स्थापित करता है। इंटरफेस का उपयोग उद्देश्य से पुस्तकालय को पढ़ने/समझने/बनाए रखने में मुश्किल हो सकता है।

1

यह पूरी तरह से .NET बात नहीं है, जावा में एक ही समस्या होती है।

जब तक कि यह पूरी तरह से स्पष्ट आवश्यकता न हो, मैं इंटरफेस का उपयोग न करने के लिए वोट देता हूं और आवश्यकता स्पष्ट होने पर बस प्रतिक्रिया करता हूं।

व्यावहारिक दृष्टिकोण केवल सरलतम चीज करने के लिए कहता है जो संभवतः काम कर सकता है, और आर्किटेक्चर अंतरिक्ष विज्ञान में पकड़ा नहीं जाता है।

5

संक्षेप में एक परियोजना को इंटरफ़ेस से अधिक करना संभव है। ध्यान दें जब स्थिति वास्तव में एक सार बेस क्लास और एक इंटरफ़ेस की मांग करती है, जबकि वे दोनों समान हैं, See Here दोनों का उपयोग करने के लिए अलग-अलग फायदे हैं। आम तौर पर मैंने देखा है कि लोग इंटरफेस का उपयोग करते हैं जब उन्हें वास्तव में सार बेस क्लासेस का उपयोग करना चाहिए। एक ओओ परिप्रेक्ष्य इंटरफेस से सामान्य व्यवहार की सूची के लिए इस्तेमाल किया जाना चाहिए जो काफी अलग वर्गों का विस्तार कर सकता है। उदाहरण के लिए आपके पास Move() नामक विधि के साथ एक IMV इंटरफ़ेस हो सकता है। अब कल्पना करें कि आपके पास एक हवाई जहाज, कार, व्यक्ति और कीट वर्ग है। हवाई जहाज और कार एक अमूर्त वाहन वर्ग से उत्तराधिकारी हो सकती है लेकिन अभी भी इमेव का उपयोग करने की आवश्यकता है और इसलिए कीट और व्यक्ति भी होगा, लेकिन वे सभी अलग-अलग कदम उठाएंगे। मैंने देखा है, मेरे स्वयं को शामिल किया गया है, लोग इंटरफेस का उपयोग "समूह" वर्गों में एक साथ करते हैं जब वास्तव में बेस क्लास द्वारा संभाला जाना चाहिए।

+1

हाँ, यदि आप अपने आप को दो वर्गों पर एक इंटरफेस को लागू करने के लिए अनिवार्य रूप से एक ही विधि लिखते हैं, तो आपको एक सार आधार वर्ग की आवश्यकता है। –

1

मैं परीक्षण उद्देश्यों के लिए बहुत से इंटरफेस का उपयोग नहीं करता हूं। जब तक मैं उस बिंदु पर नहीं हूं, जहां तक ​​मैंने अन्य वस्तुओं और परीक्षणों का निर्माण किया है, जो अंततः व्यायाम करेंगे जो मुझे चाहिए था, मैं बिल्डिंग और परीक्षण करते समय निजी मूल्य सार्वजनिक और/या अनदेखा कक्षाओं और/या अस्थायी तरीकों का उपयोग करूंगा। Sometmes बट में दर्द में अपने दर्द को रैक करने के लिए दर्द है, लेकिन जब आप कुछ बदलना भूल जाते हैं तो आपके परीक्षण आपको बताएंगे।

3

अति-इंटरफ़ेस करना संभव है। जिस नियम पर मैं काम करता हूं वह यह है कि यदि आपके आवेदन में कोई इंटरफ़ेस है, तो आपको कम से कम दो कक्षाएं लागू करने की आवश्यकता है (या उचित उम्मीद है कि आप निकट भविष्य में कक्षाओं को कार्यान्वित करना जोड़ देंगे)।

यदि आपको परीक्षण के लिए नकली वस्तुओं को बनाने की आवश्यकता है, तो नकली वर्ग और वास्तविक वर्ग को एक सामान्य इंटरफेस लागू करने के लिए एक इंटरफ़ेस का उपयोग करने का एक वैध कारण है।

मैं आपके आवेदन में सबकुछ के लिए इंटरफ़ेस का उपयोग करके स्वचालित रूप से अनुशंसा नहीं करता हूं, विशेष रूप से क्योंकि यदि आवश्यक हो तो एकल वर्ग को आमतौर पर इंटरफ़ेस में आसानी से दोबारा क्रियान्वित किया जा सकता है।

+1

आधुनिक रिफैक्टरिंग टूल की सुंदरता यह है कि आपको भविष्य में एक का उपयोग करने के लिए लचीलापन रखने के लिए इंटरफ़ेस का उपयोग शुरू करने की आवश्यकता नहीं है। –

2

जब भी मैं देख रहा हूँ या कोई कहते हैं कि इस

इंटरफेस व्यवहार

के लिए एक अनुबंध का वर्णन मैं जानता हूँ कि मैं कोई है जो इंटरफेस नहीं समझती पाया है सुना है।

इंटरफेस ऐसा नहीं कर सकता। यह असंभव है। इंटरफेस व्यवहार, बाध्यता, या किसी भी तरह से व्यवहार को बाधित न करें

इंटरफेस इंटरफ़ेस, इसलिए नाम के लिए अनुबंध का वर्णन करता है। उनके पास व्यवहार नहीं है।

आप उम्मीद कर सकते हैं कि जिन नामों को आप अपने इंटरफ़ेस के तरीके देते हैं, वे इसे कार्यान्वित करने के लिए एक आवश्यक व्यवहार का संकेत देंगे, लेकिन ऐसा करने की कोई आवश्यकता नहीं है। कोई व्यवहारिक अनुबंध नहीं है, न ही कभी भी एक हो सकता है।

यदि आपको किसी निश्चित प्रकार के व्यवहार की आवश्यकता है तो आपको इसे लागू करने के लिए कक्षाओं का उपयोग करना होगा (उदाहरण के लिए टेम्पलेट पैटर्न के साथ) - यही वह जगह है जहां सभी व्यवहार हैं।

अंतरफलक नियमित रूप से डिज़ाइन निर्माण के रूप में दुरुपयोग किए जाते हैं, और कारणों में से एक इस झूठ में व्यापक विश्वास के कारण है।

+0

मैं तर्क दूंगा कि _documented_ इंटरफ़ेस व्यवहार के लिए अनुबंध का वर्णन कर सकता है। आप अनुबंध को लागू किए बिना अनुबंध का वर्णन कर सकते हैं; डेवलपर को अभी भी दस्तावेज़ीकरण का पालन करने की ज़िम्मेदारी है। –