2010-08-11 9 views
5

के रूप में पारित एक संशोधित एक नया ऑब्जेक्ट बनाम एक कोड समीक्षा के दौरान कोड के निम्नलिखित भाग में आया।पैरामीटर

मेरा अंतर्ज्ञान मुझे बता रहा है कि यह उचित ओओपी का पालन नहीं कर रहा है।

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

क्या मेरा समाधान बेहतर है? और यदि ऐसा है तो क्यों? विशेष रूप से दिए गए कोड उदाहरण (यदि कोई हो) में ओओपी सिद्धांत या मानकों को तोड़ दिया गया है?

public void someMethod() 
    { 
     ... 
     var someObject = new SomeObject(); 
     LoadSomeObject(reader,someObject); 
    } 

    private void LoadSomeObject(SqlDataReader reader, SomeObject someObject) 
    { 
     someObject.Id = reader.GetGuid(0); 
    } 
+0

ऐसा लगता है कि आप 'SqlDataReader' को भी म्यूट कर सकते हैं। –

उत्तर

1

मैं ओओ गुरु नहीं हूं, इसलिए नमक के अनाज के साथ इन्हें लें।

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

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

संपादित करें: आप कुछ ऑब्जेक्ट के निर्माता को भी पाठक पास कर सकते हैं।

+0

किसी विशेष कारण को यह russjudge के उत्तर पर 4 गुना अधिक अपवॉट के साथ स्वीकार किया गया था? – delnan

8

तरह से जब से तुम केवल someObject पर एक संपत्ति को संशोधित कर रहे कोड लिखा है के साथ गलत कुछ भी नहीं है।

हालांकि, यह LoadSomeObject के भीतर कुछ ऑब्जेक्ट बनाने और इसे वापस करने के लिए सही होगा।

इस बिंदु पर, दोनों विकल्प सही हैं।

0

किसी भी तरह से पूरी तरह से स्वीकार्य है लेकिन आपकी विशेष स्थिति के लिए सही निर्णय लेने के दौरान लौटे ऑब्जेक्ट के साथ आप क्या करना चाहते हैं इसके बारे में विचार। अपरिवर्तनीयता i.e प्रत्येक ऑपरेशन में एक नया उदाहरण बना रहा है यह है कि .NET में स्ट्रिंग कैसे प्रबंधित की जाती हैं।

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

0

यदि LoadSomeObject एक नया SomeObject वापस करने जा रहा है, तो आप भ्रम से बचने के लिए विधि नाम बदलना चाहेंगे। शायद NewAndLoadSomeObject पर?

0

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

मैं इस एक छोटे से बेहतर अभी भी लगता है, हालांकि (ज्यादातर मामलों में वैसे भी) लगता है:

public void someMethod() 
{ 
    ... 
    var someObject = new SomeObject(); 
    someObject.Load(reader); 
} 

और फिर स्पष्ट रूप से SomeObject कक्षा में, आप

public void Load(SqlDataReader reader) 
{ 
    this.Id = reader.GetGuid(0); 
} 

विचार करने के लिए है के लिए होता है स्थिर लोगों पर उदाहरण विधियों का पक्ष लें। ऑब्जेक्ट बनाने और उसके डेटा को पास करने के लिए परेशान क्यों करें जब आप ऑब्जेक्ट को अपने डेटा पर ही संचालित कर सकें?

1

सार्वभौमिक ओओ अवधारणा नहीं है, जो इस तरह के कोड के साथ विरोधाभासी है। लेकिन बाद में आप पाएंगे कि कुछ ऑब्जेक्ट उदाहरणों में हेरफेर करने के तरीके को इकट्ठा करना और समझना मुश्किल है यदि आप कुछ डिज़ाइन सिद्धांतों का पालन नहीं करेंगे। - कि अन्य वस्तुओं उत्परिवर्तित के लिए नहीं नया उदाहरण बना करने के लिए बनाया गया है और है

  • कार्यात्मक: स्टार्टर के लिए हो सकता है कि सबसे आसान तरीका है प्रक्रियाओं के दो मुख्य प्रकार अलग करने के लिए है।
  • मेथोडिक - जिसे इसके होस्ट होस्ट की स्थिति बदलने के लिए डिज़ाइन किया गया है।

तो अच्छा विचार यहाँ, आप को अलग करने के SomeObject हेरफेर तर्क चाहते हैं

public void loadFromReader(SqlDataReader reader) 

विधि और

सार्वजनिक SomeObject getValue()

साथ SomeObjectBuilder प्रकार बनाने के लिए है

संपत्ति