जब आदिम जुनून एक कोड गंध नहीं है?


22

मैंने हाल ही में बहुत सारे लेख पढ़े हैं जो एक कोड गंध के रूप में आदिम जुनून का वर्णन करते हैं

आदिम जुनून से बचने के दो लाभ हैं:

  1. यह डोमेन मॉडल को अधिक स्पष्ट बनाता है। उदाहरण के लिए, मैं एक व्यापार कोड के बारे में पोस्ट कोड के बारे में एक स्ट्रिंग के बजाय एक पोस्ट कोड से बात कर सकता हूं।

  2. सभी सत्यापन आवेदन के पार एक ही स्थान पर हैं।

वहाँ बहुत सारे लेख हैं जो वर्णन करते हैं कि यह एक कोड गंध है। उदाहरण के लिए, मैं इस तरह एक पोस्ट कोड के लिए आदिम जुनून को दूर करने का लाभ देख सकते हैं:

public class Address
{
    public ZipCode ZipCode { get; set; }
}

यहाँ ZipCode के निर्माता हैं:

public ZipCode(string value)
    {
        // Perform regex matching to verify XXXXX or XXXXX-XXXX format
        _value = value;
    }

आप DRY सिद्धांत को तोड़ रहे होंगे, जिसमें हर जगह एक ज़िप कोड का उपयोग किया जाता है।

हालांकि, निम्नलिखित वस्तुओं के बारे में क्या:

  1. जन्मतिथि: यह जांचें कि मानसिकता से अधिक और आज की तारीख से कम।

  2. वेतन: जाँच करें कि शून्य से अधिक या उसके बराबर है।

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

मुझे लगता है कि मैं एक वर्ग के बजाय एक प्रकार का उपनाम बना सकता हूं, जो ऊपर दिए गए बिंदु के साथ मदद करेगा।


8
"आप DRY सिद्धांत को तोड़ रहे होंगे, जिसमें हर जगह एक ज़िप कोड का उपयोग किया जाता है।" वह सत्य नहीं है। डेटा को आपके मॉड्यूल में दर्ज करते ही सत्यापन किया जाना चाहिए । अगर वहाँ एक "प्रवेश बिंदु" की तुलना में अधिक मान्यता एक में होना चाहिए है पुन: प्रयोज्य इकाई , और कहा कि हो सकता है की जरूरत नहीं है (और न ही होना चाहिए) डीटीओ ...
टिमोथी दबना

1
आप "माइंडेट" और "आज की तारीख" को DateOfBirthइसके खिलाफ जाँचने के लिए कैसे दे रहे हैं ?
केलथ

11
कस्टम प्रकार बनाने का एक अन्य लाभ प्रकार की सुरक्षा है। यदि आपके पास Salaryऔर Distanceवस्तु है तो आप गलती से उनका उपयोग नहीं कर सकते हैं। आप कर सकते हैं यदि वे दोनों प्रकार के हैं double
स्क्रूज 1

3
@ w0051977 आप कथन (जैसा कि मैंने इसे समझा था) का अर्थ है कि डीटीओ कंस्ट्रक्टर में मान्यता के अलावा और कुछ भी DRY का उल्लंघन होगा। वास्तव में सत्यापन डीटीओ के बाहर होना चाहिए ...
टिमोथी ट्रोपल

2
मेरे लिए यह सब गुंजाइश की बात है। यदि आप आदिमों को एक व्यापक गुंजाइश देते हैं, तो ऐसे कई तरीके हैं जिनमें उनका दुरुपयोग और दुरुपयोग किया जा सकता है। इसलिए आप आम तौर पर उन्हें एक संकरा दायरा देना चाहते हैं, और ऐसा करने का एक तरीका यह है कि एक क्लास को डिजाइन किया जाए, जो एक अवधारणा का प्रतिनिधित्व करते हुए एक आदिम का उपयोग करते हुए, निजी तौर पर एक आंतरिक के रूप में संग्रहीत होता है, इसे लागू करने के लिए। अब आदिम का दायरा संकीर्ण है और इसका दुरुपयोग / दुरुपयोग होने की संभावना नहीं है, और आप प्रभावी रूप से आक्रमणकारियों को बनाए रख सकते हैं। लेकिन अगर आदिम का दायरा शुरू करने के लिए संकीर्ण था, तो यह ओवरकिल हो सकता है और बनाए रखने के लिए बहुत सारे अतिरिक्त युग्मन और कोड पेश कर सकता है।

