आइए एक और उदाहरण लेते हैं जो अवधारणाओं और अपेक्षाओं से कमतर है। मुझे यहां एक एनम मिला है, और यह बग के लिए प्राथमिकताओं का सेट है।
डेटाबेस में आप किस मूल्य का भंडारण कर रहे हैं?
तो, मैं भंडारण किया जा सकता है 'C'
, 'H'
, 'M'
, और 'L'
डेटाबेस में। या 'HIGH'
इत्यादि। इससे कड़े टाइप किए गए डेटा की समस्या है । मान्य मानों का एक ज्ञात सेट है, और यदि आप उस सेट को डेटाबेस में संग्रहीत नहीं कर रहे हैं , तो इसके साथ काम करना मुश्किल हो सकता है।
आप कोड में डेटा क्यों स्टोर कर रहे हैं?
आपको List<String> priorities = {'CRITICAL', 'HIGH', 'MEDIUM', 'LOW'};
कोड में उस प्रभाव के लिए कुछ मिला है । इसका मतलब है कि आपको इस डेटा के विभिन्न मानचित्रण उचित प्रारूप में मिल गए हैं (आप डेटाबेस में सभी कैप्स डाल रहे हैं, लेकिन आप इसे प्रदर्शित कर रहे हैं Critical
)। आपका कोड अब स्थानीय बनाना भी मुश्किल है। आपने एक स्ट्रिंग को विचार का डेटाबेस प्रतिनिधित्व बाध्य किया है जो कोड में संग्रहीत है।
कहीं भी आपको इस सूची तक पहुंचने की आवश्यकता है, आपको या तो कोड डुप्लीकेशन की आवश्यकता है या स्थिरांक का एक वर्ग है। जिनमें से न तो अच्छे विकल्प हैं। एक को यह भी नहीं भूलना चाहिए कि अन्य एप्लिकेशन हैं जो इस डेटा का उपयोग कर सकते हैं (जो अन्य भाषाओं में लिखा जा सकता है - जावा वेब एप्लिकेशन में क्रिस्टल रिपोर्ट रिपोर्टिंग सिस्टम का उपयोग किया गया है और एक पर्ल बैच नौकरी डेटा इसमें खिलाता है)। रिपोर्टिंग इंजन को डेटा की वैध सूची (क्या होता है अगर 'LOW'
प्राथमिकता में कुछ भी चिह्नित नहीं है और आपको यह जानना होगा कि रिपोर्ट के लिए एक वैध प्राथमिकता है?); और बैच की नौकरी के बारे में जानकारी होगी कि क्या मान्य है? मान हैं।
Hypothetically, आप कह सकते हैं "हम एक एकल-भाषा की दुकान हैं - सबकुछ जावा में लिखा है" और एक एकल .jar है जिसमें यह जानकारी है - लेकिन अब इसका मतलब है कि आपके आवेदन एक-दूसरे से कसकर जोड़े हुए हैं। आँकड़े। हर बार परिवर्तन होने पर आपको वेब एप्लिकेशन के साथ रिपोर्टिंग भाग और बैच अपडेट भाग को जारी करना होगा - और आशा है कि यह रिलीज सभी भागों के लिए सुचारू रूप से चले।
क्या होता है जब आपका बॉस दूसरी प्राथमिकता चाहता है?
तुम्हारा बॉस आज तक आया था। एक नया प्राथमिकता है - CEO
। अब आपको सभी कोड को बदलना होगा और एक recompile और redeploy करना होगा।
'Enum-in-the-table' दृष्टिकोण के साथ, आप नई प्राथमिकता के लिए enum सूची को अपडेट करते हैं। सूची को प्राप्त करने वाले सभी कोड इसे डेटाबेस से खींचते हैं।
डेटा शायद ही कभी अकेले खड़ा होता है
प्राथमिकताओं के साथ, अन्य तालिकाओं में डेटा कुंजियाँ जिनमें वर्कफ़्लो के बारे में जानकारी हो सकती है, या जो इस प्राथमिकता या व्हाट्सएप को सेट कर सकते हैं।
लिंग पर वापस जाना जैसा कि सवाल में थोड़ा सा बताया गया है: लिंग के उपयोग में सर्वनामों की एक कड़ी है: he/his/him
और she/hers/her
... और आप कोड में ही कठिन कोडिंग से बचना चाहते हैं। और फिर आपका बॉस आता है और आपको 'OTHER'
लिंग जोड़ने की आवश्यकता होती है (इसे सरल रखने के लिए) और आपको इस लिंग से संबंधित होने की आवश्यकता है they/their/them
... और आपका बॉस देखता है कि फेसबुक के पास क्या है और ... ठीक है, हाँ।
एनम टेबल के बजाए खुद को कड़े टाइप किए गए डेटा तक सीमित करके, अब आपको डेटा और उसके अन्य बिट्स के बीच इस संबंध को बनाए रखने के लिए अन्य स्ट्रिंग के एक समूह में उस स्ट्रिंग को दोहराने की आवश्यकता है।
अन्य डेटास्टोर्स के बारे में क्या?
कोई फर्क नहीं पड़ता कि आप इसे कहाँ संग्रहीत करते हैं, वही सिद्धांत मौजूद है।
- आपके पास एक फ़ाइल हो सकती है
priorities.prop
, जिसमें प्राथमिकताओं की सूची है। आप एक संपत्ति फ़ाइल से इस सूची को पढ़ें।
आपके पास एक डॉक्यूमेंट स्टोर डेटाबेस (जैसे काउचडीबी ) हो सकता है, जिसके लिए एक प्रविष्टि है enums
(और फिर जावास्क्रिप्ट में एक सत्यापन फ़ंक्शन लिखें ):
{
"_id": "c18b0756c3c08d8fceb5bcddd60006f4",
"_rev": "1-c89f76e36b740e9b899a4bffab44e1c2",
"priorities": [ "critical", "high", "medium", "low" ],
"severities": [ "blocker", "bad", "annoying", "cosmetic" ]
}
आपके पास एक स्कीमा की एक XML फ़ाइल हो सकती है:
<xs:element name="priority" type="priorityType"/>
<xs:simpleType name="priorityType">
<xs:restriction base="xs:string">
<xs:enumeration value="critical"/>
<xs:enumeration value="high"/>
<xs:enumeration value="medium"/>
<xs:enumeration value="low"/>
</xs:restriction>
</xs:simpleType>
मूल विचार एक ही है। डेटा स्टोर ही वह जगह है जहां वैध मूल्यों की सूची को संग्रहीत और लागू करने की आवश्यकता होती है। यहां रखने से, कोड और डेटा के बारे में तर्क करना आसान हो जाता है। आपको हर समय आपके पास क्या है इसकी रक्षात्मक जाँच करने के बारे में चिंता करने की ज़रूरत नहीं है (क्या यह ऊपरी मामला है? या कम? chritical
इस कॉलम में एक प्रकार क्यों है ? आदि ...) क्योंकि आप जानते हैं कि आप डेटास्टर से वापस क्या प्राप्त कर रहे हैं। ठीक उसी तरह, जिस पर दातास्टोर आपको भेजने की उम्मीद कर रहा है अन्यथा - और आप मान्य मूल्यों की सूची के लिए डाटासटोर को क्वेरी कर सकते हैं।
टेकअवे
मान्य मानों का समूह डेटा है , कोड नहीं। आपको DRY कोड के लिए प्रयास करने की आवश्यकता है - लेकिन दोहराव का मुद्दा यह है कि आप कोड को डेटा को डुप्लिकेट कर रहे हैं , बजाय इसके स्थान को डेटा के रूप में सम्मान करने और डेटाबेस में संग्रहीत करने के बजाय।
यह डेटास्टोर के खिलाफ कई एप्लिकेशन को लिखना आसान बनाता है और ऐसे उदाहरणों से बचता है जहां आपको हर उस चीज़ को तैनात करने की आवश्यकता होगी जो डेटा के साथ खुद को कसकर जोड़े हुए है - क्योंकि आपने अपना कोड डेटा पर युग्मित नहीं किया है।
यह परीक्षण अनुप्रयोगों को आसान बनाता है क्योंकि CEO
प्राथमिकता शामिल होने पर आपको पूरे आवेदन को पुनः प्राप्त नहीं करना पड़ता है - क्योंकि आपके पास कोई कोड नहीं है जो प्राथमिकता के वास्तविक मूल्य की परवाह करता है।
कोड और डेटा के बारे में स्वतंत्र रूप से एक-दूसरे से सक्षम होने के कारण रखरखाव करते समय बग को ढूंढना और ठीक करना आसान हो जाता है।