टीएल; डीआर - मैं माप की एक इकाई के भीतर इकाइयों को परिभाषित करने के लिए एक इष्टतम डेटा संरचना डिजाइन करने की कोशिश कर रहा हूं।
A Unit of measure
अनिवार्य रूप से a value
(या मात्रा) a से जुड़ा है unit
। SI इकाइयों के सात आधार या आयाम हैं। अर्थात्: लंबाई, द्रव्यमान, समय, विद्युत प्रवाह, तापमान, पदार्थ की मात्रा (मोल्स), और चमकदार तीव्रता।
यह काफी सरल होगा, लेकिन कई व्युत्पन्न इकाइयाँ और दरें भी हैं जिनका हम अक्सर उपयोग करते हैं। एक संयुक्त इकाई न्यूटन होगी: kg * m / s^2
और एक उदाहरण दर होगी tons / hr
।
हमारे पास एक एप्लिकेशन है जो निहित इकाइयों पर बहुत अधिक निर्भर करता है। हम चर या स्तंभ नाम के भीतर इकाइयों को एम्बेड करेंगे। लेकिन यह समस्याएं पैदा करता है जब हमें विभिन्न इकाइयों के साथ माप की एक इकाई को निर्दिष्ट करने की आवश्यकता होती है। हां, हम इनपुट और डिस्प्ले पर मूल्यों को परिवर्तित कर सकते हैं लेकिन यह बहुत सारे ओवरहेड कोड उत्पन्न करता है जिन्हें हम अपनी कक्षा के भीतर ही बदलना चाहते हैं।
कोडप्लेक्स और अन्य सहयोगी वातावरण पर कई समाधान हैं। परियोजनाओं के लिए लाइसेंस देने योग्य है, लेकिन परियोजना आमतौर पर बहुत हल्के या बहुत भारी होने के कारण समाप्त हो जाती है। हम "बस सही है" के अपने गेंडा का पीछा कर रहे हैं।
आदर्श रूप में, मैं इस तरह से कुछ का उपयोग करके माप की एक नई इकाई को परिभाषित कर सकता हूं:
UOM myUom1 = नया UOM (10, वोल्ट);
UOM myUom2 = नया UOM (43.2, न्यूटन);
बेशक, हम अपने ग्राहकों की जरूरतों के आधार पर इंपीरियल और एसआई इकाइयों के मिश्रण का उपयोग करते हैं।
हमें भविष्य के डेटाबेस टेबल के साथ इकाइयों की इस संरचना को भी संतुलित रखने की आवश्यकता है ताकि हम अपने डेटा के भीतर भी समान स्थिरता प्रदान कर सकें।
इकाइयों, व्युत्पन्न इकाइयों, और दरों को परिभाषित करने का सबसे अच्छा तरीका क्या है जो हमें माप वर्ग की हमारी इकाई बनाने के लिए उपयोग करने की आवश्यकता है? मैं एक या एक से अधिक एनम का उपयोग करते हुए देख सकता था, लेकिन यह अन्य डेवलपर्स के लिए निराशाजनक हो सकता है। एक एकल एनम 200+ प्रविष्टियों के साथ बहुत बड़ा होगा, जबकि कई एनम एसआई बनाम इंपीरियल इकाइयों के आधार पर भ्रमित हो सकते हैं और यूनिट के वर्गीकरण पर आधारित अतिरिक्त ब्रेकडाउन हो सकते हैं।
मेरी कुछ चिंताओं को दर्शाने वाले उदाहरण:
myUnits.Volt
myUnits.Newton
myUnits.meterSIUnit.meter
ImpUnit.foot DrvdUnit.Newton
DrvdUnitSI.Newton
DrvdUnitImp.FtLbs
उपयोग में इकाइयों का हमारा सेट बहुत अच्छी तरह से परिभाषित है और यह एक परिमित स्थान है। जब हम उनके लिए ग्राहक की मांग रखते हैं तो हमें नई व्युत्पन्न इकाइयों या दरों को विस्तारित करने और जोड़ने की क्षमता की आवश्यकता होती है। परियोजना C # में है, हालांकि मुझे लगता है कि व्यापक डिजाइन पहलू कई भाषाओं पर लागू होते हैं।
मैंने जिन पुस्तकालयों को देखा उनमें से एक में स्ट्रिंग के माध्यम से इकाइयों के मुफ्त-फॉर्म इनपुट की अनुमति है। उनके UOM वर्ग ने तब स्ट्रिंग को पार किया और उसी के अनुसार चीजों को स्लेट किया। इस दृष्टिकोण के साथ चुनौती यह है कि यह डेवलपर को यह सोचने और याद रखने के लिए मजबूर करता है कि सही स्ट्रिंग प्रारूप क्या हैं। और मैं रनटाइम त्रुटि / अपवाद के जोखिम को चलाता है अगर हम कंस्ट्रक्टर में पारित होने वाले तार को मान्य करने के लिए कोड के भीतर अतिरिक्त चेक नहीं जोड़ते हैं।
एक अन्य पुस्तकालय ने अनिवार्य रूप से बहुत सारे वर्ग बनाए, जिन्हें डेवलपर के साथ काम करना होगा। एक बराबर UOM के साथ-साथ यह एक प्रदान की DerivedUnit
और RateUnit
और इतने पर। अनिवार्य रूप से, समस्याओं को हल करने के लिए कोड अत्यधिक जटिल था। वह पुस्तकालय अनिवार्य रूप से किसी भी: किसी भी संयोजन (जो कि इकाइयों की दुनिया में वैध है) को अनुमति देगा, लेकिन हम हर संभव संयोजन की अनुमति नहीं देकर हमारे मुद्दे (हमारे कोड को सरल बनाने) की गुंजाइश के लिए खुश हैं।
अन्य पुस्तकालय हास्यास्पद रूप से सरल थे और उदाहरण के लिए ऑपरेटर को ओवरलोडिंग भी नहीं मानते थे।
इसके अलावा, मैं गलत रूपांतरणों के प्रयासों के बारे में चिंतित नहीं हूं (उदाहरण के लिए: वोल्ट से मीटर)। देवता केवल वे हैं जो इस स्तर पर इस स्तर पर पहुंचेंगे और हमें उन प्रकार की गलतियों से बचाने की आवश्यकता नहीं है।