जवाबों:


17

आदिम जुनून डोमेन विचारों का प्रतिनिधित्व करने के लिए आदिम डेटा प्रकारों का उपयोग कर रहा है।

इसके विपरीत "डोमेन मॉडलिंग", या शायद "ओवर इंजीनियरिंग" होगा।

क्या आप एक DateOfBirth ऑब्जेक्ट और एक वेतन ऑब्जेक्ट बनाएंगे?

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

DateOfBirth के लिए, शायद - विचार करने के लिए दो मुद्दे हैं। सबसे पहले, एक गैर-आदिम तिथि बनाने से आपको तारीख गणित के आसपास सभी अजीब चिंताओं को केंद्र में रखने की जगह मिलती है। कई भाषाओं में से एक बॉक्स प्रदान करता है; डेटटाइम , java.util.Date । ये तारीखों के डोमेन अज्ञेय कार्यान्वयन हैं, लेकिन वे आदिम नहीं हैं।

दूसरा, DateOfBirthवास्तव में तारीख का समय नहीं है; यहाँ अमेरिका में, "जन्म तिथि" एक सांस्कृतिक निर्माण / कानूनी कथा है। हम एक व्यक्ति के जन्म की स्थानीय तारीख से जन्म की तारीख को मापते हैं ; बॉब, कैलिफोर्निया में पैदा हुए, उनके पास एलिस की तुलना में "पहले" जन्म की तारीख हो सकती है, जो न्यूयॉर्क में पैदा हुई, भले ही वह दो में से छोटी हो

क्या एक नियम है जो बताता है कि कब और कब आदिम जुनून को दूर करना चाहिए या यदि संभव हो तो हमेशा करना चाहिए।

निश्चित रूप से हमेशा नहीं; सीमाओं पर, एप्लिकेशन ऑब्जेक्ट ओरिएंटेड नहीं हैंपरीक्षणों में व्यवहारों का वर्णन करने के लिए उपयोग की जाने वाली आदिमताओं को देखना काफी आम है ।


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

न तो C # DateTime और न ही java.util.Date DateOfBirth के लिए उपयुक्त अंतर्निहित प्रकार हैं।
केविन क्लाइन

हो सकता है कि इसके java.util.Dateसाथjava.time.LocalDate
कोरय तुगे

7

ईमानदार होना: यह निर्भर करता है।

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

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


क्या एक प्रकार उर्फ ​​एक अच्छा विकल्प है?
w0051977

@ w0051977 मैं charonx और प्रकार उर्फ से सहमत एक विकल्प हो सकता है
techagrammer

@ w0051977 एक प्रकार का उर्फ ​​एक विकल्प हो सकता है यदि प्राथमिक उद्देश्य सख्त टाइपिंग को लागू करना है, यह स्पष्ट रूप से बताना है कि "फ्लोट डॉलर" (प्रति घंटा? सप्ताह? महीना?) के आकस्मिक असाइनमेंट से बचने के लिए एक निश्चित मूल्य (वेतन) क्या है? "फ्लोट सैलरी" (प्रति माह? वर्ष?)। यह वास्तव में इस बात पर निर्भर करता है कि आपकी जरूरतें क्या हैं।
चरनएक्स

@CharonX, मेरा मानना ​​है कि एक वेतन के लिए एक दशमलव का उपयोग किया जाना चाहिए न कि एक फ्लोट के लिए। क्या आप सहमत हैं?
w0051977

