2008-09-16 9 views
19

मुझे यह कहकर शुरू करना है कि मैं इस दृष्टिकोण की वकालत नहीं करता हूं, लेकिन मैंने हाल ही में इसे देखा और मैं सोच रहा था कि इसके लिए कोई नाम था या नहीं, तो मैं दोषी पार्टी को इंगित करने के लिए उपयोग कर सकता था। तो यहाँ जाता है।क्या इस विरोधी-पैटर्न/कोड गंध के लिए कोई नाम है?

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

class FunctionResult<T> 
{ 
    public T payload; 
    public int result; 
} 

और फिर इस तरह अपने कार्यों की घोषणा:

इस पैटर्न पर
FunctionResult<string> MyFunction() 
{ 
    FunctionResult<string> result; 
    //... 

    return result; 
} 

एक बदलाव एक स्ट्रिंग के बजाय त्रुटि कोड के लिए एक enum उपयोग करने के लिए है । अब, मेरे प्रश्न पर वापस: क्या इसके लिए कोई नाम है, और यदि ऐसा है तो यह क्या है?

+1

"कोई भी जो बेवकूफ नहीं है वह एक हथौड़ा के साथ मेरी अंगुलियों को तोड़ने जा रहा है जब वे इसे" पैटर्न देखते हैं। लेकिन यह सभी एंटीपेटर्न पर बहुत अधिक लागू होता है। – Will

+1

यदि यह एक विरोधी पैटर्न है, तो उन भाषाओं के लिए सिफारिश क्या है जो सीधे अपवादों का समर्थन नहीं करते हैं (मैं वीबी/वीबीए के बारे में सोच रहा हूं)। –

+1

यदि वे अपवादों का समर्थन नहीं करते हैं, तो वे शायद टेम्पलेट्स/जेनेरिक का समर्थन नहीं करते हैं। –

उत्तर

17

मैं मानता हूँ चाहते हैं कि इस विशेष रूप से एक antipattern नहीं है निर्वासित। यह उपयोग के आधार पर एक गंध हो सकता है। ऐसे कारण हैं जो वास्तव में अपवादों का उपयोग नहीं करना चाहते हैं (उदाहरण के लिए लौटने वाली त्रुटियां स्टार्टर्स के लिए 'असाधारण' नहीं हैं)।

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

यह कोड आवश्यक रूप से एक त्रुटि नहीं हो सकता है: एक HTTP प्रतिक्रिया पर विचार करें, जिसमें प्रतिक्रिया के शरीर के साथ एक स्टेटस कोड सहित कई अलग-अलग डेटा होते हैं।

+0

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

1

"यह तय नहीं कर सकता कि यह एक त्रुटि है या नहीं" पैटर्न के बारे में। ऐसा लगता है कि अगर आपको वास्तव में अपवाद था लेकिन आंशिक परिणाम वापस करना चाहता था, तो आप अपवाद में परिणाम लपेटेंगे।

4

मुझे यकीन नहीं है कि यह एक विरोधी पैटर्न है। मैंने आम तौर पर इसे प्रदर्शन कारणों के लिए अपवादों के बजाय उपयोग किया है, या शायद यह तथ्य बनाने के लिए कि विधि अधिक स्पष्ट हो सकती है। मेरे लिए, यह एक विरोधी पैटर्न के बजाय एक व्यक्तिगत वरीयता प्रतीत होता है।

11
+0

मैं सामान्य रूप से त्रुटि कोड की तुलना में टेम्पलेट में त्रुटि कोड को जोड़ने के बारे में और सोच रहा था। अंतर्दृष्टि और पुस्तकालय ज्ञान के लिए –

10

खैर, यह नहीं एक antipattern है। सी ++ मानक पुस्तकालय इस सुविधा का उपयोग करता है और .NET भी .NET ढांचे में एक विशेष FunctionResult कक्षा प्रदान करता है। इसे Nullable कहा जाता है। हां, यह फ़ंक्शन परिणामों तक ही सीमित नहीं है लेकिन इसका उपयोग ऐसे मामलों के लिए किया जा सकता है और वास्तव में यहां बहुत उपयोगी है। यदि .NET 1.0 में पहले से ही Nullable वर्ग था, तो यह निश्चित रूप से पैरामीटर के बजाय NumberType.TryParse विधियों के लिए उपयोग किया जाएगा।

+0

+1 – Cruachan

2

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

