लंबी पैरामीटर सूची बनाम लंबी राज्य चर सूची


10

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


क्या C ++ पर टिप्पणी करने वाली मूल पुस्तक एक कार्यात्मक भाषा थी?
मार्टिन यॉर्क

जवाबों:


7

निर्भर करता है अगर आप एक proceduralया functionalप्रतिमान में प्रोग्रामिंग कर रहे हैं । पूर्व के लिए और बाद के लिए अपंग के लिए पारस्परिक अवस्था की आवश्यकता होती है। यह सेब और संतरे हैं। वे दोनों अपने bailiwicks पर सही हैं!

आप एकल प्रक्रिया और अन्य कार्यात्मक तकनीकों को अनिवार्य प्रक्रियात्मक भाषाओं में लागू कर सकते हैं, अपरिवर्तनीय स्थिति समवर्ती प्रोग्रामिंग को अधिक निर्धारक बनाता है, लेकिन जावा या सी ++ जैसी भाषा में प्रत्येक वस्तु को अपरिवर्तनीय बनाना लगभग असंभव है क्योंकि उनके मेमोरी मॉडल आसानी से इस प्रतिमान का समर्थन नहीं करते हैं।


:धन्यवाद! पुस्तक << 97 चीजें जो प्रत्येक प्रोग्रामर को पता होनी चाहिए >> कहते हैं कि हमें कार्यात्मक प्रोग्रामिंग सिद्धांतों को लागू करना चाहिए जैसे कि साइड-इफेक्ट से बचें। क्या हम एक अनिवार्य कोड के संदर्भ में कार्यात्मक प्रोग्रामिंग सिद्धांतों को लागू नहीं कर सकते हैं?
टॉमपैप्स

प्रक्रियात्मक प्रोग्रामिंग के लिए राज्य की आवश्यकता नहीं है । यह आम है, लेकिन इसकी आवश्यकता नहीं है। यह आम है कि किसी भी चीज की तुलना में आदतों के कारण अधिक है। यद्यपि मैं मानता हूँ कि निश्चित रूप से ऐसी परिस्थितियाँ हैं जहाँ (राज्य) चर को चारों ओर रखना विकल्प (जैसे अतुल्यकालिक प्रसंस्करण) की तुलना में आसान है।
मार्जन वेनेमा

@ मार्जन के पास अपरिवर्तनीय चर है कुछ भी राज्य है

@ जारारोड: अब आपने मुझे भ्रमित कर दिया। आपके उत्तर को फिर से पढ़ते हुए मुझे लगता है कि मुझे "म्यूटेबल स्टेट" की आवश्यकता है। लेकिन आपकी टिप्पणी से लगता है कि अपरिवर्तनीय चर राज्य है। नहीं मिलता है। इसलिए हो सकता है क्योंकि मैं इन शब्दों में चारों ओर फेंकने और उत्परिवर्तनीय और अपरिवर्तनीय के बारे में सोचने के अभ्यस्त नहीं हूं। मुझे पढ़ने के लिए कोई संदर्भ?
मार्जन वेनेमा

@ मार्जनवीनेमा: हाँ, अपरिवर्तनीय चर राज्य है। प्रक्रियात्मक और कार्यात्मक प्रोग्रामिंग के बीच स्थिति को संभालने में अंतर यह नहीं है कि proc.prog। राज्य है, और कार्यात्मक नहीं है - बल्कि, अंतर यह है कि खरीद। prog। है परिवर्तनशील राज्य हमेशा (शुद्ध) कार्यात्मक प्रोग्रामिंग में अपरिवर्तनीय है, जबकि राज्य। उदाहरण के लिए देखें en.wikipedia.org/wiki/Purely_functional , जो बताता है कि विशुद्ध रूप से कार्यात्मक भाषाएँ अपडेट से बचती हैं।
सलेस्के

1

यदि मैं आपके प्रश्न को सही समझता हूं, तो आप सवाल कर रहे हैं कि क्या शर्तें या तो पैरामीटर या वर्ग चर / सदस्य / क्षेत्र / आदि के उपयोग के योग्य हैं? मैं मान रहा हूं कि आप एक विधि का उल्लेख कर रहे हैं, और एक कार्य का नहीं। यदि यह विशेष रूप से C ++ के बारे में है, तो मैं आपके प्रश्न को ओवरफ्लो करने के लिए स्थानांतरित करने का सुझाव देता हूं।

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

इसके अलावा:

  • क्या अन्य तरीके वर्ग चर का उपयोग कर सकते हैं? यदि हाँ, तो कक्षा चर के साथ जाने पर विचार करें।
  • क्या आपका तरीका सार्वजनिक है? यदि सार्वजनिक है, तो मापदंडों का उपयोग करें।
  • क्या आपके पैरामीटर सूची को उचित रूप से एक हैश / मैप / सरणी / संग्रह / सूची / आदि के रूप में दर्शाया जा सकता है? यदि हां, तो इसे एक विकल्प पर विचार करें।
  • क्या आपका तरीका स्टैटिक है? यदि हाँ, तो मापदंडों का उपयोग करें।

0

नहीं, राज्य चर प्रति se से दुष्प्रभाव नहीं होता है।

एक सेटर विधि (डेटा संरचना पर जो कहीं और दिखाई देती है) को कॉल करना एक दुष्प्रभाव है।

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

class ManyParams {
    final String theName = null;
    final int    theAge = 0:
    ManyParams() {}
    ManyParams(String a, int b) { theName=a; theAge = b; }
    public withName(String n) {
        return new ManyParams(n, this.theAge);
    }
    public withAge(int i) {
         return new ManyParams(theName, i);
    }
}
/// to be used like this
foo(new ManyParams.withName("John").withAge(42));

बेशक, ManyParams के निर्माता के पास अभी भी इस तरह एक लंबी पैरामीटर सूची होगी। लेकिन इसके छिपे हुए।

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