एक आउटपुट तर्क क्या है, जैसा कि मार्टिन के क्लीन कोड में बताया गया है?


14

रॉबर्ट सी। मार्टिन के क्लीन कोड: ए हैंडबुक ऑफ एजाइल सॉफ्टवेयर क्राफ्ट्समैनशिप के पेज 45 पर मार्टिन लिखते हैं कि आउटपुट तर्कों से बचना चाहिए। मुझे "आउटपुट तर्क" के अर्थ को समझने में परेशानी हो रही है और उन्हें क्यों टाला जाना चाहिए।

एक आउटपुट तर्क के लिए मार्टिन का उदाहरण appendFooter(s);फ़ंक्शन को कॉल करता है public void appendFooter(StringBuffer report)। कोड में उसका सुधार हैreport.appendFooter();

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

क्या उपरोक्त फ़ंक्शन को भी उपरोक्त सिद्धांत द्वारा अशुद्ध कोड का उदाहरण माना जाएगा?

int[] numberArray = {3, 5, 7, 1};
sortArray(numberArray);

यदि उपरोक्त मार्टिन के सिद्धांत का उल्लंघन है, जो आउटपुट तर्कों का उपयोग नहीं करता है, तो क्या किसी ऑब्जेक्ट को फ़ील्ड के रूप में सरणी और फ़ंक्शन को सॉर्ट करने के लिए कहा जा सकता है?

ObjectWithArrayField numberArray = new ObjectWithArrayField(3, 5, 7, 1);
numberArray.sort();

जवाबों:


11

बॉब मार्टिन केवल पठनीयता के बारे में बात कर रहे हैं ।

appendFooterउदाहरण के साथ समस्या यह है कि अगर आपको appendFooter(s)प्रोग्राम में कहीं पर कोड लाइन मिल जाती है, तो यह तुरंत स्पष्ट नहीं होता है कि कॉल उस इनपुट केs रूप में लेता है और इसे कहीं जोड़ता है, या यदि उस फ़ंक्शन का आउटपुट लेने के लिए बस पास किया गया है । सुनिश्चित करने के लिए, आपको फ़ंक्शन के दस्तावेज़ीकरण की जांच करने की आवश्यकता है। हालाँकि, एक कॉल जैसी समस्या से बचा जाता है: यह अब और अधिक स्पष्ट है कि क्या होता है।sreport.appendFooter()

ध्यान दें, हालांकि, बॉब मार्टिन "कभी भी आउटपुट तर्कों का उपयोग नहीं करते हैं", वह कहते हैं, "सामान्य तौर पर, आपको इससे बचना चाहिए, क्योंकि इससे आपको अपना कोड थोड़ा और अधिक साफ रखने में मदद मिलेगी"। तो यह एक साहसी कार्गो-पंथ नियम नहीं है, जिसका आँख बंद करके पालन करना चाहिए।

Sortमानक सरणियों और संग्रह के लिए तरीके थोड़ा अलग हैं। बीत रहा है sortविधि प्रत्येक मानक सरणी डेटाप्रकार के एक सदस्य समारोह, देखने के भाषा डिजाइनर के दृष्टिकोण से कुछ कमियां होता उदाहरण के लिए, एक विधि होने की तरह Array.sortजावा रनटाइम के मानक पुस्तकालय में इस रखने के लिए, बाहर की अनुमति देता है। लेकिन अगर आप एक व्यक्तिगत संग्रह प्रकार बनाएंगे जिसे कभी-कभी क्रमबद्ध करना पड़ता है, तो sortएक सदस्य फ़ंक्शन के रूप में जोड़ना वास्तव में एक अलग वर्ग में डालने से बेहतर विचार हो सकता है।


2
sortArray(numberArray), निश्चित रूप से, numberArrayजगह में तरह । या क्या यह प्रतिलिपि बनाता है, कॉपी को numberArrayसॉर्ट करता है, और बिना किसी को बदल दिए बिना सॉर्ट की गई कॉपी वापस करता है numberArray?
8bittree

@ 8 बिट्ट्री: यह सच है, लेकिन यह यहां डिसकशन की बात नहीं है - sort()कंटेनर का एक तरीका "आउटपुट तर्क" का उपयोग किए बिना, इन-प्लेस भी काम कर सकता है। तो सिर्फ इसलिए sortArray(numberArray)कि एक इन-प्लेस विधि पूरी तरह से कोई कारण नहीं है जो "आउटपुट तर्क फॉर्म" को सही ठहराती है।
डॉक्टर ब्राउन

1
मेरी बात और थी कि यह पूरी तरह से स्पष्ट नहीं है कि क्या sortArray(numberArray)कर रहा है। यह स्पष्ट हो सकता है यदि यह उसी प्रकार वापस नहीं करता है जिसे यह स्वीकार करता है, तो इसे जगह में होना चाहिए। लेकिन रिटर्न प्रकार देखे बिना, या यदि रिटर्न प्रकार इनपुट प्रकार से मेल खाता है, तो परिभाषा को देखे बिना इसकी अस्पष्टता।
8bittree

1
@ 8bittree: ठीक है, आप मुझे मिल गए, मैंने अपने उत्तर से दांव को हटा दिया। हालाँकि, आपके द्वारा वर्णित समस्या एक सदस्य फ़ंक्शन का उपयोग करके गायब नहीं होती है - यहां तक ​​कि "सॉर्ट" सदस्य फ़ंक्शन भी इस तरह से व्यवहार कर सकता है।
डॉक्टर ब्राउन

11

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

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

एक अपवाद बहुत सामान्य एल्गोरिदम के लिए है। उदाहरण के लिए, एक छँटाई एल्गोरिथ्म सही ढंग से कंटेनरों से अलग हो सकता है जो इसे छाँटता है, अगर यह अपने सार्वजनिक इंटरफ़ेस का उपयोग करके किसी भी प्रकार के कंटेनर पर उदारतापूर्वक लागू किया जा सकता है। एक-शॉट appendFooterफ़ंक्शन में वह बहाना नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.