मैंने अंततः अपने मैकबुक पर सेमफोर कोड डीबग करने का प्रयास करने में कई घंटे बिताए, इससे पहले कि मुझे पता चला कि sem_init ओएसएक्स पर काम नहीं करता है! यह बिना त्रुटि के संकलित और किसी भी त्रुटि के बिना भाग गया - फिर भी semaphore काम नहीं किया था और मैं समझ नहीं पाया क्यों। मैं उन लोगों को दयनीय करता हूं जो ओएसएक्स को POSIX semaphores का उपयोग करने वाले एप्लिकेशन को पोर्ट करते हैं और संसाधन विवाद के मुद्दों से निपटना चाहिए जो पहले ही डीबग किए गए हैं।

6

मैं आमतौर पर पेलोड को (कॉन्स्ट नहीं) संदर्भ और त्रुटि कोड के रूप में त्रुटि कोड के रूप में पास करता हूं।

मैं एक गेम डेवलपर हूँ, हम अपवाद

1

यदि आप अपवादों का उपयोग नहीं करना चाहते हैं, तो ऐसा करने का सबसे साफ तरीका यह है कि फ़ंक्शन त्रुटि/सफलता कोड वापस कर लेता है और परिणाम के साथ भरने वाला संदर्भ या सूचक तर्क लेता है।

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

1

आप अपने विधि कभी कभी विफल, लेकिन वह असाधारण विचार नहीं करते आशा करते हैं, मैं इस पद्धति के रूप में .नेट फ्रेमवर्क में इस्तेमाल पसंद करते हैं:

bool TryMyFunction(out FunctionResult result){  

    //...  
    result = new FunctionResult(); 
} 
5

कोनराड सही है, सी # सब दोहरी वापसी मान का उपयोग समय। लेकिन मैं कोशिश करता हूं कि TryParse, Dictionary.TryGetValue, आदि सी # में विधियों की तरह।

int value; 
if (int.TryParse("123", out value)) { 
    // use value 
} 

int? value = int.TryParse("123"); 
if (value != null) { 
    // use value 
} 

के बजाय

... ज्यादातर क्योंकि Nullable पैटर्न गैर मूल्य वापसी प्रकारों (जैसे, वर्ग उदाहरण) के पैमाने पर नहीं है। यह Dictionary.TryGetValue() के साथ काम नहीं करेगा। और TryGetValue एक KeyNotFoundException (डीबगर में लगातार "पहला मौका अपवाद" नहीं है, तर्कसंगत रूप से अधिक कुशल), जावा की प्रैक्टिस() वापस नल() यदि शून्य मानों की अपेक्षा की जाती है) से बेहतर है, और इससे अधिक कुशल कॉल कंटेनके() पहले कॉल करें।

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

("स्ट्रिंग" प्रकार छोटे अक्षरों में किया जा रहा है के अलावा जावा हो सकता है। निश्चित रूप से जावा में आप दोहरी वापसी मूल्यों का अनुकरण करने के एक वर्ग का उपयोग करने के लिए है।)

+0

ठीक है, गैर-मान प्रकारों में पहले से ही 'शून्य' मान हैं। 'Nullable' मूल रूप से मूल्य प्रकारों के लिए इसे दोहराने का प्रयास था। बेशक, जैसे ही 'शून्य' स्वीकार्य मान है, यह विधि विफल हो जाएगी। –

3

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

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

0

विरोधी पैटर्न पद की रक्षा करने के लिए इस कोड में कुछ तरीकों से किया जा रहा करने के लिए खुद को उधार देता है:

  1. वस्तु एक्स = myfunction() पेलोड; (वापसी परिणाम को अनदेखा करना - बहुत बुरा)
  2. int कोड = MyFunction() परिणाम; (पेलोड को फेंकना - ठीक है अगर यह इच्छित उपयोग है।)
  3. फ़ंक्शनरसल्ट x = MyFunction(); // ... (अतिरिक्त FunctionResult वस्तुओं और अतिरिक्त कोड का एक समूह उन्हें हर जगह की जांच करने के)

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

यदि आप अभी भी इस मूल्यांकन से असहमत हैं, तो इस उत्तर को अस्वीकार करें (पूरा प्रश्न नहीं)। यदि आपको लगता है कि यह एक विरोधी पैटर्न है, तो इसे ऊपर उठाएं। हम इस जवाब का उपयोग यह देखने के लिए करेंगे कि समुदाय क्या सोचता है।

+0

मैं परिणाम लौटने वाले फ़ंक्शन के साथ, पेलोड के लिए एक बाहर पैरा, TryParse जैसे कुछ पसंद करूंगा। – Meff

1

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

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