2010-07-15 18 views
10

मान लें कि मुझे Superstar नामक एक प्रकार मिला है। अब मैं एक ऐसा तरीका चाहता हूं जो कुछ काम करता है और Superstar ऑब्जेक्ट के कुछ गुणों को संपादित करता है।"संदर्भ द्वारा" वस्तुओं को संपादित करने के लिए अच्छा अभ्यास?

यहां दो तरीके हैं कि मैं इसे कैसे कार्यान्वित कर सकता हूं। मार्ग 1 होगा निम्नलिखित:

private Superstar editSuperstar(Superstar superstar){ 
    .... 
    superstar.setEdited(true); 
    return superstar; 
} 
... 
superstar = editSuperstar(superstar); 

और जिस तरह से 2 इस होगा:

private void editSuperstar(Superstar superstar){ 
    .... 
    superstar.setEdited(true); 
} 
... 
editSuperstar(superstar); 

कौन इन दो संभव तरीकों में से एक "सबसे अच्छा अभ्यास" माना जाता है? पहला, या दूसरा छद्म "संदर्भ द्वारा" एक?

उत्तर

6

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

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

+0

यह देर हो चुकी है, लेकिन दूसरी विधि सीधे 'सुपरस्टार' को संपादित नहीं करती है। यह 'सुपरस्टार' का एक स्थानीय संस्करण बनाता है और बाहरी वस्तु के किसी भी गुण को कभी भी नहीं बदलता है। – Jon

+1

@ जोन तुम क्यों कहते हो? यहां कुछ भी नहीं है जो उस दावे का समर्थन करता है, नहीं? – Riduidel

4

जब तक आप "बिल्डर" वर्ग नहीं बना रहे हैं, तब तक 2 तरीके का उपयोग करें जहां आप चेन इनवोकेशन का इरादा रखते हैं। पूर्व:

MyClass c = (new MyClassBuilder()).setX(blah).setY(blah).build(); 
+0

आपका उदाहरण काफी अलग है, बल्कि यह "शून्य" की बजाय - "शून्य" के बजाय - एक सेटर विधि से चेनिंग सेटर आमंत्रण की अनुमति देने के विचार को दर्शाता है ... – pgras

4

पहला रूप भ्रामक है। यह इंप्रेशन देता है कि एक वस्तु पारित की जा रही है, जिसे कॉपी किया गया है और प्रतिलिपि फिर बदल दी गई और लौटा दी गई।

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

2

यदि आप इसे इस तरह का उपयोग समस्या आप यहाँ पहली विधि के साथ है:

Superstar edited = editSuperstar(originalSuperstar); 

यह भी originalSuperstar जो मेरी राय में है, counterintuitive को संशोधित करेगा ...

इस प्रकार पसंद करते हैं दूसरा यदि आप पास ऑब्जेक्ट को संशोधित करते हैं या पहली बार यदि आप ऑब्जेक्ट की एक नई प्रतिलिपि वापस करते हैं।

इस अजीब उदाहरण आप बस सुपरस्टार वर्ग के लिए एक संपादन विधि जोड़ सकते हैं के लिए ...

1

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

तो यदि आप एक प्रतिलिपि नहीं करते हैं और पहले करते हैं तो पहले फॉर्म का उपयोग करें (और Superstar उस मामले में अपरिवर्तनीय बनाने के बारे में सोचें)।

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