पठनीयता (संदर्भ) मापदंडों में कास्ट का उपयोग नहीं करने का एक वैध कारण है?


24

कुछ फ़ंक्शन लिखते समय, मुझे इस तरह के मापदंडों में एक कॉन्स्टेबल कीवर्ड मिला:

void MyClass::myFunction(const MyObject& obj,const string& s1,const string& s2,const string& s3){
}

अक्सर आईडीई या विम में 2 लाइनों में एक लाइन को विभाजित करने का कारण बनता है, इसलिए मैं मापदंडों में सभी कॉन्स्टेबल कीवर्ड को हटाना चाहता हूं:

void MyClass::myFunction(MyObject& obj,string& s1,string& s2,string& s3){
} 

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


110
"अरे, मैं अपने कार्यक्रम को कार्यात्मक रूप से बदलना चाहता हूं" इसे और अधिक पठनीय बनाने के लिए एक बुरा खराब कारण है।
पीटर बी

37
कार्यक्रम किसी भी तरह से अधिक पठनीय नहीं बन रहा है - एक बार जब आप कुछ सौंपते हुए देखते constहैं, तो आपके पास एक मजबूत संकेत है कि आपको परेशान करने की आवश्यकता नहीं है कि यह फ़ंक्शन में कैसे बदला जा सकता है।
टॉफ्रो

43
पठनीयता को बेहतर बनाने का एक बेहतर तरीका है कि तर्कों की संख्या को कम किया जाए
5gon12eder

15
'कांस्ट' यकीनन पठनीयता में सुधार करता है। इस कथन से स्पष्ट हो जाता है कि ओज नहीं बदल सकता है!
चार्ल्स

14
प्रत्येक अल्पविराम के बाद पठनीयता को जोड़ने में क्या मदद मिलेगी।
सैम होसेवर

जवाबों:


182

व्हॉट्सएप का उपयोग करना सीखने के लिए पठनीयता एक वैध कारण है:

void MyClass::myFunction(
        const MyObject& obj,
        const string& s1,
        const string& s2,
        const string& s3
) {
    return;
}

वहां पर स्थित पैरामीटर फंक्शन की बॉडी के साथ भ्रमित नहीं होंगे। जब आप उनका नाम बदलते हैं, तो उन्हें अलग पंक्ति में स्थान देने से आपको उन्हें निरस्त नहीं करना पड़ेगाmyFunction कुछ और वर्णनात्मक । जब वे नहीं बदले हैं तो मापदंडों की स्थिति को नहीं बदलना कुछ स्रोत नियंत्रण भिन्न उपकरण उपयोगकर्ता की सराहना करेंगे।

constकुछ मतलब है। इसे केवल इसलिए बाहर न फेंकें क्योंकि आप अंतरिक्ष और विचारों से बाहर हैं। पठनीयता राजा है लेकिन इसमें चीजों को तोड़ना नाम मात्र है।


6
"जब आप myFunction का नाम बदलते हैं, तो आपको उनका स्थान नहीं देना पड़ेगा" - हालांकि इस मामले में ऐसा लगता है जैसे कि उन्हें उद्घाटन के साथ लगभग लाइन में तैनात किया गया है (, और यदि ऐसा है तो आपको निरस्त करना पड़ सकता है यदि वर्ग + फ़ंक्शन नाम की लंबाई लगभग 4 से अधिक वर्णों से बदलती है। इसलिए यदि आप ऐसा नहीं करना चाहते हैं, तो इंडेंटेशन के स्तर की एक निश्चित संख्या जोड़ें, न कि एक संख्या जो फ़ंक्शन नाम की लंबाई पर निर्भर करती है। मैं 1 स्तर की सिफारिश करूंगा, यह उत्तर 6 का उपयोग करता है, लेकिन कोई भी निश्चित संख्या बताए गए लक्ष्य को प्राप्त करता है :-)
स्टीव जेसप

6
@CandiedOrange मुझे आश्चर्य है कि आपने इस उत्तर में "फ़ॉर्म 6" का उपयोग नहीं किया ... यह स्पष्ट रूप से कम बदसूरत है!
15