@ w0051977 यदि आपके पास एक अच्छा दशमलव प्रकार है, तो वह बेहतर होगा, हाँ। (मैं अभी एक C ++ प्रोजेक्ट पर काम कर रहा हूँ, इसलिए मेरे दिमाग में बूलियन्स, पूर्णांक और फ़्लोट्स सबसे आगे हैं)
CharonX

5

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

एक प्रकार का उपनाम एक हल्का विकल्प (घोष, 2017) हो सकता है, और जरूरत पड़ने पर एक इकाई वर्ग के लिए रिफलेक्ट किया जा सकता है। उदाहरण के लिए, पहले हमें इसकी आवश्यकता हो Salaryसकती है >=0, और बाद में $100.33333ऊपर और कुछ भी $10,000,000(जो ग्राहक को दिवालिया कर देगा) को अस्वीकार करने का निर्णय लेते हैं । Nonnegativeप्रतिनिधित्व Salaryऔर अन्य अवधारणाओं के लिए आदिम का उपयोग इस रीफैक्टरिंग को जटिल करेगा।

प्राइमरी से बचने से ओवर-इंजीनियरिंग से बचने में भी मदद मिल सकती है। मान लें कि हमें वेतन और जन्म तिथि को डेटा संरचना में संयोजित करना है: उदाहरण के लिए, कम विधि पैरामीटर या मॉड्यूल के बीच डेटा पास करने के लिए। फिर हम टाइप के साथ एक टपल का उपयोग कर सकते हैं (Salary, DateOfBirth)। वास्तव में, आदिम लोगों के साथ एक टापू (Nonnegative, Nonnegative)एकतरफा है, जबकि कुछ फूला हुआ class EmployeeDataअन्य लोगों के बीच आवश्यक क्षेत्रों को छिपाएगा। में हस्ताक्षर calcPension(d: (Salary, DateOfBirth))अधिक से अधिक ध्यान केंद्रित है calcPension(d: EmployeeData), जो इंटरफ़ेस अलगाव सिद्धांत का उल्लंघन करता है। इसी तरह, एक विशेष class SalaryAndDateOfBirthअजीब लगता है और शायद एक ओवरकिल है। बाद में, हम डेटा वर्ग को परिभाषित करने का विकल्प चुन सकते हैं; tuples और elemental डोमेन के प्रकार हमें इस तरह के फैसले को टाल देते हैं।

एक बाहरी परत (उदाहरण के लिए जीयूआई) में, यह उनके घटक प्राइमिटिव्स (जैसे डीएओ में डालने) के लिए संस्थाओं को "स्ट्रिप" करने के लिए समझ में आता है। यह मार्टिन (2018) में वकालत के रूप में बाहरी परतों में डोमेन अमूर्त रिसाव को रोकता है।

सन्दर्भ
ई। इवांस, "डोमेन-ड्रिवेन डिज़ाइन", 2004
डी। घोष, "फंक्शनल एंड रिएक्टिव डोमेन मॉडलिंग", 2017
आरसी मार्टिन, "क्लीन आर्किटेक्चर", 2018


सभी संदर्भों के लिए +1।
2200 पर w0051977

4

बेहतर आदिम जुनून से पीड़ित या एक वास्तुकला अंतरिक्ष यात्री होने के नाते ?

दोनों मामले पैथोलॉजिकल हैं, एक मामले में आपके पास बहुत कम सार हैं, पुनरावृत्ति के लिए अग्रणी है और आसानी से एक नारंगी के लिए एक सेब को गलत कर रहा है, और दूसरे में आप पहले से ही इसे रोकना भूल गए और काम करना शुरू कर देते हैं, जिससे कुछ भी प्राप्त करना मुश्किल हो जाता है। ।

लगभग हमेशा की तरह, आप संयम चाहते हैं, एक मध्यम रूप से अच्छी तरह से माना जाता है।

याद रखें कि एक संपत्ति में एक नाम होता है, एक प्रकार के अलावा। इसके अलावा, इसके घटक भागों में एक पते को विघटित करना भी हमेशा की तरह ही हो सकता है। सारी दुनिया NY नहीं है।


