2010-11-25 18 views
8

मेरी परियोजनाओं के लिए, मैं आमतौर पर बिना हस्ताक्षर किए गए int, char और double के साथ-साथ std :: string और अन्य जैसे प्रकार के उपनामों को परिभाषित करता हूं।क्या सी ++ को अनुकूलित करना ठीक है?

मैं भी & & में एलियास की और, या || को,! करने के लिए नहीं, आदि

  • यह बुरा व्यवहार या करना ठीक माना जाता है?
+5

आप अन्य चाहते हैं डेवलपर्स जो आपकी परियोजनाओं में शामिल होने के लिए उत्पादक होने की प्रार्थना करते हैं, नहीं। – cdhowie

+4

क्या आपने 'start'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '~~~~~~~~~~~ – FrustratedWithFormsDesigner

+0

मैंने निश्चित रूप से केवल ऑपरेटरों के लिए ऐसा किया क्योंकि मेरा मानना ​​है कि "प्राकृतिक" लोग बेहतर पढ़ते हैं। आपके द्वारा उल्लेखित सभी उदाहरण निश्चित रूप से खराब होंगे। –

उत्तर

22

आपके कोड के भीतर संदर्भ जोड़ने के लिए परिभाषित प्रकार स्वीकार्य है, और यहां तक ​​कि प्रोत्साहित किया जाता है। ऑपरेटरों के साथ घूमने से केवल अगले व्यक्ति को प्रोत्साहित किया जाएगा जो आपके घर को बंदूक लाने के लिए अपना कोड बनाए रखना है।

+10

मेरा पीछा उद्धरण याद दिलाता है: :) – SebastianK

+1

गूगल "हमेशा कोड के रूप में यदि व्यक्ति जो आपके कोड बनाए रखेंगे एक पागल सीरियल किलर को पता है कि आप कहाँ रहते हैं कि" खोज + गूगल मानचित्र + सड़क दृश्य। बिल्ली, यहां तक ​​कि एक रोबोट भी इस तरह के एक निशान का पालन कर सकता है। –

+0

@ टिम विलिसक्रॉफ्ट: एक्शन मूवी प्लॉट की तरह लगता है: रोबोट को उस व्यक्ति को खत्म करने के लिए भेजा जा सकता है जो संवेदनशील कंप्यूटरों के लिए खतरा है - ओह स्नैप! – Piskvor

11

ठीक है, उन नए आने वालों पर विचार करें जो सी ++ के आदी हैं। उन्हें आपकी परियोजना को बनाए रखने में कठिनाइयां होंगी।

ध्यान दें कि अधिक मान्य एलियासिंग के लिए कई संभावनाएं हैं। एक अच्छा उदाहरण जटिल नेस्टेड एसटीएल कंटेनर है।

उदाहरण:

typedef int ClientID; 
typedef double Price; 
typedef map<ClientID, map<Date, Price> > ClientPurchases; 

अब,

map<int, map<Date, double> >::iterator it = clientPurchases.find(clientId); 

के बजाय आप लिख सकते हैं

ClientPurchases::iterator it = clientPurchases.find(clientId); 

अधिक स्पष्ट और पठनीय हो रहा है जो।

10

आप केवल निरर्थक रूप नाम भाषा सुविधाओं के लिए यह प्रयोग कर रहे हैं (जैसा कि उदाहरण @Vlad देता है के खिलाफ), तो यह Wrong Thing है।

यह निश्चित रूप से कोड को कम पठनीय बनाता है - सी ++ में कुशल कोई भी (x ? y : z) देखेगा और पता होगा कि यह एक टर्नरी conditional operator है। हालांकि ORLY x YARLY y NOWAI z KTHX एक ही बात हो सकती है, यह दर्शक को भ्रमित कर देगी: "क्या यह YARLY NOWAI? : जैसा ही है, जिसका नाम लेखक की सुविधा के लिए बदला गया है, या इसमें सूक्ष्म मतभेद हैं?" यदि ये "उपनाम" मानक भाषा तत्वों के समान हैं, तो वे आपके कोड को बनाए रखने के लिए केवल अगले व्यक्ति को धीमा कर देंगे।

