2010-06-29 8 views
7

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

व्यक्तिगत रूप से मैं एक नया प्रकार बनाना पसंद करता हूं ताकि हम जान सकें कि सरणी सूची में क्या संग्रहीत किया जा रहा है, लेकिन मेरे पास डेटा प्राप्त करने वाले व्यक्ति को मनाने के लिए मजबूत तर्क नहीं हैं। क्या आप?

सारा

+0

संपादन रोबस्टो के लिए धन्यवाद। – sarahTheButterFly

+1

यदि विकल्प 'स्ट्रिंग' है, तो मैं दृढ़ता से कक्षा को अंतिम क्षेत्र और कोई सेटटर के साथ अपरिवर्तनीय बनाने की अनुशंसा करता हूं। – ColinD

+0

क्या डेटा प्रकार स्ट्रिंग को मान्य करता है या सीधे असाइनमेंट के अलावा कोई हेरफेर करता है? क्या मूल्य परिवर्तनीय होना चाहिए? क्या संकलित समय पर ज्ञात मान्य मूल्यांकन है? – emory

उत्तर

8

... एक नया डेटा मॉडल वर्ग है जो केवल एक स्ट्रिंग क्षेत्र होता है और एक सेटर और इसके लिए एक गेटर।

यदि यह सिर्फ एक गेटर था, तो सामान्य रूप से यह कहना संभव नहीं है कि स्ट्रिंग या कस्टम क्लास बेहतर है या नहीं।यह जैसी चीजों पर निर्भर करता है:

  • अपने डाटा मॉडल के बाकी के साथ स्थिरता,
  • , आशंका है कि क्या आप प्रदर्शन बदलने के लिए चाहते हो सकता है
  • की आशंका है कि क्या आप सत्यापन लागू करने के लिए जब उदाहरण बनाकर चाहते हो सकता है, सहायक उपयोग, आदि,
  • स्मृति उपयोग या दृढ़ता के लिए प्रभाव (यदि वे भी प्रासंगिक हैं) जोड़ें।

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

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

(सरल उत्तर जब तक आप वास्तव में इसकी जरूरत सेटर से छुटकारा पाने के लिए है,।)

भी मुद्दा यह है कि नहीं है equals का अर्थशास्त्र स्ट्रिंग और कस्टम रैपर के लिए अलग होगा। कस्टम रैपर मामले में अधिक सहज ज्ञान युक्त अर्थ प्राप्त करने के लिए आपको equals और hashCode को ओवरराइड करने की आवश्यकता हो सकती है। (और यह एक सेटर के मुद्दे से संबंधित है, और संग्रह में कक्षा का उपयोग करता है।)

+0

उत्परिवर्तन के बारे में अंतर्दृष्टि के लिए धन्यवाद स्टीफन। – sarahTheButterFly

+0

ओह .. मैं आपकी पोस्ट को वोट देना चाहता था लेकिन वास्तव में इसे नीचे वोट दिया। 3 घंटों में फिर कोशिश करेंगे! – sarahTheButterFly

2

यह निर्भर करता है वहाँ बाद में प्रकार के व्यवहार को जोड़ने का कोई वास्तविक संभावना है या नहीं। यहां तक ​​कि यदि गेटर्स और सेटर्स अब तुच्छ हैं, तो एक प्रकार का अर्थ होता है यदि वास्तविक मौका होता है तो वे बाद में कुछ कर सकते हैं। अन्यथा, स्पष्ट परिवर्तनीय नाम पर्याप्त होना चाहिए।

7

इसे कक्षा में लपेटें, यदि यह आपके शेष डेटा मॉडल के डिज़ाइन से मेल खाता है।

  • यह आपको स्ट्रिंग के लिए एक लेबल देता है ताकि आप बता सकें कि यह रन टाइम पर क्या दर्शाता है।
  • यह आपकी इकाई को लेना और अतिरिक्त फ़ील्ड और व्यवहार जोड़ना आसान बनाता है। (जो एक संभावना घटना हो सकता है>)

जिसके अनुसार, कुंजी है अगर यह आपके डाटा मॉडल के डिजाइन के बाकी से मेल खाता है ... क्या आपके पास पहले से के अनुरूप होना।

