YAGNI बनाम हार्ड-कोडित मूल्यों और रक्षात्मक डिजाइन को हटाना


10

पहले, थोड़ी सी पृष्ठभूमि। मैं आयु -> दर से एक लुकिंग कोडिंग कर रहा हूं। 7 आयु वर्ग हैं, इसलिए 7 पंक्तियों के साथ लुकअप टेबल 3 कॉलम (From | To | Rate) है। मान शायद ही कभी बदलते हैं - वे विधायी दर (पहले और तीसरे स्तंभ) हैं जो 3 साल तक एक ही रहे हैं। मुझे लगा कि इस तालिका को हार्ड-कोडिंग के बिना स्टोर करने का सबसे आसान तरीका यह है कि यह एक वैश्विक कॉन्फ़िगरेशन तालिका में डेटाबेस में है, सीएसवी युक्त एक एकल पाठ मान के रूप में (इसलिए "65,69,0.05,70,74,0.06" है 65-69 और 70-74 टियर संग्रहित किया जाएगा)। फिर उपयोग करने के लिए अपेक्षाकृत आसान है।

तब मुझे एहसास हुआ कि इसे लागू करने के लिए मुझे एक नई तालिका बनानी होगी, इसके चारों ओर लपेटने के लिए एक रिपॉजिटरी, रेपो के लिए डेटा लेयर टेस्ट, कोड के चारों ओर यूनिट टेस्ट जो CSV को टेबल में अनफ्लैट करता है, और लुकअप के चारों ओर परीक्षण करता है। इस सभी कार्य का एकमात्र लाभ लुकअप तालिका को हार्ड-कोड करने से बचना है।

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

सिवाय जब मुझे लगता है कि YAGNI । मैं जिस सुविधा को लागू कर रहा हूं वह यह निर्दिष्ट नहीं करती है कि दरें बदल जाएंगी। यदि दरों में बदलाव होता है, तो वे अभी भी शायद ही कभी बदलेंगे कि रखरखाव भी एक विचार नहीं है, और यह सुविधा वास्तव में महत्वपूर्ण नहीं है कि दर परिवर्तन और अद्यतन किए गए एप्लिकेशन के बीच देरी होने पर कुछ भी प्रभावित होगा।

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

संपादित करें प्रश्न को स्पष्ट करने के लिए, मैं वास्तविक कार्यान्वयन के बारे में चिंतित नहीं हूं। मुझे चिंता है कि मैं या तो एक त्वरित, बुरा काम कर सकता हूं, और YAGNI कहकर इसे सही ठहरा सकता हूं, या मैं अधिक रक्षात्मक, उच्च प्रयास वाला तरीका अपना सकता हूं, यहां तक ​​कि सबसे अच्छे मामले में अंततः कम लाभ होता है। एक पेशेवर प्रोग्रामर के रूप में एक डिजाइन को लागू करने का मेरा निर्णय जो मुझे पता है कि त्रुटिपूर्ण है बस एक लागत / लाभ विश्लेषण के लिए नीचे आते हैं?

संपादित करें जबकि मुझे लगता है कि सभी उत्तर बहुत दिलचस्प थे क्योंकि मुझे लगता है कि यह किसी व्यक्ति के डिजाइन विकल्पों के लिए नीचे आता है, मुझे लगता है कि सबसे अच्छे उत्तर @ कॉर्बिन और @ ईजेड हार्ट थे क्योंकि वे उन चीजों को लाते हैं जिन्हें मैंने प्रश्न में नहीं माना था:

  • डेटाबेस बनाम 'कुशलता से YAGNI को कुशलतापूर्वक लागू करने' को स्थानांतरित करके 'हार्ड-कोडेड मानों को सही ढंग से हटाने' का झूठा द्वैतवाद। ऐप कॉन्फ़िगरेशन में लुकअप टेबल को डालने का एक तीसरा विकल्प था, जो सही तरीके से ओवरहेड को लाइक नहीं करता है, और YAGNI की दक्षता के बिना। हम आम तौर पर या तो / या निर्णय तक ही सीमित नहीं होते हैं, और फिर यह एक लागत / लाभ निर्णय के लिए नीचे आता है।
  • कोड पीढ़ी डेटाबेस में हार्ड-कोडित मानों को स्थानांतरित करने के ओवरहेड को कम कर सकती है, और एक तरह से CSV को तालिका में संसाधित करने के लिए मेरे अति-इंजीनियर निर्णय को भी हटा देती है। संभावित रूप से यह भी उत्पन्न कोड के साथ एक लंबी अवधि के रखरखाव के मुद्दे को जोड़ता है यदि लुकअप विधि के लिए बुनियादी आवश्यकताएं बदल जाती हैं। यह सब सिर्फ लागत / लाभ विश्लेषण को प्रभावित करता है, और यह संभावना है कि अगर मेरे पास वह स्वचालन उपलब्ध होता तो मैं इस तरह के हार्ड-कोडिंग पर भी विचार नहीं करता।

