2009-08-31 5 views
21

मैंने हमेशा सोचा है कि यह मेरे संग्रह चर नामकरण में स्पष्ट होने के लिए "सर्वोत्तम अभ्यास" था। इसलिए, अगर मेरे पास कार ऑब्जेक्ट्स का संग्रह था, तो मैं आमतौर पर Car[]carArray और List<Car>carList नाम दूंगा।क्या मेरे बुरे काम मेरे साथ होंगे यदि मैं अपने सरणी, संग्रह, सूचियों, संख्याओं, आदि का नाम केवल उनके पास क्या है?

और फिर 99 के लिए समय की%, मैं

foreach (Car car in carArray) 
{ 
    ... 
} 

अंत की तरह कुछ कर रही ... ... और मैं सोच रहा हूँ, मैं सिर्फ सरणी cars बुलाया जा सकता था, और यह wouldn कोई फर्क नहीं पड़ता है।

और अब हमारे पास IEnumberable<T> है, मुझे वास्तव में इस सवाल का सामना करना पड़ रहा है कि क्या मैं carIEnumerable जैसे कुछ लिखने पर विचार कर सकता हूं? या carEnumerable। अब तक, जवाब "नहीं" रहा है।

मेरी सोच यहां है कि संग्रह अक्सर कोई फर्क नहीं पड़ता, और जब ऐसा होता है, तब भी कोई फर्क नहीं पड़ता कि संग्रह प्रकार परिवर्तनीय नाम में लिखा गया है या नहीं। मेरे पास बस एक मामला था जहां मुझे IEnumerable<Car> से List<Car> पर स्विच करना पड़ा क्योंकि मुझे वस्तुओं को "ब्रैकेट एक्सेस" की आवश्यकता थी (उदा।, carList[3])। उस स्थिति में, दो संग्रह प्रकार समान व्यवहार नहीं करते हैं, लेकिन वेरिएबल cars नामकरण एक समस्या रहे हैं?

इस प्रश्न में जटिलता की एक और परत जोड़ने के लिए नहीं, अगर मैं var का उपयोग करता हूं तो क्या होगा? जैसे,

var cars = GetCars(); 

मैं निश्चित रूप से बता सकते हैं cars संग्रह किसी तरह का है। मैं इसे फिर से कर सकता हूं। यदि मैं LINQ का उपयोग कर रहा हूं, तो मैं विस्तार विधियों का उपयोग कर सकता हूं। सबसे महत्वपूर्ण बात यह है कि, यदि मैं बाद में संग्रह के प्रकार को बदलता हूं, तो गड़बड़ी के साथ बहुत कम कोड होगा। var अभी भी var और cars होगा cars होगा। यह मेरे लिए बहुत आकर्षक लग रहा है, और मुझे बहुत नुकसान देखने में परेशानी हो रही है।

तो, यह सुनिश्चित करने के लिए कि मेरा प्रश्न स्पष्ट है: आप अपने संग्रह चर का नाम कैसे देते हैं और क्यों? क्या आइटम के नाम को "बहुवचन" करने के लिए कोई गंभीर पठनीयता या स्पष्टता लागत है?

+6

नामकरण चर "कारएरे" सिर्फ हंगेरियन नोटेशन का उपयोग कर रहा है। यह आम तौर पर यूआई नियंत्रणों के अलावा सी # में खराब अभ्यास के रूप में डूब गया है। – RichardOD

+3

ऐसा मत करो! यदि आप कारएरे के बजाय कारों का नाम देते हैं तो दुनिया खत्म हो जाएगी! – Powerlord

+0

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

उत्तर

20

इस तरह के नामकरण के साथ समस्या यह है कि यह संपत्ति के उद्देश्य के बजाय वास्तविक कार्यान्वयन पर बहुत अधिक ध्यान केंद्रित करता है। CarArray के बजाय, आप OwnedCars का उपयोग कर सकते हैं, या जो कुछ भी उपयोगकर्ता को बताता है कि वह गणना क्यों है।

मुझे लगता है कि छोटे foreach -ूपॉप में लूप चर "कार" नामकरण करना ठीक है।

यदि आप var cars = GetCars() लिखते हैं, तो संकलक असाइनमेंट के दाहिने तरफ के प्रकार को देखता है, इस मामले में संभवतः IEnumerable<Car>, और उस प्रकार cars देता है। यदि आप अपने माउस के साथ इसे घुमाते हैं तो आप चर के बाद के उपयोगों में भी इसे देख सकते हैं।