0

इस समय चर्चा की गई कि कक्षा में इसे लपेटना है या नहीं, इसे लपेटा और किया जा सकता है। भविष्य में प्रूफ के डिजाइन को कभी भी दर्द नहीं होता है, खासकर जब यह केवल न्यूनतम प्रयास करता है। mschaef के जवाब देने के लिए

+3

मैं मानता हूं कि उन्होंने शायद किसी भी तरह से करने की अपेक्षा करने के लिए अधिक समय बिताया है, लेकिन मैं इस बात से सहमत नहीं हूं कि यह अधिक कोड जोड़ने के लिए "कभी दर्द नहीं होता" (जो यह है)। आकार है, जैसा कि येगे कहते हैं, कोड का सबसे बुरा दुश्मन। एक प्रणाली में एक समय में 100K, 1M, 10M, 100M LOC एक पंक्ति हो जाती है, और प्रत्येक एक से पहले, डेवलपर ने सोचा कि यह चोट नहीं पहुंचा सकता है। – Ken

4

मुकाबला: अगर यह आपके डाटा मॉडल के डिजाइन के बाकी से मेल खाता है

एक स्ट्रिंग के रूप में यह रखें,। (देखें कैसे उद्घाटन इतना महत्वपूर्ण लगता है, भले ही मैं एक वाक्य है कि मूल रूप से कहते हैं कि हम उत्तर नहीं पता के साथ यह गुस्सा?)

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

Yegge says के रूप में, "कोड आधार पर होने वाली सबसे बुरी चीज आकार है"। एक वर्ग घोषणा, एक गेटर, एक सेटर जोड़ें, अब उन सभी को कॉल करें जो इसे छूते हैं, और आपने अपने कोड without an actual (i.e., non-hypothetical) purpose पर आकार जोड़ा है।

+0

"अगर आपको यह लेबल करने की ज़रूरत है कि यह क्या है, तो एक टिप्पणी जोड़ें।" यह केवल एक संकलन-समय लेबल है। इस प्रकार का लाभ यह है कि यदि मेरे पास डीबगर में रहते समय x का संदर्भ है, औपचारिक रूप से घोषित प्रकार मुझे यह बताता है कि यह रनटाइम पर क्या है (इंस्पेक्टर के माध्यम से)। यह एक उपयोगी बात हो सकती है। आप टाइपस्ट्रिंग वाले टोस्टिंग प्राप्त करने के लिए ReflectionToStringBuilder जैसे कुछ भी उपयोग कर सकते हैं। लॉगिंग करते समय यह उपयोगी हो सकता है। @ केन: "(देखें कि उद्घाटन कितना महत्वपूर्ण लगता है" अपनी 'विषय वाक्य' के साथ लीड करें। यह पहली चीजों में से एक है जिसे मुझे लिखने के बारे में सिखाया जा रहा है।लिंक के साथ अपने तर्क का समर्थन करने के लिए – mschaef

+0

+1। हालांकि (लेख को पढ़ना नहीं है लेकिन योजना बना रहा है) मुझे इस बात से असहमत होना है कि एक बड़ा कोड बेस खराब है, कोड को होने वाली सबसे बुरी चीज अकेले छोड़ दें। कोडर के रूप में आज हम संरचनाओं के शीर्ष पर बनाते हैं जिसमें लाखों लाइन कोड शामिल हैं, और हमने कभी इतना अच्छा नहीं किया है। – CurtainDog

+0

CurtainDog: मैं इसके साथ असहमति खोजने में आश्चर्यचकित नहीं हूं। मैंने उद्धृत किए जाने से पहले वाक्य "मैं कोड बेस के बारे में अल्पसंख्यक राय को पकड़ने के लिए होता हूं"। :-) – Ken

0

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

0

कक्षा में इसे लपेटने से आपको अधिक प्रकार की सुरक्षा मिलती है - आपके मॉडल में आप केवल रैपर वर्ग के उदाहरणों का उपयोग कर सकते हैं, और आप आसानी से गलती नहीं कर सकते हैं जहां आप एक स्ट्रिंग डालते हैं जिसमें कुछ अलग होता है आदर्श।