3

यदि आपके पास एक वेतन वर्ग है, तो यह ApplyRaise जैसे तरीके हो सकता है।

दूसरी ओर आपके ज़िपकोड वर्ग में आंतरिक डुप्लीकेशन होने से बचने के लिए हर जगह सत्यापन की नक़ल से बचने के लिए आपके पास एक ज़िपकोडविद्युतक वर्ग हो सकता है जिसे इंजेक्ट किया जा सकता है, इसलिए यदि आपका सिस्टम यूएस और यूके दोनों पर चलना है तो आप केवल इंजेक्शन लगा सकते हैं सही सत्यापनकर्ता और जब आपको AUS को संभालना होता है और साथ ही आप एक नया सत्यापनकर्ता जोड़ सकते हैं।

एक और चिंता यह है कि अगर आपको EntityFramework के माध्यम से एक डेटाबेस में डेटा लिखना है तो यह जानना होगा कि वेतन या ज़िप कोड को कैसे संभालना है।

इस बात का कोई स्पष्ट उत्तर नहीं है कि बुद्धिमान वर्ग कैसे होना चाहिए, इसके बीच की रेखा खींचना है, लेकिन मैं कहूंगा कि मैं व्यावसायिक तर्क को स्थानांतरित करने की प्रवृत्ति रखता हूं, जैसे व्यापार तर्क कक्षाओं में डेटा वर्ग शुद्ध डेटा होने के नाते ऐसा लगता है। EntityFramework के साथ बेहतर काम करने के लिए।

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


क्या एक प्रकार उर्फ ​​एक अच्छा विकल्प है?
w0051977

2

(प्रश्न वास्तव में क्या है)

कब आदिम प्रकार का उपयोग एक कोड गंध नहीं है?

(उत्तर)

जब पैरामीटर में नियम नहीं होते हैं - एक आदिम प्रकार का उपयोग करें।

की पसंद के लिए आदिम प्रकार का उपयोग करें:

htmlEntityEncode(string value)

की पसंद के लिए ऑब्जेक्ट का उपयोग करें:

numberOfDaysSinceUnixEpoch(SimpleDate value)

बाद के उदाहरण में इसके नियम हैं, अर्थात, वस्तु , और , SimpleDateसे मिलकर बनी है । इस मामले में ऑब्जेक्ट के उपयोग के माध्यम से, वैध होने की अवधारणा को ऑब्जेक्ट के भीतर समझाया जा सकता है।YearMonthDaySimpleDate


1

