2012-12-30 47 views
6

मान लीजिए मैं एक फ़ाइल utility.h में एक वर्ग Utility है:सी ++ में लघु कार्य नाम उपनाम परिभाषित करने का सबसे सुरक्षित तरीका क्या है?

class Utility { 
public: 
    static double longDescriptiveName(double x) { return x + 42; } 
}; 

और फिर मुझे लगता है कि मैं समारोह longDescriptiveName(...) एक बहुत का उपयोग करें। तो एक गैर-जिम्मेदार सी ++ प्रोग्रामर कि मैं कर रहा हूँ जब मैं बहुत ज्यादा कॉफी मिला है की तरह, मैं एक नई फ़ाइल utilitymacros.h बना सकते हैं और वहाँ निम्नलिखित जोड़ें:

#define ldn Utility::longDescriptiveName 

अब मैं किसी भी *.cpp में "utilitymacros.h" शामिल है, जहां मैं ldn(...) और उपयोग अपने वहाँ एक सुरक्षित (अधिक उचित) #define साथ की तुलना में ऐसा करने का तरीका है: दिल कितना अधिक convinient यह बनाम 28.

प्रश्न 3 अक्षर टाइप करने के लिए है से अधिक खुशी से भर जाता है?

मैंने देखा है कि मुझे बूस्ट हेडर समेत "utilitymacros.h" शामिल करना होगा, जिसे मैं स्पष्ट रूप से पसंद नहीं करता क्योंकि यह झड़पों का संकेत है (हालांकि मुझे जो बूस्ट त्रुटियां मिलती हैं, वे बहुत स्पष्ट नहीं हैं संघर्ष है)।

स्पष्टीकरण 1: कोड पठनीयता

पर मामले में आप कह सकते हैं कि नकारात्मक कोड पठनीयता को प्रभावित करता है, मैं आपको विश्वास दिलाता यह नहीं है, क्योंकि यह काम करता है कि बहुत उपयोग किया जाता है का एक छोटा सेट है। stringToInteger के लिए व्यापक रूप से एक उदाहरण है जो stoi है। एक और probabilityDensityFunction, आदि के लिए pdf है तो अगर मैं निम्नलिखित करना चाहते हैं, stoi मेरी राय में अधिक पठनीय है:

int x = stoi(a) + stoi(b) + stoi(c) + stoi(d); 

से:

int x = Utility::stringToInteger(a) + Utility::stringToInteger(b) 
     + Utility::stringToInteger(c) + Utility::stringToInteger(d); 

या:

int x = Utility::stringToInteger(a); 
x += Utility::stringToInteger(b); 
x += Utility::stringToInteger(c); 
x += Utility::stringToInteger(d); 

स्पष्टीकरण 2: संपादक मैक्रो

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

+3

मुझे सच में नहीं लगता कि यह एक अच्छा विचार है, क्योंकि यह कोड पठनीयता को नुकसान पहुंचाता है। –

+1

मुझे लगता है कि 'पीडीएफ' एक फ़ाइल प्रारूप था, और * वास्तव में * भ्रमित हो। वर्ण मुक्त हैं और आप उनका उपयोग न करके पर्यावरण को बचाते हैं। –

+0

ठीक है, शायद छोटे नाम आपके लिए पठनीय हैं, लेकिन दूसरों के लिए मुश्किल है, यहां तक ​​कि (या विशेष रूप से) जब वे हर जगह उपयोग किए जाते हैं। मेरे पुराने पर 3 वर्ण समारोह नामों के बहुत सारे थे और यह वहां से बाहर निकलने के कई कारणों में से एक था: कोड एक अपठनीय गड़बड़ था। निश्चित रूप से, न केवल फ़ंक्शन और चर नामों के कारण, बल्कि यह इसका एक हिस्सा था। – Skalli

उत्तर

12
मैक्रो के बजाय

, आप inline समारोह है कि वास्तविक कार्य करने के लिए कॉल अग्रेषित करता है लिख सकते हैं:

inline double ldn(double x) 
{ 
    return Utility::longDescriptiveName(x); 
} 

कि निश्चित रूप से सुरक्षित मैक्रो से है।

+2

