2012-09-04 13 views
11
दौरान नए पैरामीटर नाम का चयन करने की अनुमति

अगर यह एक मूर्खतापूर्ण सवाल है, लेकिन मैं सिर्फ इस पर ध्यान सुनिश्चित नहीं हैं कि: '। MaxRecords'इंटरफ़ेस परिभाषा में पैरामीटर नाम क्यों आवश्यक हैं? मैं कार्यान्वयन

public interface IActivityDao : IDao<Activity> 
{ 
    IList<Activity> GetAllSinceSequence(long sequence, int count); 
} 

public class ActivityDao : AbstractNHibernateDao<Core.Domain.Activity>, IActivityDao 
{   
    public IList<Activity> GetAllSinceSequence(long sequence, int maxRecords) 
    { 

    } 
} 

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

मैंने नाम बदलने से पहले थोड़ा सा खेला और कुछ दिलचस्प देखा। मैं के रूप में मेरे इंटरफेस घोषित करने के लिए अनुमति नहीं कर रहा हूँ:

public interface IActivityDao : IDao<Activity> 
{ 
    IList<Activity> GetAllSinceSequence(long, int); 
} 

यह सिर्फ संकलक सी # symantics के खिलाफ ज्यादा सुरक्षा की भावना है? इंटरफ़ेस की विधि में पैरामीटर नाम कोड को और अधिक पठनीय बनाने के अलावा अन्य उद्देश्य क्या करते हैं? ऐसा लगता है कि अगर पैरामीटर नाम कार्यान्वयन पर मजबूर नहीं होते हैं तो यह अस्पष्टता को आमंत्रित करता है।

उत्तर

19

पैरामीटर नाम कार्यान्वयन की स्पष्टता और संदर्भ के लिए इंटरफ़ेस घोषणा में आवश्यक हैं। यदि कोई व्यक्ति आपके इंटरफ़ेस का उपयोग कर रहा था, तो विधि पैरामीटर के नाम स्वयं दस्तावेज़िंग के लिए हैं, इसलिए इंटरफ़ेस का उपभोक्ता समझता है कि विधि को क्या पास करना है (उदाहरण के लिए इंटेलिसेन्स के माध्यम से विधि विवरण को देखते समय)

और हाँ, कब आप इंटरफ़ेस को कार्यान्वित करते हैं जिसे आप जो भी पैरामीटर चाहते हैं उसका नाम दे सकते हैं।

+0

आप अधिक अपवर्तनीय हैं। आपके पास अब तक का सबसे अच्छा जवाब है। आपने ओपी के सवाल का संक्षेप में जवाब दिया। – Enigmativity

+2

ठीक है, तरह। उत्तर, स्पष्ट होने पर, वास्तव में मेरी पोस्ट की अंतिम वाक्य को संबोधित नहीं करता है। इस बात की कोई गारंटी क्यों नहीं है कि कार्यान्वयन के दौरान पैरामीटर का नाम दिया जाएगा? यदि एकमात्र इरादा स्वयं दस्तावेज करना और स्पष्ट होना है - तो उस स्पष्टता को कार्यान्वयन के लिए क्यों नहीं लाया जाए? जब मैं वास्तव में 'maxResults' की अपेक्षा करता हूं तो मैं गलती से 'गिनती' स्वीकार करने के रूप में अपनी विधि का विज्ञापन नहीं करना चाहता हूं। –

+3

क्योंकि आप कार्यान्वयन स्तर पर अधिक विशिष्ट आत्म-दस्तावेज़ीकरण चाहते हैं। मान लें कि आपने एक विधि निष्पादन (int operand1, int operand2) के साथ एक IBinaryMathOperation इंटरफ़ेस बनाया है। फिर आपने इंटरफेस को लागू करने वाला एक एडऑपरेशन क्लास लागू किया। एक ऐड विधि में "ऑपरेंड" को विशेष रूप से "जोड़ों" के रूप में जाना जाता है, और आप उन्हें निष्पादित करना चाहते हैं कि निष्पादन() के विशिष्ट कार्यान्वयन में। – KeithS

2

मुझे लगता है कि यह नामित पैरामीटर विशेषता सी # में है। यानी, आप बस नहीं डिफ़ॉल्ट क्रम में नाम से पैरामीटर निर्दिष्ट करने के लिए, सक्षम होना चाहिए:

IActivityDao dao; 
dao.GetAllSinceSequence(count: 1, sequence: 2); 

बेशक, पैरामीटर नाम अलग हो सकता है अगर वस्तु अपने उदाहरण के रूप में कास्ट किया गया है।

var concreteDao = (ActivityDao) dao; 
concreteDao.GetAllSinceSequence(maxRecords: 1, sequence: 2); 
+2

सिवाय इसके कि फीचर पोस्ट-डेट्स एक दशक से अधिक इंटरफेस करते हैं। –

+0

@ किर्कवॉल हा ... अच्छा बिंदु। – McGarnagle

2

मुझे आपसे यह पूछने दो, क्या नेट फ्रेमवर्क में कहीं और है जो आपको पैरामीटर नामों के बिना एक विधि हस्ताक्षर परिभाषित करने की अनुमति देता है?

दिन के अंत में सभी चीजें संभव हैं लेकिन ज्यादातर चीजें एक कारण के लिए हैं, इस मामले में मैं कल्पना करूंगा कि यह ढांचे और कंपाइलर डिज़ाइन की एक सीमा है, और क्या इससे वाकई कोई फर्क पड़ता है?

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

+0

+1 –

1

सी # और वीबी समर्थन named and option arguments to methods जैसी कई भाषाएं। इंटरफ़ेस में तर्क नामों के बिना, नाम और वैकल्पिक तर्कों का उपयोग करना संभव नहीं होगा। तर्कों का नामकरण पाठक को इंटरफेस के इरादे और कार्य को समझने में भी मदद करता है।

8

इतिहास। यह वापस .NET के शुरुआती दिनों में जाता है, जब COM ने दुनिया पर शासन किया था। COM के साथ इंटरऑप करने में सक्षम होने के कारण बहुत महत्वपूर्ण है, फिर भी कोई भी प्रोग्रामिंग की पूरी तरह से नई शैली को अपनाने के लिए सबकुछ दूर नहीं फेंकता है।

जो COM इंटरऑप को सामान्य रूप से .NET में दृढ़ता से समर्थित करता है। साथ ही इंटरफ़ेस विधियों के लिए तर्क नाम देने की आवश्यकता के साथ, पुस्तकालयों को टाइप करने की आवश्यकता होती है।

दिलचस्प कोने का मामला हमेशा सी ++/सीएलआई भाषा है।इसने कई सी ++ सिंटैक्स नियमों को अपनाया, जिसमें घोषणाओं में पैरामीटर नामों को छोड़ने की क्षमता भी शामिल है। दूसरे शब्दों में, यह कानूनी है: के रूप में IntelliSense द्वारा स्वतः जेनरेट की, यदि आप एक सी # वर्ग में इंटरफ़ेस को लागू

HRESULT bar(
        [in] long p1, 
        [in] long p2, 
        [in] double p3); 

बहुत समान परिणाम:

public interface class IFoo 
    { 
     void bar(int, long, double); 
    }; 

प्रकार लायब्रेरी निर्यातक इस घोषणा उत्पन्न

class FooImpl : cpptemp36.IFoo { 
    public void foo(int __p1, int __p2, double __p3) { 
     throw new NotImplementedException(); 
    } 
} 

इससे कोई भी खुश नहीं होता है।

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