यदि आप संग्रह का प्रकार बदलते हैं और आपको अपना कोड बदलने की ज़रूरत नहीं है क्योंकि आप var का उपयोग कर रहे हैं, तो इस तथ्य के बारे में सोचें कि उन विभिन्न प्रकार के संग्रहों में शायद कुछ सामान्य है जो आपको एक ही ऑपरेशन करने में सक्षम बनाता है उन पर। यदि आप उन्हें foreach लूप में उपयोग करते हैं तो शायद यह IEnumerable है।

तो आप उन संग्रहों को IEnumerable के रूप में भी उजागर कर सकते हैं, इसलिए आपकी कक्षा के उपयोगकर्ता निश्चित कार्यान्वयन पर बहुत अधिक निर्भर नहीं हैं।

+0

+1 var के साथ अंतर्निहित घोषणाओं का उपयोग करने के बारे में कुछ ऐसा करने वाला था और रिटर्न वैल्यू तर्क निर्धारित होने तक नाम और प्रकार वही कैसे रह सकता है। बहुत ही सुविधाजनक। –

12

मुझे कभी भी "इसके नाम में चर का प्रकार डालना" पसंद नहीं आया - मुझे सच में लगता है कि यह स्रोत के सुचारू पढ़ने में हस्तक्षेप करता है। मेरा मानना ​​है कि कोड को एक कहानी की तरह पढ़ा जाना चाहिए, और इसलिए यह मुझे सही समझ में आता है कि कारों का एक समूह (और मुझे कोई परवाह नहीं है कि यह एक सरणी के रूप में लागू किया गया है, एक लिंक्ड सूची, एक ढेर, सेट या जो कुछ भी) नामित है "कारें":

foreach (Car currentCar : ParkingLog.getCars()) { 
    stolenCars.add(currentCar);  
} 

fencer.cars = stolenCars; 

मेरे लिए काम करता है।

+1

कूल स्टोरी, ब्रो! – JustLoren

12

व्यक्तिगत रूप से मैं जब भी संभव हो वैरिएबल नाम में संग्रह के प्रकार का उपयोग करने से बचता हूं। यह अच्छा लग सकता है लेकिन यह एक गैर-लागू करने योग्य बाधा है कि अन्य डेवलपर्स समय के साथ गड़बड़ कर देगा। यदि किसी विशेष ऑपरेशन के लिए चर का प्रकार वास्तव में महत्वपूर्ण है तो मैं कोड को फिर से लिखने पर विचार करता हूं ...

  1. कम के बारे में विशेष संग्रह कार्यान्वयन
  2. कोड छोटी/बात करने के लिए अधिक संक्षिप्त बनाने चर के प्रकार स्पष्ट है

या दूसरे शब्दों में, मुझे पसंद नहीं है हंगेरी चिंतित अंकन।

+1

मैं जेरेड के साथ हूं! और स्टाइलकॉप, कोड स्टाइल पुलिस भी है;) –

36
var car = cars.Where(c => c.Name == "Robin Reliant"); 

पठनीयता जीतता है।

इसलिए मैं बहुवचन के साथ जाता हूं।

दया,

दान

+7

यदि पठनीयता सचमुच जीत जाती है, तो आप" सी "के बजाय लैम्ब्डा चर" कार "नाम देंगे। इसके अलावा, स्थानीय चर अभी भी एक अनुक्रम है, इसलिए "कार" के बजाय आपको इसे बहुवचन करना चाहिए और संकेत देना चाहिए कि फ़िल्टरिंग लागू की गई है, यानी "रॉबिनरेलियंट कैर्स"। –

+0