+1 निश्चित रूप से इनलाइन फ़ंक्शंस सुरक्षित हैं क्योंकि वहां जांच की जाती है और मुझे लगता है कि #define (सी शैली और कम सुरक्षित) के बजाय इसे उपयोग करने की अनुशंसा की जाती है (सी ++ शैली)। इसके अलावा नोट: मैक्रोज़ इनलाइन के विपरीत किसी भी डेटा प्रकार का उपयोग करने की कमी है जो इनलाइन के साथ टेम्पलेट का उपयोग करके पूरा किया जाता है! – Abdurahman

+0

@ नवाज, मुझे लगता है कि इनलाइन फ़ंक्शन कक्षा 'उपयोगिता' का हिस्सा नहीं है, सही? उस स्थिति में, क्या आप एक ही शीर्षलेख में 'utility.h' के रूप में इनलाइन परिभाषा डालने का सुझाव देंगे या' utilityhelpers.h' जैसे उनके लिए एक अलग शीर्षलेख बनाएं? –

+0

@LexFridman: हाँ। यह वर्ग 'उपयोगिता' के बाहर है। आप इसे एक ही शीर्षलेख में रख सकते हैं, लेकिन कक्षा के बाहर। यह आप पर निर्भर करता है। – Nawaz

3

अपने टेक्स्ट एडिटर में स्निपिट/मैक्रो/इसी तरह की चीज़ को कॉन्फ़िगर करने के बारे में कैसे? इस तरह आपको केवल एलडीएन या ऐसा कुछ टाइप करना होगा और कोड को प्रीप्रोसेसर के माध्यम से चलाने की ज़रूरत नहीं है जिसे बाद में बग ढूंढना मुश्किल हो रहा है।

+2

प्लस, टाइप होने के बाद यह समझ में आ जाएगा। – delnan

6

आप एक समारोह संदर्भ इस्तेमाल कर सकते हैं:

double (&ldn)(double) = Utility::longDescriptiveName; 
+0

यह 'स्थिर डबल (& ldn) (डबल) = ...' नहीं होना चाहिए? – Nawaz

+0

@ नवाज हाँ धन्यवाद। :) – 0x499602D2

+2

सी ++ 11 में, 'ऑटो और& ldn = उपयोगिता :: longDescriptiveName;' जो बहुत मूर्खतापूर्ण है। किसी भी मामले में 'स्थिर 'का क्या फायदा है? – Potatoswatter

2

अगर यह मदद करता है मैं नहीं जानता, लेकिन मुझे लगता है कि समस्या का एक हिस्सा अत्यधिक सामान्य नेमस्पेस (या वर्ग के नाम का उपयोग हो सकता है इस मामले में,), जैसे Utility

void local_function() 
{ 
    using namespace utility::type_conversion::string; 

    int sum = to_int(a) + to_int(b) + to_int(c) + to_int(d); 
} 

Analogously, अगर कक्षाओं/structs और स्थिर कार्यों उपयोग किया जाता है (और वहाँ कर सकते हैं:

Utility::stringToInteger के बजाय, तो हम

namespace utility { 
    namespace type_conversion { 
    namespace string { 
     int to_int(const std::string &s); 
    } 
    } 
} 

तब समारोह स्थानीय स्तर पर इस तरह इस्तेमाल किया जा सकता था इसके लिए अच्छे कारण बनें), हमारे पास

strut utility { 
    struct type_conversion { 
    struct string { 
     static int to_int(const std::string &s); 
    }; 
    }; 
}; 

और कुछ है स्थानीय समारोह इस तरह कुछ दिखाई देगा:

void local_function() 
{ 
    typedef utility::type_conversion::string str; 

    int sum = str::to_int(a) + str::to_int(b) 
       + str::to_int(c) + str::to_int(d); 
} 

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

2

एक विकल्प अपने फ़ंक्शन का नाम बदलना और इसे कक्षा के बजाय नामस्थान में रखना है, क्योंकि यह वैसे भी स्थिर है। utility.h

namespace Utility { 
    // long descriptive comment 
    inline double ldn(double x) { return x + 42; } 
} 

तो फिर आप अपने ग्राहक कोड में using namespace Utility; डाल सकते हो जाता है।

मुझे पता है कि वहां बहुत सारे स्टाइल गाइड हैं जो कह रहे हैं कि छोटे नाम एक बुरी चीज हैं, लेकिन मुझे कुछ शैली का पालन करने और फिर इसे रोकने के बिंदु को नहीं देखा जाता है।