2011-11-24 16 views
12

मुझे लगता है कि जैसे अन्य संग्रह शब्दकोश शामिल शब्दकोश संग्रह में से एक बहुत उपयोग कर रहा हूँ:मैं अपने कोड में शब्दकोश के भीतर बहुत सारे शब्दकोश का उपयोग कर रहा हूं, क्या यह कोड गंध है?

Dictionary<Guid, List<string>>() 

Dictionary<Guid, Dictionary<Guid, List<string>>>() 

मैं इन नक्शों के माध्यम से पाशन कर रहा हूँ, और मेरे कोड में मानकों में उनके आसपास गुजर।

यह एक बुरा विचार प्रतीत होता है क्योंकि आप वास्तव में इन संग्रहों की प्रकृति का विस्तार नहीं कर सकते हैं।

क्या इन्हें कक्षा में चारों ओर लपेटना बेहतर होगा?

+3

मुझे लगता है कि यह एक कोड गंध है, लेकिन आप एक उत्थान के लायक हैं उस आत्म-जागरूकता के लिए – jwiscarson

+3

क्या यह "यो डॉग .." कहने की अनुमति है? : पी – bertzzie

+2

@bertzzie: मैंने खुद के बारे में सोचा, लेकिन एक उचित मजाकिया व्यक्ति के साथ नहीं आ सकता क्योंकि मैं अपने नए हीरे को पॉलिश करने में बहुत व्यस्त हूं :) – BoltClock

उत्तर

6

क्या आप ऐसी सीमाओं में भाग लेते हैं? क्या आपका प्रोग्राम बदलना/डीबग करना मुश्किल है? यदि हां, तो रिफैक्टर। अन्यथा, लाभ: आप एक व्यावहारिक प्रोग्रामर हैं।

कहा कि, मैं तत्काल सुधार की गुंजाइश देख सकते हैं:

IDictionary<Guid, List<string>> x; 

IDictionary<Guid, IDictionary<Guid, List<string>> y = new Dictionary<Guid, IDictionary<Guid, List<string>>(); 
+0

अगर मैं उत्पाद आईडी की तरह ग्रिड को और अधिक अर्थ दे सकता तो यह बेहतर होगा लेकिन मैं नहीं कर सकता। – codecompleting

+2

@codecompleting उस मामले में, रिफैक्टर :) बस एक शब्दकोश को समेकित करें और वर्णनात्मक नामों के साथ अच्छी क्वेरी विधियां करें। बहुत काम नहीं है, और आपको पता चलेगा कि आप इससे खुश हैं, जैसे कि आप जानते हैं _now_, कि कुछ आपको परेशान कर रहा है। – sehe

5

मैं हाँ कहूंगा, विशेष रूप से इसके लिए एक कक्षा बनाएं। फिर आप अपने उपयोग के अनुसार Dictionary के साथ मिलने वाली किसी भी सीमा के आसपास काम करने के बजाय, अपने उपयोग के अनुसार विधियों को जोड़/कार्यान्वित नहीं कर सकते हैं।

ऐसा लगता है जैसे आप पेड़ की तरह संरचना चाहते हैं।

1

.NET 4.0 शुरू की टपल, एक और भी अधिक abusable डेटा संरचना, के रूप में यह शुरुआत में लगता है अच्छा के रूप में, के रूप में ज्यादा दर्द यह बाद में लाता है और बुद्धिमानी से इस्तेमाल किया जाना चाहिए।

शब्दकोश यहां किसी भी तरह से कम बुराई है, क्योंकि यह कक्षाओं के निर्माण के बजाए एक गोंद के रूप में नहीं बल्कि तेजी से तत्व पहुंच के लिए कार्य करता है। मेरा मानना ​​है कि आपके शब्दकोशों के उपयोग में कुछ भी गलत नहीं है यदि उन शब्दकोशों को कुछ गणना या कुछ के लिए विधि में स्थानीय रूप से उपयोग किया जाता है, लेकिन जब आप पैरामीटर के रूप में उन्हें पास करना शुरू करते हैं तो कम स्पष्ट हो जाता है। यदि ऐसा है, तो मुझे लगता है कि आपको इसके लिए एक कक्षा बनाने की जरूरत है।

1

क्योंकि शब्दकोश प्रकार एक संदर्भ प्रकार है, इसलिए आप यहां खराब स्थिति में नहीं हैं, लेकिन केवल कोड स्पष्टता के लिए Dictionary<Guid,List<string>> से प्राप्त एक नए प्रकार को परिभाषित करने पर विचार करें, जिसे आप लिख रहे हैं उसे छोटा करने के लिए और इसे आसानी से पठनीय बनाने के लिए । वर्ग इस तरह दिखना चाहिए:

internal class MyWrapper : Dictionary<Guid, List<string>> 
{ 
} 

या अगर यह महत्वपूर्ण है कि आप IDictionary साथ रखने के लिए के लिए है, तो वर्ग जो IDictionary<Guid, List<string>> और सिर्फ प्रतिनिधियों के लिए सभी तरीकों को लागू करता है में एक Dictionary<Guid, List<string>> उदाहरण लपेटकर द्वारा समग्र डिजाइन के साथ पर जाने लपेटा हुआ शब्दकोश।

2

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

फिर आप भविष्य में किसी भी समय डेटा संरचना के कार्यान्वयन को बदलने के लिए स्वतंत्र होंगे। यदि आप इसे अभी नहीं करते हैं, तो आपको बाद में खेद हो सकता है जब आपके पास 10 या 100 गुना अधिक ग्राहक कोड होता है, और यह रिएक्टर के लिए बहुत महंगा/दर्दनाक होता है।

आप पाते हैं कि जब तक आप इसे आसानी से encapsulated रखते हैं, और यह काम करता है, तथ्य यह है कि आप महसूस करते हैं कि यह गंध है वास्तव में प्रासंगिक नहीं है - जब तक कोड करता है जो इसे करने की जरूरत है और रखरखाव योग्य है, वहाँ इसमें कोई और समय निवेश नहीं कर रहा है।(मैं गंदे कोड को रखने की वकालत नहीं कर रहा हूं, लेकिन हमें सैद्धांतिक पूर्णता प्राप्त करने की हमारी इच्छा के विरुद्ध वाणिज्यिक वास्तविकताओं को संतुलित करना होगा - यदि कोड काम करता है और कोई समस्या नहीं पैदा कर रहा है, तो यह हमेशा आपके समय का अच्छा उपयोग नहीं हो सकता है इसे सुधारें या दोबारा दोहराएं। इसके बजाय, आप पाते हैं कि इसे कक्षा में encapsulating द्वारा जोखिम को बेअसर करना और अपने ग्राहकों से गंदे कार्यान्वयन को अलग करना अब के लिए पर्याप्त है)

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