@ ब्रायन, मैं आपकी टिप्पणी के दूसरे भाग से सहमत हूं। शायद उदाहरण को बदला जाना चाहिए: ' var car = cars.Where (c => c.Name == "रॉबिन रिलायंट")। पहला(); '''' के स्थान पर 'कार' का उपयोग करने के लिए, जो वास्तव में पठनीयता को नुकसान पहुंचा सकता है क्योंकि यह कम संक्षिप्त है। LINQ के साथ अब तक मेरे अनुभव में, मुझे बहुत कम लैम्ब्डा वेरिएबल्स काफी पठनीय होने के लिए मिला है। मैं एक सुंदर संगत पैटर्न का पालन करता हूं: 'कार' 'सी' होगी, 'विश्वसनीय कार्ड' आरसी' होगा, आदि। ऐसा लगता है बहुत अच्छी तरह से काम करें। – devuxer

+0

@DanThMan, मुझे 'कार' अधिक पठनीय लगता है क्योंकि मुझे यह अनुमान लगाने की ज़रूरत नहीं है कि सी == कार संदर्भ से और फिर याद रखें कि हर बार जब मैं 'c' पढ़ता हूं। और यह भी कि 'आरसी' का मतलब एक संदर्भ में' विश्वसनीय कर 'और दूसरे में' रैलीकर 'है। प्रत्येक के लिए :-) –

-4

"कार" और के बीच अंतर "carArray" कोड के आत्म दस्तावेज़ीकृत स्वभाव है। यह पता लगाने की आवश्यकता नहीं है कि आप किस प्रकार के संग्रह का उपयोग कर रहे हैं यदि यह नाम में बनाया गया है। एक छोटे से कार्यक्रम में, यह वास्तव में कोई फर्क नहीं पड़ता है, लेकिन कुछ और महत्वपूर्ण बातों में समय बचत महत्वपूर्ण है।

+4

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

+0

रखरखाव के कारण आपको किस प्रकार बदलना पड़ता है? और कक्षा के बजाए एक इंटरफेस के लिए प्रोग्रामिंग? – krdluzni

+1

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

1

मुझे लगता है कि बहुवचन का उपयोग सही अर्थ बनाता है, और यही वह तरीका है जिसका मैं आम तौर पर अपने कोड में उपयोग करता हूं। मैंने कभी नहीं पाया है कि परिवर्तनीय नाम के हिस्से के रूप में डेटा प्रकार होना उपयोगी है।

12

मैं आमतौर पर बहुवचन (उदा। कार) से शुरू करता हूं। प्रायः आपके पास एकवचन रूप (जैसे कार) में स्थानीय चर भी होगा, कभी-कभी कोड को दो बहुत ही समान चर नामों के साथ पढ़ने के लिए अजीब हो सकता है, इस मामले में मुझे एक चर के लिए एक नया नाम मिलेगा।

मैं लगभग कारएरे का उपयोग नहीं करता, अधिकतर सभी कार, या चयनित कार या कुछ उपयुक्त।

5

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

3

संग्रह प्रकार को परिवर्तनीय नाम में रखना एक समस्या है जब रखरखाव आपको प्रकार बदलने के लिए प्रेरित करता है। बहुवचन का उपयोग करना, या 'कारकॉल' जैसी सामान्य जेनेरिक सरल है। भविष्य में बदलाव को प्रभावित करने की आवश्यकता होने के बिना यह बिंदु पूरी हो जाती है।

12

कारों को कारअरे में पसंद करें, लेकिन संभवतः कारें आप जो चाहते हैं वह नहीं है। कौन सी कारें?

  • allCars
  • redCars
  • brokenCars
  • carsWith3Axels

कुल मिलाकर लेकिन कुछ मामलों में (वहाँ हमेशा उन परेशान अपवाद हैं) कारों की तरह चर नाम पर्याप्त वर्णनात्मक नहीं हैं।

5

मैं अपनी चर की चीजों का नामकरण कर रहा हूं जिसमें सीखने के हिस्से के रूप में चर प्रकार शामिल हैं। मेरे लिए कोड में कहीं भी कारएरे को एक अनुस्मारक के रूप में देखना उपयोगी है कि यह सरणी है। लेकिन आपका प्रश्न उसमें एक बहुत ही वैध बिंदु लाता है कि यदि आप इसे बाद में बदलते हैं, तो आपको उन सभी संदर्भों का पीछा करना होगा और यह एक बड़ा दुःस्वप्न हो सकता है। मैथ्यू विन्स के जवाब के अनुसार, मैं नामकरण चर के ज्ञान को देख रहा हूं, "ऑलकार्स," "टूटाकार"। मुझे लगता है कि मैं इसे अक्सर बाहर से कर दूंगा, क्योंकि मेरा कोडिंग बेहतर होता है।

2

मैं सोच रहा हूँ, मैं सिर्फ सरणी कारों कहा जाता है हो सकता है, और यह कोई फर्क नहीं जाता।

नहीं, कंपाइलर में कोई फर्क नहीं पड़ता है, लेकिन वर्णनात्मक नामों का उपयोग पठनीयता, रखरखाव और पुन: उपयोग के साथ मदद करता है।

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

उदाहरण के लिए, carArray का मतलब मेरे लिए कुछ भी नहीं है। car संक्षिप्त नाम है? क्या होगा यदि आप carArray के कार्यान्वयन को ऑलिस्ट या कार ऑब्जेक्ट्स के आईनेमेरबल में बदलते हैं? क्या इसका मतलब है कि आप चर का नाम बदलते हैं, या नाम को छोड़ दें? के बारे में सोचने के लिए बहुत कुछ। फिर भी, मैं कार, कारलिस्ट, कारलिस्ट, कारबायोडेल, और इसी तरह समझूंगा।

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