मैं @ कॉर्बिन के उत्तर को सही के रूप में चिह्नित कर रहा हूं क्योंकि यह मेरी विकास लागत की धारणाओं को बदल देता है, और मैं शायद निकट भविष्य में अपने शस्त्रागार में कुछ कोड पीढ़ी के उपकरण जोड़ूंगा।


मत भूलो, अगर दरें बदलती हैं और आपके पास सभी कठोर कोडित मूल्य हैं, तो आप ऐतिहासिक रिकॉर्ड गणना को गड़बड़ कर सकते हैं जब दरें बदल जाती हैं (और वे करेंगे, भले ही आपका ग्राहक आपको बता रहा हो)।
एंडी

जवाबों:


6

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

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

ओह, और अपने डेटा को एक ऐसे प्रारूप में संग्रहीत न करें जिसमें अतिरिक्त प्रसंस्करण (CSV) की आवश्यकता हो। यह सिर्फ अतिरिक्त कदम जोड़ता है जिसे आपके ध्यान और परीक्षण की आवश्यकता होती है।


मैं यह नहीं कहूंगा कि एक रेल प्रवासन मॉडल से तालिकाओं का निर्माण करता है ... रेल प्रवासन तालिकाओं में परिवर्तन का वर्णन करते हैं। माइग्रेशन निष्पादित करने से डेटाबेस बदलता है। तालिका संरचना से मेल खाते मॉडल गुण रन टाइम पर बनाए जाते हैं।
केविन क्लाइन

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

सवाल यह था, "क्या मुझे अपने ग्राहक को कठोर-कोड मान देना चाहिए जब वे कहते हैं कि वे नहीं बदलेंगे?" और आपका जवाब "नहीं, और वास्तव में आपको समस्या पर एक ओआरएम फेंकना चाहिए।" मैं असहमत हूं। ऐसे सरल विकल्प हैं जो ओपी को हार्ड-कोडिंग से बचने की अनुमति देंगे। स्पष्ट रूप से अनावश्यक रूप से नामित चीजों का समर्थन करने के लिए वास्तुकला में बड़े जोड़ बनाना अनैतिक है। यह दुर्भाग्यपूर्ण है कि कई डेवलपर्स ऐसे काम करने के लिए पहले से तैयार हैं। और मुझे कहना चाहिए, मैं आपके सुझाव से 100% असहमत हूं कि "भावना को मत छोड़ो, 'वाह, यह गर्दन में दर्द है' आपको सही काम करने से रोकता है।" वो भावनाएं मायने रखती हैं!
user1172763

10

की-ऑफ और विस्तार करने के लिए @ Thorbjørn Ravn Andersen का जवाब: गणना / लुकअप को एक जगह पर रखना एक अच्छी शुरुआत है।

रक्षात्मक बनाम YAGNI की आपकी विचार प्रक्रिया एक आम समस्या है। इस मामले में, मैं सुझाव दूंगा कि इसे दो और चीजों से सूचित किया जाए।

सबसे पहले - उपयोगकर्ता की आवश्यकता को कैसे प्रस्तुत किया गया था? क्या उन्होंने दरों की संपादन क्षमता निर्दिष्ट की थी? यदि नहीं, तो कुछ जोड़ा गया जटिलता हिस्सा है जिसे आप बिल कर सकते हैं या नहीं? (या यदि आप कर्मचारियों पर हैं, कि आप इसके बजाय अन्य काम करने में अपना समय व्यतीत कर सकते हैं?) यदि ऐसा है, तो निश्चित रूप से आगे बढ़ें और वितरित करें जो यथोचित रूप से पूछा गया था।

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

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

शुभ लाभ


1
अपने दूसरे बिंदु के लिए +1। भविष्य में विधायी निकाय क्या कर सकते हैं, मैं इसे स्पष्ट करने की कोशिश नहीं करता।
डेविड थॉर्नले

