2009-04-21 13 views
5

मैं एक बिल्कुल नया सी ++ प्रोग्रामर हूं और मैं वर्ग घोषणा के भीतर नामकरण पैरामीटर के लिए और इसके खिलाफ तर्क सुनना चाहता हूं।सी ++ स्टाइल कन्वेंशन: कक्षा घोषणा के भीतर पैरामीटर नाम


यहाँ एक उदाहरण है:

Student.h

#ifndef STUDENT_H_ 
#define STUDENT_H_ 

#include <string> 

using namespace std; 

class Student 
{ 
    private: 
     string name; 
     unsigned int age; 
     float height, GPA; 

    public: 
     Student(string, unsigned int, float, float); 

     void setAge(unsigned int); 
}; 

#endif /*STUDENT_H_*/ 

बनाम

#ifndef STUDENT_H_ 
#define STUDENT_H_ 

#include <string> 

class Student 
{ 
    private: 
     string name; 
     unsigned int age; 
     float height, GPA; 

    public: 
     Student(string name, unsigned int age, float height, float GPA); 

     void setAge(unsigned int age); 
}; 

#endif /*STUDENT_H_*/ 

Student.cpp

#include "Student.h" 

Student::Student( string name, 
      unsigned int age, 
      float height, 
      float GPA) : 

      name(name), 
      age(age), 
      height(height), 
      GPA(GPA) {} 

void Student::setAge(unsigned int age) { this -> age = age; } 

मैं तय नहीं कर सकता। एक ओर, मुझे लगता है कि दोनों घोषणाओं (.h) और परिभाषा (.cpp) में चर का नाम देने के लिए अनावश्यक है। खासकर जब से आप दोनों जगहों पर नाम अपडेट करने की चिंता कर रहे हैं ताकि वे मेल खाते हों। दूसरी ओर, नामों के बिना, यह निर्धारित करने के लिए अक्सर भ्रमित हो सकता है कि पैरामीटर केवल घोषणाओं को देखकर किस चर के अनुरूप हैं।

तो, आपके विचार क्या हैं?

+0

बस 'int' और 'double' का उपयोग करें, न कि' हस्ताक्षरित int 'और' float'। 'हस्ताक्षरित int' के मामले में आप शायद एक मूल्य बाधा दस्तावेज करने का प्रयास कर रहे हैं, लेकिन सी ++ के बजाय यह लागू करता है कि यह कई नुकसान प्रदान करता है, यानी कोई लाभ नहीं, लेकिन बहुत अनावश्यक दर्द। आम तौर पर केवल हस्ताक्षरित प्रकारों का उपयोग करें जहां आप बिट स्तर से निपट रहे हैं, या जहां पुस्तकालय कार्यों द्वारा मजबूर किया गया है। 'फ्लोट 'के मामले में आप शायद स्मृति को सहेजने का प्रयास कर रहे हैं। यह गुमराह है जब तक आपके पास अरबों छात्र नहीं हैं। :-) चीयर्स और एचटी। –

+0

@ एएलएफ पी। स्टीनबाक: कौन से नुकसान? फ्लोट पर्याप्त होने पर डबल क्यों होता है? विस्तृत। –

उत्तर

19

घोषणा में पैरामीटर नामों का उपयोग करना और अच्छे पैरामीटर नामों का उपयोग करना बेहतर है। इस तरह, वे फ़ंक्शन प्रलेखन के रूप में कार्य करते हैं। अन्यथा, आपको अपने शीर्षलेख में अतिरिक्त टिप्पणियां लिखनी होंगी, और टिप्पणियों का उपयोग करने के बजाय अच्छे पैरामीटर/चर नामों का उपयोग करना हमेशा बेहतर होता है।

अपवाद: जब किसी फ़ंक्शन के बाहरी कारणों के लिए एक निश्चित हस्ताक्षर होना चाहिए, लेकिन पैरामीटर वास्तव में उपयोग नहीं किए जाते हैं। इस मामले में, आपको उन्हें कार्यान्वयन में नामित नहीं करना चाहिए।

+3

अपवाद: जब पैरामीटर स्पष्ट हैं या प्रकार स्वयं-दस्तावेज हैं, उदाहरण के लिए, 'प्वाइंट 3 डी (टी, टी, टी)' और 'जोड़ी (कुंजी, मान) 'दोनों प्रचुर मात्रा में स्पष्ट हैं। –

4

दोनों जगहों पर नाम रखें, स्पष्टता वह इनाम है जो आपको दो स्थानों पर हस्ताक्षर बनाए रखने के कार्य के लिए मिलता है।

1

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

एकमात्र बार जब मैं एक तृतीय पक्ष लाइब्रेरी कॉलबैक लागू करना चाहता हूं तो मुझे पैरामीटर नाम से गुजरना है और मैं पैरामीटर में से किसी एक का उपयोग नहीं कर रहा हूं। फिर भी मैं करता हूँ चाहते हैं:

my_callback(int idx, Context* /*ctx*/) { ... 

ताकि मैं हस्ताक्षर अच्छी तरह से पता है।

-1

हां, .h फ़ाइल में पैरामीटर का नाम देना आवश्यक नहीं है। एक हेडर फ़ाइल को एक इंटरफेस का प्रतिनिधित्व करना माना जाता है, इसलिए इसे अनियंत्रित विवरण की आवश्यकता नहीं होती है।

HTH

+0

ऐसा लगता है कि आपके द्वारा लिंक किए गए प्रश्न पर आम सहमति सदस्य चर के लिए अंडरस्कोर का उपयोग नहीं करना है, जो मैं नहीं करता हूं। जबकि कुछ लोगों को यह कष्टप्रद वर्बोज़ मिल सकता है, मैं ऊपर दिए गए उदाहरण में "इस" कीवर्ड का उपयोग करता हूं। मुझे यकीन नहीं है कि आप उस लिंक के साथ क्या चित्रित करने की कोशिश कर रहे थे। – Scott

+0

सच - और "फ्लोट, फ्लोट" इंटरफ़ेस नहीं है। "फ्लोट ऊंचाई, फ्लोट जीपीए" असली इंटरफ़ेस है। – MSalters

+0

क्षमा करें, मैंने अंडरस्कोर लिंक हटा दिया है।यह किसी और के लिए था :-) @MSalters: मैं मानता हूं कि पैरामीटर नाम इंटरफ़ेस प्रदान करने वाले अर्थ में जोड़ते हैं, लेकिन उस पर निर्भर IMHO आदर्श तरीका नहीं है। क्या होगा अगर कोई हेडर में अलग-अलग और फिर इम्प्ले में उनका नाम बदलता है। फ़ाइल। यह और अधिक भ्रमित हो जाएगा। एक रखरखाव परिप्रेक्ष्य से, मुझे लगता है कि हेडर से नाम छोड़ना सहायक है। – Abhay

3

Intellisense/स्वत: पूर्ण/जो कुछ भी समान विकास के वातावरण में है आमतौर पर केवल घोषणा देखता है और केवल स्वत: पूर्ण के रूप में यह दिखा देंगे। इसलिए यदि आप घोषणा में नाम घोषित नहीं करते हैं तो उपयोगकर्ता उन्हें स्वत: पूर्ण रूप से नहीं देख पाएंगे जब तक कि वे स्रोत पर न जाएं और पढ़ सकें।यह शायद सहनशील है, लेकिन बहुत सुविधाजनक नहीं है।

+0

ओह, हर तरह से, मैंने नामों को घोषणा में रखा है। शायद मेरी पोस्ट पर्याप्त स्पष्ट नहीं थी, लेकिन मैं हेडर में नाम डालकर * इसके अतिरिक्त या इसके कारणों को प्राप्त करने की कोशिश कर रहा था। – Scott

+0

ओह! उसको खरोंचो। मैंने आपके उत्तर में "घोषणा" के विरोध में "परिभाषा" पढ़ी है। जानकारी के लिए धन्यवाद। – Scott

0

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

0

एक तरफ, मुझे लगता है कि यह अनावश्यक है दोनों घोषणा (ज) और परिभाषा (सीपीपी) में चर नाम है। खासकर के बाद से आपको दोनों स्थानों पर नाम अपडेट करने की चिंता करनी है ताकि वे मैच प्राप्त कर सकें।

आप सचमुच मैच के लिए नामों की जरूरत नहीं है। हेडर फ़ाइल, जो इंटरफ़ेस निर्दिष्ट करती है, एक अपूर्ण अनुबंध की तरह थोड़ा काम करती है (अपूर्ण क्योंकि इसमें पूर्व शर्त और पोस्टकंडिशन नहीं होते हैं, जब तक कि आप उन्हें टिप्पणियों में लिखते नहीं हैं) और "कॉलर की मार्गदर्शिका"। कक्षा के कॉलर जानना चाहते हैं कि 99% मामलों में पैरामीटर क्या हैं। कम से कम इतना है कि वह जानता है कि क्या हो रहा है। इसलिए आपको एक पैरामीटर नाम चुनना होगा जो कॉलर के लिए समझ में आता है। इसे सीपीपी में नाम के समान होने की आवश्यकता नहीं है। हालांकि इससे कोई फर्क नहीं पड़ता, क्योंकि मुझे पहले स्थान पर .h से फ़ंक्शन हस्ताक्षर कॉपी/पेस्ट करने के लिए उपयोग किया जाता है। मेरे लिए, सी ++ में प्रोग्रामिंग इस मैनुअल भाग का तात्पर्य है।

दूसरी ओर, नाम के बिना, यह अक्सर क्या चर मापदंडों अनुरूप सिर्फ घोषणा को देखकर को निर्धारित करने के लिए भ्रामक हो सकते हैं।

यह अच्छा हाथ है।

0

मुझे लगता है कि यह आपके चर प्रकारों के वर्णनात्मक पर निर्भर करता है। तो नाम शामिल बेमानी है

double calculateTax(int, string); 

प्रकार वर्णनात्मक हैं, तो: अपने विधि हस्ताक्षर कई उद्देश्यों के लिए इस्तेमाल प्रकार होते हैं, तो यह उपयोगी है।

Money calculateTax(Order, State); 

मैं दो फाइलों में नामों को बनाए रखना पसंद नहीं करूंगा।

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