6
जीत के लिए फॉर्म 6। इंडेंटेशन के एक स्तर के लिए एक टैबस्पेस। सरल और प्रभावी। समस्या हल हुई :)
लाइटनेस रेस मोनिका

2
ओके ओके फॉर्म 6 यह है। यह वह वेरिएंट है जिसका उल्लेख जेफ्रीग ने c2 पर किया था।
कैंडिड_ऑरेंज सेप

4
@ random832 मुझे लगता है कि अब हम बाइक शेड क्षेत्र में मजबूती से खड़े हैं। यहां इसका समाधान करने का उचित तरीका है: उदाहरणों के लिए अपना कोड आधार खोजें, अपनी दुकानों की शैली मार्गदर्शिका से परामर्श करें, अपनी दुकान में डेवलपर्स से पूछें, और यदि कोई भी पैदावार नहीं देता है तो एक आधिकारिक उत्तर का उपयोग करें। उन विवादों को हल करें जो एक चौथाई रास्ते से जा सकते हैं। एक बार जब तिमाही लगातार बात की है!
कैंडिड_ऑरेंज सेप

52

दरअसल, पठनीयता का मुद्दा दूसरी दिशा में जाता है। सबसे पहले, आप व्हाट्सएप के उपयोग से अपने रन-ऑन लाइन को तुच्छ रूप से हल कर सकते हैं । लेकिन हटाने से constसिर्फ लाइन छोटी नहीं होती है, यह प्रोग्राम के अर्थ को पूरी तरह से बदल देता है।

हर्ब Sutter को संदर्भित करता है constके संदर्भ में constके रूप में सबसे महत्वपूर्णconst है क्योंकि के लिए एक संदर्भconst एक अस्थायी से बांध सकता है और अपने जीवनकाल का विस्तार कर सकता है। गैर- के लिए एक अंतराल संदर्भ const, आपको एक अलग चर की आवश्यकता नहीं है।

void foo_const(std::string const& );
void foo_nc(std::string& );

std::string some_getter();

foo_const(some_getter());      // OK
foo_const("Hello there"); // OK

foo_nc(some_getter()); // error
foo_nc("Nope");   // error

std::string x = some_getter(); // have to do this
foo_nc(x);                     // ok
std::string msg = "Really??";  // and this
foo_nc(msg);                   // ok

प्रयोज्य के लिए इसका मतलब यह है कि आपको इन सभी अस्थायी चरों को केवल अपने कार्य को करने में सक्षम बनाने के लिए पेश करना होगा। यह पठनीयता के लिए महान नहीं है, क्योंकि ये चर अर्थहीन हैं और केवल इसलिए मौजूद हैं क्योंकि आपका हस्ताक्षर गलत है।


6
आपका दूसरा पैराग्राफ मुझे यह पता लगाने की कोशिश कर रहा है कि अगर constवह constदूसरे को constconstconst
संदर्भित

3
@ मिन्डविन मुझे लगता है कि विडंबना यह है कि मेरा दूसरा पैराग्राफ स्पष्ट और अस्पष्ट है, और मुझे नहीं पता कि आप किस बारे में बात कर रहे हैं।
बैरी

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

1
मुझे लगता है कि कुछ हाइफ़िनेटेड यौगिक इसे साफ़ करेंगे।
shawnt00

2
या विशेष रूप से एक संज्ञा के रूप में उपयोग करने के const&बजाय const(-phrase)
Caleth

21

सरल उत्तर "नहीं" है।

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

// parameter "foo" is not modified
void fna(Foo& foo);

void fnb(const Foo& foo);

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

@CandiedOrange उत्तर के रूप में, आप कोड को बिछाने और पठनीयता बढ़ाने के लिए व्हॉट्सएप का उपयोग कर सकते हैं।


14

constकीवर्ड को हटाने से पठनीयता दूर हो जाती है क्योंकि constपाठक और कंपाइलर को सूचना का संचार करता है।
कोड की क्षैतिज लंबाई कम करना अच्छा है (कोई भी बग़ल में स्क्रॉल करना पसंद नहीं करता है) लेकिन constपाठ की तुलना में अधिक है । आप इसे फिर से लिख सकते हैं:

typedef string str;
typedef MyObject MObj;
void MyClass::myFunction(const MObj& o,const str& s1,const str& s2,const str& s3)

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

constकोड की ही कार्यक्षमता है। आप MyClass::घोषणा के अनुभाग को हटाने के लिए फ़ंक्शन को गैर-सदस्य नहीं बनाएंगे , इसलिए हटाएं नहींconst


4
मैं सहमत हूं कि आपके द्वारा प्रदान की जाने वाली स्निपेट कम पठनीय है। यह एक पाठक को यह पता लगाने के लिए मजबूर करता है कि क्या MObjऔर क्या strहैं, और निश्चित रूप से भौहें उठाता है। उदाहरण के लिए आप क्यों नहीं बस नाम नहीं दिया: यह प्रकार जिनके नाम आप पहले से ही नियंत्रण नहीं है के लिए विशेष रूप से अजीब है MyObjectके रूप में MObjके साथ शुरू हो?
जेसन सी

3

क्या पठनीयता मापदंडों में कास्ट का उपयोग नहीं करने का एक वैध कारण है?

नहीं। ओमिटिंग constकार्यक्षमता को बदल सकता है, सुरक्षा constप्रदान करता है और संभावित रूप से कम कुशल कोड बना सकता है।

क्या पैरामीटर ऑब्जेक्ट्स को मैन्युअल रूप से अपरिवर्तित रखना संभव है?

मैन्युअल रूप से कोड बनाने में समय बिताने के बजाय

void MyClass::myFunction(const MyObject& obj,const string& s1,const string& s2,const string& s3){
  //
}

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

void MyClass::myFunction(const MyObject& obj, const string& s1, const string& s2, 
    const string& s3) {
  // 
}

-1

जब तक संभव हो तो कब्ज को दूर रखना बेहतर है। यह कोड रखरखाव में बहुत सुधार करता है (यह देखने के लिए कोई अनुमान नहीं है कि क्या यह विधि मेरे तर्कों को बदल देती है)।

यदि मुझे एक विधि में बहुत सारे तर्क दिखाई देते हैं, तो यह मुझे परियोजना आधारित जारोन (मैट्रिक्स, कर्मचारी, आयत, खाता) के निर्माण पर विचार करने के लिए मजबूर करता है, जो बहुत छोटा होगा, समझने में आसान होगा (विधियों की लंबी सूची को समाप्त करता है)।


माना। मैं इसे इंगित करने में संकोच कर रहा था। इस प्रकार, "चरम मामला"।
ब्लैकपैन

@ सेमीस्टर ने कहा, कभी-कभी कुछ संदर्भों में, कुछ प्रोग्रामर के साथ, यह पठनीय रह सकता है । उदाहरण के लिए, विंडोज एपीआई कॉल में कमर-डीप प्रोग्राम के बहुत विशिष्ट मामले में, एक पाठक के पास, जो उस वातावरण में उपयोग किया जाता है, जैसे कि सामान जैसे typedef Point * LPPOINTऔर typedef const Point * LPCPOINT, जबकि सुपर अप्रिय, अभी भी एक निहित अर्थ वहन करता है, क्योंकि यह तत्काल अपेक्षाओं के अनुरूप है। प्रसंग में। लेकिन सामान्य मामले में कभी नहीं; यह सिर्फ एक अजीब अपवाद है जिसके बारे में मैं सोच सकता हूं।
जेसन सी

1
हां, जब मैंने प्रश्न देखा, "मेरे दिमाग में लंबे समय तक कब्ज कायम है", लेकिन, यह "कास्ट" या "संदर्भ" होने से लाभ प्राप्त करने के लिए एक अच्छा उम्मीदवार नहीं है। टाइनेडिफ नाम को छोटा करने की सामान्य समस्या को हल करता है; लेकिन इसके पीछे भाषा निर्माण (जैसे "कास्ट") के बहुत उद्देश्य को छिपाने के लिए अच्छा डिज़ाइन महसूस नहीं होता है।
ब्लैकपैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.