इसे लाइब्रेरी फंक्शन में करें। केवल एक उपयोगकर्ता होना ठीक है। आवश्यकताएं कब और क्यों बदलती हैं, आपके पास बदलने के लिए एक जगह है। (आपको किसी विशेष तिथि के रूप में मान के लिए लुकअप करने के लिए एक फ़ंक्शन जोड़ने की आवश्यकता हो सकती है।)
BillThor

सबसे अच्छा और सबसे पूर्ण उत्तर, +1
एंडी

7

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


लुकअप केवल एक ही स्थान पर लागू किया जाएगा (एक PensionRateLookupवर्ग की तरह शायद) जो तब वैश्विक स्तर पर उपयोग किया जाता है। मैं यह करूंगा कि चाहे वह ऐप के बाहर संग्रहीत हो या हार्डकोड, उस तरह से केवल PensionRateLookupकक्षा के कार्यान्वयन को बनाए रखने की आवश्यकता है। मेरी समस्या यह है कि मैंने YAGNI का उपयोग इस निष्कर्ष पर आने के लिए किया है कि लुकअप तालिका को हार्ड-कोडिंग करना स्वीकार्य है।
रेबेका स्कॉट

यद्यपि आपके उत्तर के लिए धन्यवाद। लुकअप कार्यान्वयन को एक स्थान पर रखना निश्चित रूप से अच्छा डिज़ाइन है।
रेबेका स्कॉट

YAGNI केवल मान्य है यदि आप दरों को बदलने पर नए बायनेरिज़ को शिप कर सकते हैं। यदि आप नहीं कर सकते हैं, लेकिन आप कॉन्फ़िगरेशन को बदल सकते हैं, तो इसे एक कॉन्फ़िगरेशन मान के रूप में वर्तमान टेक्स्टुअल प्रतिनिधित्व के साथ डिफ़ॉल्ट रूप में पढ़ा जा सकता है।

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

फिर समस्या क्या है? जब दरें बदल जाती हैं, तो आप सभी ग्राहकों को कोड और जहाज अपडेट करते हैं?

2

मुझे देखने दो कि क्या मुझे तुम्हारा प्रश्न सही लगा। किसी सुविधा को कार्यान्वित करने के लिए आपके पास 2 विकल्प हैं: या तो आप किसी मूल्य को हार्डकोड करते हैं और आपकी सुविधा को कार्यान्वित करना आसान है (btu आपको हार्डकोड भाग पसंद नहीं है) या आपके पास बहुत सारी चीजें "रिड्यू" करने का एक बहुत बड़ा प्रयास है जो किया जाता है तो आप एक साफ तरीके से आप को विकसित करने में सक्षम हैं। क्या वो सही है?

पहली बात जो मेरे दिमाग में आती है, "अच्छी प्रथाओं को जानने के बारे में सबसे महत्वपूर्ण बात यह है कि जब आप उनके बिना बेहतर होते हैं, तो यह जानते हैं"।

इस मामले में, प्रयास बहुत अधिक है इसलिए आप इसे साफ तरीके से कर सकते हैं, इस परिवर्तन के संपार्श्विक प्रभाव की संभावना बड़ी है और आपको जो रिटर्न मिलेगा वह छोटा है (जैसा कि आपने समझाया, यह संभावना है कि ऐसा नहीं होगा परिवर्तन)।

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

यह मेरा दृष्टिकोण होगा :)


धन्यवाद @ ऑस्कर। उस का तकनीकी हिस्सा डिफ है। सही बात। और मैं इस बात से सहमत हूं कि आप समस्या का समाधान कैसे करेंगे, केवल तभी जब यह आवश्यक हो। तो आप कह रहे हैं कि एक पेशेवर के रूप में हम अपने डिजाइन सिद्धांतों को चुन सकते हैं, केवल लागत / लाभ के आधार पर? समझ में आता है।
रेबेका स्कॉट

@ बेन स्कॉट: आपका स्वागत है :)। हां, मेरे विचार से, डिजाइन सिद्धांत बनाए गए / सूचीबद्ध नहीं किए गए क्योंकि वे सुंदर दिखते हैं, लेकिन क्योंकि वे कोड "निर्मलता", लचीलापन, मजबूती आदि जैसे लाभ लाते हैं, लेकिन हमेशा 2 प्रश्न होते हैं: 1- क्या मुझे इसकी आवश्यकता है ? 2- क्या मेरे प्रतिबंध (समय, तकनीकी, आदि) मुझे इसे लागू करने की अनुमति देते हैं? यह आमतौर पर मुझे अपने डिजाइन सिद्धांत को चुनने के लिए प्रेरित करता है। ओवर-इंजीनियरिंग भी खराब है;) पीएस: यदि आपको लगता है कि यह एक दिलचस्प जवाब है, तो कृपया इसे वोट करें ताकि अन्य लोग भी इसे उच्च संभावना के साथ पढ़ें। धन्यवाद! :)
JSBach