टीएलडीआर: कोड पढ़ना, कोई भी कोड, हर समय अपने निजी वैकल्पिक वाक्यविन्यास को देखने के बिना पर्याप्त कठिन है।

+1

लोग * वास्तव में * कुशल 'पता चल जाएगा and' पहले से ही एक कीवर्ड है: डी – CiscoIPPhone

+2

@Ciscol: nitpick: यह वास्तव में एक पूर्व प्रसंस्करण टोकन (जो' '&& ले कर जाता है), नहीं एक कीवर्ड है। ;-) –

+0

वास्तव में बताए जाने के लिए +1 * क्यों * यह बुरा है। –

5

यह भयानक है। कृपया मत करो, कृपया। बेवकूफ सी ++ लिखें, कुछ मैक्रो-रिडल राक्षसता नहीं। सामान्यतः, यह अत्यंत बहुत विशिष्ट मामलों (जैसे BOOST_FOREACH मैक्रो) को छोड़कर, इस तरह के मैक्रोज़ को परिभाषित करने के लिए खराब अभ्यास है।

जिसके अनुसार, and, or और not वास्तव में पहले से ही मान्य उपनाम हैं &&, || और सी में ! के लिए ++!

यह सिर्फ इतना है कि विजुअल स्टूडियो केवल उन्हें जानता है यदि आप पहले मानक शीर्षलेख <ciso646> शामिल करते हैं। अन्य कंपाइलरों को इसकी आवश्यकता नहीं है।

प्रकार कुछ और हैं।संदर्भ के आधार पर प्रकार उपनाम बनाने के लिए typedef का उपयोग करना समझ में आता है अगर यह कोड की अभिव्यक्ति को बढ़ाता है। फिर इसे प्रोत्साहित किया जाता है। हालांकि, उपनाम के बजाय अपने प्रकार बनाने के लिए भी बेहतर होगा। उदाहरण के लिए, मैं कल्पना नहीं कर सकता कि यह कभी भी std::string के लिए उपनाम बनाने के लिए फायदेमंद है - क्यों न केवल std::string का उपयोग करें? अगर हर सी ++ डेवलपर तो क्यों नहीं अपने उपनाम से परिचित था (इसका अपवाद के पाठ्यक्रम सामान्य डाटा संरचनाओं और एल्गोरिदम कर रहे हैं।)

0

, लेकिन आप इन अन्य नामों अनिवार्य रूप से जो कोई भी अपने कोड को बनाए रखने की जरूरत है के लिए एक नई भाषा शुरू करने के साथ कर रहे हैं।

क्यों इस अतिरिक्त मानसिक कदम है कि अधिकांश भाग के लिए (& & और || कर रहे हैं बहुत स्पष्ट है कि वे क्या किसी भी C/C++ प्रोग्रामर के लिए कर रहे हैं, और सी में किसी भी तरह ++ आप and उपयोग कर सकते हैं किसी भी स्पष्टता नहीं जोड़ता जोड़ने और or कीवर्ड)

