2012-12-19 14 views
8

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

public interface MyInterface 
{ 
    IData GetData(string p1, char p2, double p3); 
} 

हाल ही में, हम इस इंटरफेस (मैं जानता हूँ कि मैं निर्भर कोड को तोड़ने नहीं करना चाहिए, लेकिन सच है कि हम किसी भी 3 पार्टियों अभी तक इस इंटरफेस को लागू करने की जरूरत नहीं है है संशोधित करने के लिए तय कर लिया है, तो हम एक मौका इस इंटरफ़ेस को सही तरीके से कार्यान्वित करने के लिए "डू-ओवर" के लिए)।

हमारे सॉफ़्टवेयर के लिए सही ढंग से काम करने के लिए हमें इस इंटरफ़ेस में 2 और पैरामीटर जोड़ने की आवश्यकता है। दो तरीके हम की सोच रहे हैं सिर्फ इस तरह हस्ताक्षर करने के लिए उन्हें जोड़ रहे हैं:

public interface MyInterface 
{ 
    IData GetData(string p1, char p2, double p3, bool p4, DateTime p5); 
} 

या द्वारा इस

public class MyParameters 
{ 
    public bool p4 { get; set; } 
    public DateTime p5 { get; set; } 
} 

की तरह एक पैरामीटर वस्तु बनाने और उन्हें इतना की तरह विधि के अंत में जोड़ने :

public interface MyInterface 
{ 
    IData GetData(string p1, char p2, double p3, MyParameters p4); 
} 

मैं मार्गदर्शन के कुछ प्रकार के लिए देख रहा हूँ जो रास्ते में "सबसे" सही आगे बढ़ने के लिए रास्ता है। मैं दोनों श्रेणियों में पेशेवरों और विपक्ष को देख सकता हूं, लेकिन मैं नहीं चाहता कि मेरी पूर्वाग्रह मुझे गलत रास्ते से आगे ले जाएं।

अपने मुख्य चिंताओं में से कुछ हैं:

  • सॉफ्टवेयर के तानाना - मैं यूजर इंटरफेस को लागू करने
  • अनुरक्षणीयता से बातें मैं की अभी तक नहीं सोचा ऐसा करने में सक्षम होना चाहता हूँ - आदर्श रूप में, मैं कोड है कि GetData() फिर से कॉल
  • स्वच्छ एपीआई के लिए जिम्मेदार है स्पर्श करने की आवश्यकता नहीं करना चाहते हैं - एक 3 पार्टी डेवलपर चापलूसी मैं समाधान मैं पर पहुंचने बनाने के लिए नहीं करना चाहती

मुझे यह भी पता नहीं है कि इस मुद्दे के लिए मार्गदर्शन प्राप्त करने के लिए ऑनलाइन पूछना क्या प्रश्न है। मुझे एहसास है कि जवाब "यह निर्भर करता है" (चीजों पर कैसे संबंधित पी 1-पी 5 गेटडाटा() फ़ंक्शन के उद्देश्य से संबंधित हैं), लेकिन क्या कोई मुझे प्रश्नों की एक सूची में इंगित कर सकता है, मुझे मूल्यांकन करने में मेरी सहायता करने के लिए मुझे पूछना चाहिए क्या एक समाधान दूसरे की तुलना में बेहतर है?

संबंधित: Post 1 Post 2

उत्तर

2

मुझे इस का जवाब देने की कोशिश करते हैं। के अपने विकल्पों का मूल्यांकन करते हैं:

1), तो नीचे इंटरफ़ेस

public interface MyInterface 
{ 
    IData GetData(string p1, char p2, double p3); 
} 

टूट गया है:

क) और सब पर नहीं किया जाना चाहिए, तो आप इसे फिर से लिखने के लिए कार्यान्वयन करने के लिए मजबूर करना चाहिए। तो विधि परिभाषा बदलें।

public interface MyInterface 
{ 
    IData GetData(something else); 
} 

ख) लेकिन आप केवल उन नई परिभाषा का उपयोग करने के लिए प्रोत्साहित करते हैं की जरूरत है, तो आप एक नया अधिभार उन्हें यह बताने पहले एक अप्रचलित है बना सकते हैं।

public interface MyInterface 
{ 
    //xml to tell them this is deprecated. 
    IData GetData(string p1, char p2, double p3); 
    IData GetData(string p1, char p2, double p3, and whatever); 
} 

अपने नई परिभाषा के बारे में, वहाँ है कि किसी को मॉडल के बारे में जानने के बिना दे सकते हैं कोई भी रोक समाधान है, लेकिन आप अपने आप से पूछना,

