मैं अपने दोस्त के साथ इस बात पर थोड़ी बहस कर रहा हूं कि क्या ये दोनों प्रथाएं एक ही सिक्के के दो पहलू हैं, या क्या वास्तव में बेहतर है।
हमारे पास एक फ़ंक्शन है जो एक पैरामीटर लेता है, इसका एक सदस्य भरता है, और फिर इसे वापस करता है:
Item predictPrice(Item item)
मेरा मानना है कि जैसा कि यह उसी वस्तु पर काम करता है जिसे पारित किया जाता है, आइटम को वापस करने के लिए कोई बिंदु नहीं है। वास्तव में, अगर कुछ भी, फोन करने वाले के दृष्टिकोण से, यह मायने रखता है क्योंकि आप उम्मीद कर सकते हैं कि यह एक नया आइटम वापस कर देगा जो यह नहीं करता है।
वह दावा करता है कि इससे कोई फर्क नहीं पड़ता है, और इससे कोई फर्क नहीं पड़ता कि क्या उसने एक नया आइटम बनाया और वापस लौटा। मैं निम्नलिखित कारणों से बहुत असहमत हूं:
यदि आपके पास (या पॉइंटर्स या जो भी) आइटम पास के कई संदर्भ हैं, तो यह एक नई वस्तु आवंटित करता है और इसे वापस करना भौतिक महत्व का है क्योंकि ये संदर्भ गलत होंगे।
गैर-मेमोरी प्रबंधित भाषाओं में, एक नया उदाहरण आवंटित करने वाला फ़ंक्शन मेमोरी के स्वामित्व का दावा करता है, और इस प्रकार हमें एक सफाई पद्धति लागू करनी होगी जिसे कुछ बिंदु पर कहा जाता है।
ढेर पर आवंटन संभावित रूप से महंगा है, और इसलिए यह महत्वपूर्ण है कि क्या यह कहा जाता है।
इसलिए, मेरा मानना है कि यह एक विधि हस्ताक्षर के माध्यम से देखने में सक्षम होना बहुत महत्वपूर्ण है कि क्या यह एक वस्तु को संशोधित करता है, या एक नया आवंटित करता है। परिणामस्वरूप, मेरा मानना है कि चूंकि फ़ंक्शन केवल पास की गई वस्तु को संशोधित करता है, हस्ताक्षर होना चाहिए:
void predictPrice(Item item)
हर कोडबेस (कोड सी और सी ++ कोडबेस में, जावा नहीं है जो भाषा हम काम कर रहे हैं) मैंने साथ काम किया है, उपरोक्त शैली का अनिवार्य रूप से पालन किया गया है, और काफी अनुभवी प्रोग्रामर द्वारा रखा गया है। उनका दावा है कि कोडबसेस और सहकर्मियों के मेरे नमूने का आकार सभी संभावित कोडबेस और सहकर्मियों से छोटा है, और इस प्रकार मेरा अनुभव इस बात पर कोई सही संकेतक नहीं है कि क्या कोई श्रेष्ठ है।
तो, कोई विचार?
Item
है class Item ...
और नहीं typedef ...& Item
, तो स्थानीय item
पहले से ही एक कॉपी है