2

यह एक आइटम है जो "तब तक नहीं बदलेगा" जब तक यह नहीं करता है। यह अपरिहार्य है कि यह बदल जाएगा, लेकिन वह समय थोड़ा दूर हो सकता है।

आपका औचित्य सही है। इस समय, ग्राहक ने आसानी से उन दरों को बदलने की क्षमता नहीं मांगी। जैसे, YAGNI।

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

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

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


धन्यवाद @berin, मैंने प्रश्न में SRP का उल्लेख नहीं किया, लेकिन यह योजना में था। अच्छा बिंदु फिर से समस्या का स्वामित्व ग्राहक को दे रहा है।
रेबेका स्कॉट

भविष्य में जब चीजें गलत हो जाती हैं, तो उन्हें दोष देना मुझे पेशेवर नहीं लगता।
एंडी

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

@BerinLoritsch लेकिन यह विशेष रूप से डिजाइन का निर्णय घटिया भागों का उपयोग करते हुए कह रहा है "मैं इस लीक पाइप को प्लग करने के लिए प्लंबर पोटीन का उपयोग कर सकता हूं, यह आपका सबसे सस्ता विकल्प है!" दरों में परिवर्तन होगा। यह एक दिया है, और एक पेशेवर के लिए इसकी गैर जिम्मेदाराना एक प्रणाली है कि यह अनुमति नहीं देता है का निर्माण करने के लिए। और परियोजना की लागत की भव्य योजना में बचत शायद नगण्य है। एक तालिका में डेटा रखो; कोड जो लुकअप डेटा प्राप्त करता है वह थोड़ा अलग होता है, तर्क यह बताता है कि किस दर से उपयोग किया जाना है। एकमात्र अन्य निर्णय यह है कि ऐतिहासिक डेटा को कैसे संभालना है ...
एंडी

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

2

अंतर को विभाजित करें और एक कॉन्फ़िगरेशन सेटिंग में दर डेटा डालें। आप CSV प्रारूप का उपयोग कर सकते हैं, जो आपने पहले ही प्राप्त कर लिया है, आप अनावश्यक डेटाबेस ओवरहेड से बचते हैं, और यदि परिवर्तन कभी आवश्यक है, तो यह एक ऐसा बदलाव होगा जिसे ग्राहक को पुन: स्थापित / पुन: स्थापित करने और बिना गड़बड़ किए बिना सक्षम होना चाहिए डेटाबेस में चारों ओर - वे सिर्फ विन्यास फाइल को संपादित कर सकते हैं।

आमतौर पर जब आप दो चरम सीमाओं के बीच चयन को देखते हैं (YAGNI बनाम हार्ड-कोडिंग डायनामिक डेटा का उल्लंघन करते हैं), तो सबसे अच्छा उत्तर कहीं बीच में होता है। झूठी द्वंद्वों से सावधान रहें।

यह मानता है कि आपका सभी विन्यास फाइलों में है; अगर यह रजिस्ट्री की तरह कहीं मुश्किल है, तो आपको शायद इस सलाह की उपेक्षा करनी चाहिए :)


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

यदि आपने इसे केंद्रीकृत तर्क के अन्य सुझावों के साथ जोड़ दिया तो यह एक महान जवाब है। यह वास्तव में कट्टर को देखने के बजाय एक तरह से डालने की अनुमति देता है जो इसे विन्यास के माध्यम से बदलने की अनुमति देता है। जब भी कोई अन्य डेवलपर इसके पार आता है तो वे इसके लिए आपसे नफरत करेंगे। यहां तक ​​कि एक आदमी विकास की दुकान पर विचार करना चाहिए कि क्या होता है अगर वे बस से टकरा जाते हैं और अगले देव के लिए पूर्ण सॉफ्टवेयर रिलीज के बिना मूल्यों को बदलना आसान हो जाता है। केवल तभी जब आप क्लाइंट से घृणा करते हैं और अन्य सभी डेवलपर्स से नफरत करते हैं, तो आपको इसे कट्टर बनाना चाहिए। तो मूल रूप से कभी नहीं।
simbo1905

2

