2011-05-11 17 views
5

मैं वर्तमान में मेरे कोड पुनर्रचना कर रहा हूँ पर आधारित होते हैं को लागू करने, ताकि सभी महत्वपूर्ण वर्गों (इकाई testability के लिए) एक इंटरफ़ेस को लागू। मैं एक कक्षा में आया जो आईसीओम्पेर्बल (गैर-टेम्पलेटेड) लागू करता है; कुछ ऐसा:एक अंतरफलक जिससे जेनरिक इंटरफ़ेस

public MyClass : IComparable 
{ 
    public int CompareTo(object obj) 
    { 
     MyClass cObj = obj as MyClass; 
     if (cObj == null) { throw new ArgumentException(); } 
     // etc. 
    } 
} 

मैं इसे इंटरफ़ेस करना चाहता हूं, और जेनेरिक का उपयोग कर रहा हूं; कुछ इस तरह:

public IMyClass : IComparable<IMyClass> 
{ 
    // Other methods here 
} 

public MyClass : IMyClass 
{ 
    public CompareTo<IMyClass>(IMyClass other) 
    { 
     ... 
    } 
    // Other methods here 
} 

लेकिन फिर, आदर्श, MyClassIComparable<MyClass> (और फिर MyClass की उपवर्गों को लागू करना चाहिए IComparable<MySubClass>) लागू करना चाहिए।

क्या आप दृष्टिकोण मैं वर्णित के बारे में सोच है:

यह सब कई सवाल पूछने के लिए? क्या इस रिफैक्टरिंग करने का कोई बेहतर तरीका है? क्या MyClass बनाने में कोई बात है IComparable<MyClass> भी लागू करें, या यह व्यर्थ है क्योंकि हम पहले ही IComparable<IMyClass> लागू कर चुके हैं? कोई भी प्रो-टिप्स या "सर्वश्रेष्ठ" -प्रैक्टिस मुझे अवगत कराया जा सकता है?

उत्तर

0

संक्षिप्त उत्तर: यह निर्भर करता है।

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

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

+0

मुझे यकीन है कि मैं अंगूठे का अपना नियम से सहमत नहीं हूँ - कारण मैं इस बाहर इंटरफ़ेस कर रहा हूँ ताकि मैं इकाई परीक्षण वर्गों है कि इसका इस्तेमाल कर सकते हैं। इसका मतलब है कि मैं इस वर्ग का नकल कर सकता हूं (हालांकि तर्कसंगत है कि इसका मतलब है कि मैं * अंगूठे के नियम से सहमत हूं, क्योंकि मैं इसे यूनिट परीक्षणों में कार्यान्वित कर रहा हूं)। – Smashery

+0

@Smashery: आपके उपयोग के मामले ने यह स्पष्ट नहीं किया। यह इंटरफेस का एक पूरी तरह से वैध उपयोग है जो "नियम का पालन करता है"। :-) –

2

यह वास्तव में भावना विभिन्न प्रकार है कि सभी एक दूसरे से तुलना के योग्य हैं की कई वस्तुओं के लिए कर रहा है? भाषा इसकी अनुमति देती है, लेकिन मैं 0 हाथों पर गिन सकता हूं कि मुझे कितनी बार इसका इस्तेमाल करना पड़ा।

मैं IClass का उपयोग IComparable के बिना करने की सलाह दूंगा, और केवल व्युत्पन्न कक्षाएं IComparable लागू करें।

पीएस मैं यूनिट टेस्टेबिलिटी के लिए इंटरफेस जोड़ने के खिलाफ भी हूं। यदि आपका प्रोग्राम डिज़ाइन फ़ैक्टरी पैटर्न के लिए इंटरफ़ेस-केवल युग्मन के साथ कॉल करता है, तो हर तरह से जटिलता के उस स्तर को कोड करें। लेकिन अपने परीक्षणों को आसान बनाने के लिए abuse the design नहीं करें; इसके बजाय मोल्स का उपयोग करें।

+0

मोल्स बहुत दिलचस्प लग रहा है। निश्चित रूप से इसमें देखेंगे; धन्यवाद! – Smashery

+0

0 से गिनने के लिए +1 ... :) –

संबंधित मुद्दे