हालांकि, यह आपके कोड में ओवरहेड, अतिरिक्त जटिलता और क्रियापदता जोड़ता है।

4

मैं अन्य उत्तर से असहमत:

यह निर्भर करता है वहाँ प्रकार के व्यवहार को जोड़ने का कोई वास्तविक संभावना बाद में [Matthew Flaschen]

नहीं है, यदि ऐसा नहीं होता है या नहीं।...

कभी डिजाइन [Alex]

यह सच है, लेकिन नहीं यहाँ प्रासंगिक भविष्य प्रूफ करने के लिए दर्द होता है ...

व्यक्तिगत रूप से, मैं डिफ़ॉल्ट रूप से एक सादे स्ट्रिंग का उपयोग करने के इच्छुक हो जाएगा [Stephen C]

लेकिन यह राय की बात नहीं है। यह डिजाइन निर्णयों का मामला है:

क्या आप इकाई को तर्कसंगत रूप से एक स्ट्रिंग, पाठ का एक टुकड़ा संग्रहीत करते हैं? यदि हां, तो एक स्ट्रिंग स्टोर करें (सेटटर समस्या को अनदेखा कर रहा है)।

यदि नहीं है - तो एक स्ट्रिंग स्टोर करें। उस डेटा को स्ट्रिंग के रूप में संग्रहीत किया जा सकता है कार्यान्वयन विवरण, यह आपके कोड में दिखाई नहीं दे सकता है।

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

यह अमूर्तता और मजबूत टाइपिंग का पूरा बिंदु है: प्रकार आपके कोड के अर्थशास्त्र का प्रतिनिधित्व करते हैं।

और अंत में:

Yegge कहते हैं, "सबसे बुरी बात यह है कि एक कोड आधार के लिए हो सकता है आकार है।" [Ken]

खैर, यह तो विडंबना है। क्या आपने स्टीव येगे के ब्लॉग पोस्ट में से कोई भी पढ़ा है? मेरे पास नहीं है, वे सिर्फ बहुत लंबे समय तक हैं।

+0

कोनराड - यह सब अमूर्त सीमाओं के बारे में है। जाहिर है, हमें उनकी ज़रूरत है, * लेकिन यह अक्सर एक साधारण सवाल नहीं है * जहां उन्हें जाना चाहिए, और उन्हें कड़ाई से कार्यान्वयन के विवरण को छिपाना चाहिए। यदि आपके पास पर्याप्त नहीं है, तो आप लीकी अबास्ट्रक्शन, या इससे भी बदतर हो जाते हैं। यदि आप अमूर्त सीमाओं को डालने के साथ ओवरबोर्ड पर जाते हैं, तो आप बहुत सारे अनावश्यक कोड * और * प्रदर्शन समस्याओं की एक श्रृंखला के साथ समाप्त होते हैं। अंत में, यदि आप नहीं देखते हैं कि डिजाइन निर्णय (अक्सर) राय के मामले में हैं, तो आपको शायद कुछ और तकनीकी रूप से कठिन परियोजनाओं पर काम करने की आवश्यकता है :-) –

+0

@StephenC वे केवल राय के मामले में हैं क्योंकि सॉफ्टवेयर इंजीनियरिंग आज भी है काफी हद तक वूडू। अगर हम जटिल प्रणालियों के बारे में अधिक जानते थे तो हम बेहतर निर्णय ले सकते थे। एसई अभी भी अपने बचपन में, एक प्रोटो-विज्ञान है। लेकिन इसका मतलब यह नहीं है कि निर्णय राय का विषय हैं, केवल इतना है कि वे बीमार हैं। –

+0

मुझे लगता है कि आपको "राय का मामला" और "बीमार जानकारी" का क्या अजीब विचार होना चाहिए। साथ ही, मुझे लगता है कि आपके पास एसई अभ्यास * प्राप्त करने में सक्षम होना चाहिए की अवास्तविक उम्मीद है; यानी * * * * * * * * हर * डिजाइन समस्या के लिए कभी * एक * एकल * निष्पक्ष सही समाधान हो सकता है। (शास्त्रीय इंजीनियरिंग विषयों में से कोई भी इस दावे को या तो नहीं कर सकता है।) –

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