मैं) "मापदंडों खुद को एक इकाई का प्रतिनिधित्व कर सकते हैं कि संयुक्त ? यह असली दुनिया में कुछ मतलब यह है अपने मानकों में से एक इकाई है? "यदि हां, तो यह बहुत बनाते हैं। यदि नहीं, तो मत करो। मुझे लगता है कि जब आप इस प्रकार की दुविधा में हैं तो आपको ऐसे सार स्तरों में सोचने पर भरोसा करना चाहिए। मुझे यकीन है कि क्या bool p4 और DateTime p5 क्लब में बात है नहीं कर रहा हूँ। आपको उन मापदंडों को पकड़ना चाहिए जो स्वयं वास्तविक जीवन में कुछ प्रस्तुत करते हैं। यदि उनमें से कोई संयोजन समझ में नहीं आता है, तो इसे इस तरह छोड़ दें। सोचने के इस तरह के तार्किक तरीके से इस तरह के clubbing छोड़ने में आपको और अधिक सफलता मिलेगी। आपको याद है, आप अन्य प्रोग्रामर को अपनी परिभाषा छोड़ रहे हैं, और अपनी नौकरी को कम करने के लिए आपकी विधि हस्ताक्षर बहुत तार्किक होना चाहिए।

द्वितीय) वर्ग अधिक चीजों के रूप में केवल डेटा का एक सेट धारण करने का विरोध कर सकता हूँ? कक्षा यहां विकल्प होना चाहिए।

III) क्या मुझे केवल कक्षा परिभाषा को नियंत्रित करने की आवश्यकता है और इसे के कार्यान्वयन की आवश्यकता नहीं है? उस स्थिति में बस अपने इनपुट के सार्वजनिक इंटरफेस को परिभाषित करें, और ग्राहक को कार्यान्वयन छोड़ दें।

चतुर्थ) मेरी इंटरफ़ेस करने के लिए भविष्य संशोधनों मौजूदा कार्यान्वयन को तोड़ने नहीं करना चाहिए? ओवरलोडिंग जाने का आपका तरीका है।

कहते हैं कि तुम पास दो विकल्प हैं, हस्ताक्षर बाहर चपटा, या क्लब के लिए छोड़ देता है।

1) क्लब के बिना:

क) कम कोड, एक और परत की कमी।

ख) जनता के लिए एक और वर्ग को बेनकाब करने की कोई ज़रूरत नहीं।

2) क्लब के साथ:

क) मॉडल का एक बेहतर समझ समारोह में जाने के लिए देता है - अपने इरादे स्पष्ट है।

बी) यदि आप नवगठित वर्ग के निर्माण के लिए वैकल्पिक विवरण जोड़ने की ज़रूरत है तो भविष्य में स्केल करना आसान है। कहते हैं कि तुम एक वर्ग

class Input { 
    string p1; char p2; double p3; 

    public Input(string p1, char p2, double p3){ 
    } 
} 

और इंटरफ़ेस

public interface MyInterface 
{ 
    IData GetData(Input p1); 
} 

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

class Input { 
    string p1; char p2; double p3; bool p4; DateTime p5; 

    public Input(string p1, char p2, double p3){ 
    } 
} 

इंटरफ़ेस अभी भी वही हो सकता है। जैसा कि मैंने कहा था कि इस तरह के कुछ भी प्राप्त करने के लिए प्रेरणा आपके मॉडल पर दुखी है। संक्षेप में, यदि किसी समूह का अर्थ कुछ हो सकता है, तो इसे कक्षा या इंटरफ़ेस बनाएं (तर्क के आधार पर कौन नियंत्रित करेगा)।

2

क्यों सभी रास्ते जाने नहीं:

public Interface IParameters 
{ 
    string p1 {get; set;} 
    char p2 {get; set;} 
    double p3 {get; set;} 
    bool p4 { get; set; } 
    DateTime p5 { get; set; } 
} 

public interface MyInterface 
{ 
    IData GetData(IParameters p); 
} 
+0

एक अच्छा विचार लगता पैरामीटर प्रकार के लिए एक इंटरफेस है, लेकिन विचार है कि इंटरफेस versioned नहीं किया जा सकता है, अगर एपीआई तो कोई भी मौजूदा तोड़ने के बिना पैरामीटर प्रकार में जोड़ने के साथ साथ कार्यक्षमता कर सकते हैं (जैसे कि एक और पैरामीटर जोड़ने) फैल जाएगा करने के लिए कोड। –

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