4
  • "और", "या", "नहीं" ठीक है क्योंकि वे भाषा का हिस्सा हैं कर रहे हैं, लेकिन यह शायद एक शैली है कि अन्य सी ++ प्रोग्रामर का उपयोग में C++ लिखने के लिए बेहतर है, और बहुत कम लोग उनका उपयोग परेशान करते हैं। उन्हें स्वयं उपनाम न करें: वे आरक्षित नाम हैं और प्रीप्रोसेसर में आरक्षित नामों का उपयोग करने के लिए सामान्य रूप से मान्य नहीं है। यदि आपका कंपाइलर उन्हें अपने डिफ़ॉल्ट मोड में प्रदान नहीं करता है (यानी यह मानक-अनुरूप नहीं है), तो आप #define के साथ नकली कर सकते हैं, लेकिन यदि आप कंपाइलर बदलते हैं, या कंपाइलर बदलते हैं तो आप भविष्य में परेशानी के लिए स्वयं को स्थापित कर सकते हैं विकल्प।

  • बिल्टिन प्रकारों के लिए टाइपपीफ कुछ परिस्थितियों में समझ में आ सकते हैं। उदाहरण के लिए सी 99 (लेकिन सी ++ में नहीं) में, int32_t जैसे विस्तारित पूर्णांक प्रकार हैं, जो 32 बिट पूर्णांक निर्दिष्ट करते हैं, और किसी विशेष सिस्टम पर जो int के लिए टाइपिफ़ हो सकता है। वे stdint.h (<cstdint> से सी ++ 0x में) से आते हैं, और यदि आपका सी ++ कंपाइलर एक्सटेंशन के रूप में प्रदान नहीं करता है, तो आप आम तौर पर इसका एक संस्करण खोज सकते हैं या लिख ​​सकते हैं जो आपके सिस्टम के लिए काम करेगा। यदि आपके मन में कुछ उद्देश्य है जिसके लिए आप भविष्य में एक अलग पूर्णांक प्रकार (शायद एक अलग सिस्टम पर) का उपयोग करना चाहते हैं, तो हर तरह से किसी ऐसे नाम के पीछे "असली" प्रकार छुपाएं जो महत्वपूर्ण गुणों का वर्णन करता है आपने उद्देश्य के लिए उस प्रकार को चुना है। यदि आपको लगता है कि "int" अनावश्यक रूप से संक्षिप्त है, और यह "पूर्णांक" होना चाहिए, तो आप इस तरह के सतही तरीके से भाषा को ट्विक करने की कोशिश करके वास्तव में किसी को भी मदद नहीं कर रहे हैं। यह किसी भी लाभ के लिए एक अतिरिक्त संकेत नहीं है, और लंबे समय तक आप सी ++ सीखने से बेहतर हैं, सी ++ को "अधिक समझने" के लिए बदलने से।

  • मैं एक अच्छे कारण के एक मामले विस्तारित पूर्णांक प्रकार है, जहां आपके नाम शायद string कुछ बनाता है पर के लिए एक typedef हो जाएगा के लिए इसी तरह के अलावा, string के लिए किसी अन्य नाम का उपयोग करने के बारे में सोच नहीं सकते हैं, और wstring पर अन्य शामिल हैं।

  • यदि आप मूल अंग्रेजी-स्पीकर नहीं हैं, और सी ++ को दूसरी भाषा में "अनुवाद" करने का प्रयास कर रहे हैं, तो मैं आपके बिंदु को देखता हूं लेकिन मुझे नहीं लगता कि यह एक अच्छा विचार है। आपकी भाषा के अन्य वक्ताओं भी आपके द्वारा चुने गए अनुवादों को जानते हुए सी ++ से बेहतर होंगे। लेकिन मैं एक मूल अंग्रेजी स्पीकर हूं, इसलिए मुझे वास्तव में पता नहीं है कि यह कितना अंतर बनाता है। यह देखते हुए कि कितने सी ++ प्रोग्रामर वहाँ दुनिया जो भाषाओं का अनुवाद न हो, मुझे लगता है कि यह एक बड़ी सौदा तथ्य यह है कि सभी दस्तावेज़ अंग्रेजी में है के साथ तुलना में नहीं है ...

+1

एक्सेल और विजुअल बेसिक थोड़ी देर के लिए अनुदित कीवर्ड की कोशिश की, और यह भयानक था (हाँ, और भी अधिक भयानक वीबी और एक्सेल से कर रहे हैं वैसे भी) –

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