मुझे लगा कि इस तालिका को हार्ड-कोडिंग के बिना स्टोर करने का सबसे आसान तरीका यह है कि यह एक वैश्विक कॉन्फ़िगरेशन तालिका में डेटाबेस में है, सीएसवी युक्त एक एकल पाठ मान के रूप में (इसलिए "65,69,0.05,70,74,0.06" है 65-69 और 70-74 स्तरों को संग्रहीत किया जाएगा।

बस एक DB तालिका बनाई। (आप जहां एक दायर में एक पूरी तालिका को संग्रहीत करने की सोच रहे हैं, क्या आप पागल हो गए हैं?)

तालिका को 2 फ़ील्ड की आवश्यकता नहीं है। 3. आयु और दर। इस अगली पंक्ति में ऊपरी मूल्य शामिल है! आप इसे जाने बिना भी सामान्य कर रहे हैं!

यहाँ 67 वर्ष की आयु के लिए दर प्राप्त करने के लिए Sql है।

Select * from RateTable where Age in (Select max(age) from RateTable where age <=67) 

एक रखरखाव स्क्रीन बनाने के लिए परेशान मत करो क्योंकि यह दायरे से बाहर है। यदि वे बाद में इसके लिए कहते हैं, तो एक परिवर्तन अनुरोध जारी करें और इसे करें।

संपादित करें: जैसा कि दूसरों ने कहा है कि पूरी दर संरचना का पीछा करने की स्थिति में कोड को दर केंद्रीकृत रखा जाता है ।


हाय @ मॉरन्स, आपके उत्तर के लिए धन्यवाद। तालिका को वास्तव में 3 कॉलम की आवश्यकता होगी। यह प्रति एक एकल दर है रेंज उम्र के, अधिकतम उम्र (65 69 वर्ष की आयु वाले 5% पर हैं) के लिए न्यूनतम उम्र। और मैं केवल एक सीमित उद्देश्य के लिए डेटा की एक छोटी राशि का भंडारण कर रहा हूं, इसलिए संरचना को फिर से बनाने और एक संपूर्ण समर्पित तालिका के बजाय सीएसवी के लिए जाने में क्या गलत है? मैं शायद एक पंक्ति सीमांकक जोड़ूंगा, और फिर पंक्ति से विभाजित होकर कॉलम और कॉलम को आवश्यक फ़ील्ड में खींचूंगा। यह हमेशा पढ़ा लिखा होने वाला है, इसलिए मैं एक पूर्ण तालिका के बारे में बहुत चिंतित नहीं हूं।
रेबेका स्कॉट

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

आह सच। मैं स्रोत सामग्री के समान ही तालिका रख रहा था ... और मैंने याद किया कि आपके उत्तर में उम्र ऊपरी सीमा है क्योंकि मेरे पास आपके द्वारा दिए गए sads हैं।
रेबेका स्कॉट

1
"आप इसे जाने बिना भी ध्वस्त कर रहे हैं!" - सबसे पहले मैंने सोचा कि यह एक टाइपो था और इसका मतलब था कि आप 'वंचितीकरण' कर रहे हैं, लेकिन जितना अधिक मैं इसके बारे में सोचता था उतना ही लगता था कि आप सही तरीके से हो सकते हैं :)
ईज़ी हार्ट

@ हर्ट हार्ट सही है।
रेबेका स्कॉट

1

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

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

यह ठीक से प्रश्न को संबोधित नहीं करता है, क्योंकि आप YAGNI पर सवाल उठा रहे हैं, लेकिन मुझे लगता है कि यह चुस्त नियमों के सामान्य लचीलेपन के लिए बोलता है। चुस्त की स्थिति के लिए अनुकूल है और आगे बढ़ना है।


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

0

एक फ़ंक्शन में हार्ड कोड।

  • जब मान बदलते हैं, तो आप ग्राहक को फिर से बिल भेज सकते हैं
  • जब मान बदलते हैं, तो संभावना है कि तालिका प्रारूप को बदलना होगा, सीएसवी करने से समय बर्बाद होगा
  • लागू करने में आसान, वर्तमान अनुबंध के साथ बजट पर होने की अधिक संभावना
  • आसानी से मिल सकता है जब इसे अपडेट करने की आवश्यकता होगी

मुझे इस घटिया मान को स्थापित करने दें ताकि जब मैं निश्चित रूप से एक वर्ष में टूट जाऊं तो मुझे बार-बार व्यापार मिलता है। यह छायादार लगता है, क्योंकि यह है।
एंडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.