इस प्रश्न में कहीं और दिए गए ईमेल पतों या ज़िप कोड के विहित उदाहरणों के अलावा, जहाँ मुझे लगता है कि आदिम जुनून से दूर होना विशेष रूप से सहायक हो सकता है, इकाई आईडी (देखें https://andrewlock.net/use-strongly-pyped-entity) -ids-to-avoid-primitive-obsession-part-1 / इसे .NET में कैसे करें के उदाहरण के लिए)।

मैंने एक बग के क्रेप होने की संख्या की गिनती खो दी है क्योंकि एक विधि में इस तरह के हस्ताक्षर थे:

int leaveId = 12345;
int submitterId = 23456;
int approverId = 34567;

SubmitLeaveApplication(leaveId, approverId, submitterId);

public void SubmitLeaveApplication(int leaveId, int submitterId, int approverId) {
  // implementation here
}

संकलन ठीक है, और यदि आप अपनी इकाई परीक्षण के साथ कठोर नहीं हैं, तो वह भी पास हो सकता है। हालाँकि, उन इकाई आईडी को डोमेन-विशिष्ट वर्गों में रिफ्लेक्टर करता है, और हे प्रिस्टो, संकलन-टाइम त्रुटियाँ:

LeaveId leaveId = 12345;
SubmitterId submitterId = 23456;
ApproverId approverId = 34567;

SubmitLeaveApplication(leaveId, approverId, submitterId);

public void SubmitLeaveApplication(LeaveId leaveId, SubmitterId submitterId, ApproverId approverId) {
  // implementation here
}

कल्पना करें कि यह विधि 10 या अधिक मापदंडों तक बढ़ गई है, सभी intडेटा प्रकार (कभी भी लंबी पैरामीटर सूची कोड गंध को ध्यान में नहीं रखते हैं )। यह तब और भी बदतर हो जाता है जब आप डोमेन ऑब्जेक्ट्स और डीटीओ के बीच स्वैप करने के लिए ऑटोमैपर जैसी किसी चीज का उपयोग करते हैं, और एक रीफैक्टरिंग जो आप करते हैं। ऑटोमैटिक मैपिंग द्वारा उठाया नहीं जाता है।


0

आप DRY सिद्धांत को तोड़ रहे होंगे, जिसमें हर जगह एक ज़िप कोड का उपयोग किया जाता है।

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

लेकिन क्या आप फिर से दोनों Address(जो कि zipcode का भी हिस्सा है), और zipcode (सत्यापन के लिए) के हिस्से के रूप में देश को अलग से स्टोर करते हैं ?

  • यदि आप करते हैं, तो आप DRY का भी उल्लंघन कर रहे हैं। यहां तक ​​कि अगर आप इसे DRY उल्लंघन नहीं कहते हैं (क्योंकि प्रत्येक उदाहरण एक अलग उद्देश्य प्रदान करता है), यह अभी भी अनावश्यक रूप से अतिरिक्त मेमोरी ले रहा है, दो देश के मूल्यों के अलग होने पर दरवाजे को खोलने के शीर्ष पर (जो उन्हें तार्किक रूप से कभी नहीं करना चाहिए हो)।
    • या, वैकल्पिक रूप से, यह आपको यह सुनिश्चित करने के लिए दो डेटा बिंदुओं को सिंक्रनाइज़ करने की आवश्यकता है कि वे हमेशा समान हैं, जो बताता है कि आपको वास्तव में इस डेटा को किसी भी बिंदु पर संग्रहीत करना चाहिए, इस प्रकार उद्देश्य को पराजित करना।
  • यदि आप नहीं करते हैं, तो यह एक ZipCodeवर्ग नहीं है Address, बल्कि एक वर्ग है, जिसमें फिर से एक string ZipCodeअर्थ होगा जिसमें हम पूर्ण चक्र में आए हैं।

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

लाभ यह है कि आप डोमेन मॉडल का वर्णन करते समय उनके बारे में बात कर सकते हैं।

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

क्यूं कर?आप केवल "ज़िपकोड" के बारे में बात करने में असमर्थ क्यों हैं और विशिष्ट प्रकार को पूरी तरह से छोड़ देते हैं? आप अपने व्यवसाय के साथ किस तरह की चर्चा कर रहे हैं (तकनीकी नहीं!) विश्लेषक जहां संपत्ति का प्रकार बातचीत के लिए उपयुक्त है?

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

एक व्यावसायिक विश्लेषक डेटा प्रकार के बारे में परवाह नहीं करता है, जब तक कि एप्लिकेशन वह करता है जो वह करने की उम्मीद करता है।


वैधता एक मुश्किल से निपटने के लिए एक मुश्किल जानवर है, क्योंकि यह मनुष्यों की अपेक्षा पर निर्भर करता है।

एक के लिए, मैं सत्यापन तर्क से सहमत नहीं हूं कि यह दिखाने के लिए कि आदिम जुनून से क्यों बचा जाना चाहिए, क्योंकि मैं इस बात से सहमत नहीं हूं (एक सार्वभौमिक सत्य के रूप में) डेटा को हमेशा हर समय मान्य करने की आवश्यकता होती है।

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

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

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

जन्म तिथि: जाँच करें कि मन से अधिक और आज की तारीख से कम है।
वेतन: जाँच करें कि शून्य से अधिक या उसके बराबर है।

इन मान्यताओं के साथ समस्या यह है कि वे अधूरे, निरर्थक या बहुत बड़ी समस्या के सूचक हैं

यह जाँचना कि एक तिथि मन से अधिक निरर्थक है। माइंडेट का शाब्दिक अर्थ है कि यह सबसे छोटी संभावित तिथि है। इसके अलावा, आप प्रासंगिकता की रेखा कहां खींचते हैं? रोकने की DateTime.MinDateअनुमति देने में क्या बात है DateTime.MinDate.AddSeconds(1)? आप एक विशेष मूल्य को संजो रहे हैं जो कई अन्य मूल्यों की तुलना में विशेष रूप से गलत नहीं है।

मेरा जन्मदिन १ ९ birthday it है (यह नहीं है, लेकिन मान लेते हैं कि यह है)। लेकिन मान लें कि आपके एप्लिकेशन का डेटा गलत है, और इसके बजाय यह कहता है कि मेरा जन्मदिन है:

  • 1 जनवरी 1978
  • जनवरी १ Jan२२
  • जनवरी १३५५

ये सभी तारीखें गलत हैं। उनमें से कोई भी दूसरे की तुलना में "अधिक सही" नहीं है। लेकिन आपका सत्यापन नियम केवल इन तीन उदाहरणों में से एक को पकड़ेगा ।

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

वेतन के लिए, इसमें कुछ सामान्य ज्ञान है जो नकारात्मक नहीं हो सकता। लेकिन अगर आप वास्तविक रूप से उम्मीद करते हैं कि निरर्थक डेटा दर्ज किया जा रहा है, तो मेरा सुझाव है कि आप इस निरर्थक डेटा के स्रोत की जांच करें। क्योंकि अगर उन्हें कामुक डेटा दर्ज करने के लिए भरोसा नहीं किया जा सकता है, तो आप उन्हें सही डेटा दर्ज करने के लिए भी भरोसा नहीं कर सकते हैं ।

यदि इसके बजाय आपके आवेदन से वेतन की गणना की जाती है, और किसी तरह यह नकारात्मक (और सही) संख्या के साथ समाप्त होना संभव है, तो एक बेहतर तरीका यह होगा Math.Max(myValue, 0)कि सत्यापन को विफल करने के बजाय नकारात्मक संख्याओं को 0 में बदल दें। क्योंकि यदि आपके तर्क ने निर्णय लिया कि परिणाम एक नकारात्मक संख्या है, तो सत्यापन को विफल करने का मतलब है कि इसे गणना को फिर से करना होगा, और यह सोचने का कोई कारण नहीं है कि यह दूसरी बार एक अलग संख्या के साथ आएगा।
और अगर यह एक अलग संख्या के साथ आता है, तो फिर से आपको संदेह करने की ओर ले जाता है कि गणना सुसंगत नहीं है और इसलिए उस पर भरोसा नहीं किया जा सकता है।

यह कहना नहीं है कि सत्यापन उपयोगी नहीं है। लेकिन निरर्थक मान्यता खराब है, क्योंकि यह वास्तव में एक समस्या का समाधान नहीं है, और लोगों को सुरक्षा की झूठी भावना प्रदान करते हुए प्रयास करता है।


किसी की जन्मतिथि वास्तव में वर्तमान तिथि से अधिक हो सकती है, यदि बच्चा अभी एक समय क्षेत्र में पैदा हुआ है जो पहले ही अगले दिन के लिए छोड़ दिया गया है। और एक अस्पताल एक डेटाबेस में "अपेक्षित जन्म तिथि" को स्टोर कर सकता है जो भविष्य में महीनों हो सकता है। क्या आप उसके लिए एक अलग प्रकार चाहते हैं?
gnasher729

@ gnasher729: मुझे यकीन नहीं है कि मैं इसका अनुसरण कर रहा हूं, ऐसा लगता है कि आप मुझसे सहमत हैं (मान्यता प्रासंगिक है और सार्वभौमिक रूप से सही नहीं है), लेकिन आपकी टिप्पणी के वाक्यांशों से आपको लगता है कि मैं असहमत हूं। या मैं गलत कर रहा हूँ?
फ्लाटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.