मेन्यू

जन्म तिथि सत्यापन: फ़ॉर्म तोड़ने वाले सीमा मामले

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

प्रकाशित

  • टेस्ट डेटा
  • पहचान
  • तारीख़ें

जन्म तिथि सत्यापन को आसान माना जाता है, और यह प्रतिष्ठा बेबुनियाद है। फ़ील्ड एक ही मान लेता है, वह मान एक तारीख़ है, और तारीख़ कोई सुलझी हुई समस्या है — बस यही बात सच नहीं है, क्योंकि जन्म तिथि आगे उम्र का इनपुट भी बनती है, उम्र की तुलना किसी सीमा से होती है, और उम्र तथा सीमा दोनों इस पर निर्भर करते हैं कि तुलना जिस जगह हो रही है वहां उस समय कौन सी तारीख़ है।

यह लेख उन किनारों को इकट्ठा करता है जहां सही दिखने वाले कार्यान्वयन गलत जवाब देते हैं, और बताता है कि इनमें से कौन से टेस्ट सूट में शिकायत के बाद नहीं बल्कि रिलीज़ से पहले होने चाहिए।

जन्म तिथि बाकी तारीख़ों से अलग क्यों है?

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

उन तीन अंतरों को सूची में रखने पर यह साफ़ दिखता है:

  • यह बहुत पीछे है, इसलिए दर्जनों लीप-वर्ष चक्रों और कम से कम एक नियम बदलाव को पार करती है
  • इससे व्यक्ति की उम्र निकाली जाती है, यानी प्रारूपण नहीं बल्कि गणित चलता है
  • इसकी तुलना अक्सर किसी कानूनी सीमा से होती है, यानी नतीजे के परिणाम होते हैं

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

कौन सी तारीख़ें हैं ही नहीं?

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

व्यवहार में मायने रखने वाले मामले वर्तमान के आसपास के दो सदी वर्ष हैं। उनमें से एक लीप वर्ष नहीं है, इसलिए उसके दूसरे महीने की उनतीस तारीख़ वैध नहीं है; दूसरा लीप वर्ष है, इसलिए वही दिन वैध है। जो कार्यान्वयन केवल चार से विभाज्यता का नियम लगाते हैं वे एक असंभव तारीख़ स्वीकार कर लेते हैं और एक असली को अस्वीकार कर देते हैं, और यह गलती साल के ज़्यादातर हिस्से में दिखती ही नहीं।

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

उम्र असल में कैसे निकाली जाती है?

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

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

किसी भी तारीख़ को सेकंडों की गिनती में बदलकर भाग देना आम गलत कार्यान्वयन है। यह लीप वर्षों के आर-पार खिसक जाता है, जवाब को दिन के समय पर निर्भर बना देता है, और ऐसी उम्र बनाता है जो आधी रात के बजाय किसी भी मनमाने घंटे पर बदलती है।

जांच किस तारीख़ को आज मानती है?

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

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

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

क्या सारे कैलेंडर एक ही दिन पर सहमत होते हैं?

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

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

प्लेसहोल्डर तारीख़ें मुसीबत कहां खड़ी करती हैं?

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

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

यही टेस्ट में बनाए गए रिकॉर्ड के पक्ष में दलील है। पहचान और टेस्ट डेटा जनरेटर से बने मान झुंड में नहीं, फैलाव में आते हैं, यानी टेस्ट में रखा फ़ॉर्म वही एक प्लेसहोल्डर बार-बार देखने के बजाय असली आकार वाली कई तारीख़ें देखता है। ये सॉफ़्टवेयर टेस्टिंग के लिए काल्पनिक मान हैं और बस वही — किसी की असली जन्म तिथि नहीं, और ऐसा दस्तावेज़ नहीं जिसे किसी की पहचान बनाकर उपयोग किया जा सके।

डेवलपर्स के लिए: किन सीमाओं पर एसर्शन करें

टेस्ट में संदर्भ तारीख़ तय कीजिए, फिर उसके आसपास की किसी चीज़ पर नहीं, ठीक सीमा पर एसर्शन कीजिए। किसी भी सीमा के लिए चार मान ज़्यादातर जोखिम कवर कर लेते हैं: वह जन्म तिथि जो आज व्यक्ति को ठीक सीमा की आयु का बनाती है, वह जो एक दिन कम है, वह जो एक दिन ज़्यादा है, और वह जो लीप दिवस को पड़ती है।

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

अगले कदम

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

आगे पढ़ें

पहचान और टेस्ट डेटा जनरेटर संबंधित गाइड

पहचान और टेस्ट डेटा जनरेटर संबंधित गाइड

यहाँ केवल इस पृष्ठ के विषय से जुड़े लेख दिखाए गए हैं।