اختبار التحقق من العمر هو ضبط بوابة تُفتح للناس الصحيحين وتُغلق على الباقين، وهو أصعب مما يبدو، لأن البوابة مقارنة مع حد يأتي من قاعدة مكتوبة في مكان آخر، ومطبقة على تاريخ ميلاد قد يكون هو نفسه مسجلا بتقويم مختلف.
ينظر هذا المقال في أصل الحدود الشائعة، وما يستطيع تاريخ الميلاد المعلن ذاتيا إثباته وما لا يستطيع، وأي القيم الحدية تستحق اختبارا، وكيف تتعامل مع من لا تعمل الحسابات معهم كما هو متوقع.
من أين تأتي حدود العمر المختلفة؟
تأتي من قواعد مختلفة لها أغراض مختلفة، ولهذا لا يوجد رقم واحد ينبغي تنفيذه.
الحد 13. يظهر في قواعد خصوصية الأطفال على الإنترنت، حيث يحكم جمع البيانات من المستخدمين الصغار.
الحد 16. هو سن الموافقة الافتراضي لخدمات المجتمع المعلوماتي في قواعد حماية البيانات الأوروبية، ويمكن للدول تعديله داخل نطاق معين.
الحد 18. سن الرشد في معظم البلدان، وبوابة طائفة واسعة من العقود والخدمات.
الحد 21. حد أعلى تستخدمه بعض الأنظمة للكحول ولبعض الأنشطة المنظمة الأخرى.
والملاحظة المهمة أن هذه ليست أربع نقاط على مقياس واحد. فقد تكون على منصة واجبات خصوصية موجهة للأطفال عند سن، والحاجة إلى موافقة موثقة عند سن أخرى، والحظر من خدمة عند سن ثالثة. وينبغي أن تنفذ كل بوابة كقاعدة مستقلة لها مصدرها، وأن يذكر في الشيفرة أي واجب تحكمه، لا أن يستنتج من رقم مخزون واحد.
ويتبع ذلك قاعدتان عمليتان. لا تعيد استخدام حد لأن حدا آخر موجود في مكان آخر من المنتج، ولا تعامل أعلى سن منطبق كقيمة افتراضية آمنة لكل الميزات، لأن ذلك يستبعد بصمت من يحق لهم استخدام الخدمة.
ماذا يثبت تاريخ الميلاد المعلن ذاتيا؟
قليلا جدا، لا يزيد على أن أحدا كتبه. فالتاريخ المدخل في نموذج بلا فحص آخر يسجل ادعاء لا واقعة، وقيمته الحقيقية الوحيدة أنه يمنع سوء الاستخدام العرضي ويمنح النظام شيئا يقارن به لاحقا.
وهذا ليس سببا لتخطي الحقل، لكنه سبب لأن تكون دقيقا في غرضه. فالتاريخ المعلن ذاتيا يدعم بوابة قائمة على الصدق: يُسأل المستخدم، وتُسجل إجابته، ويعتمد المنتج على صدق تلك الإجابة. أما البوابة الأقوى فتحتاج دليلا من نوع ما، وهذا يعني عمليا مقارنة مع وثيقة أو قاعدة بيانات لا مع تاريخ مكتوب.
وينبغي نمذجة النوعين بشكل مختلف، لأنهما يفشلان بشكل مختلف. فالتاريخ المعلن ذاتيا قد يكون خاطئا بالإهمال أو بالتصريح المتعمد، ولا يستطيع أي قدر من التحقق في النموذج التمييز بينهما. والفحص المدعوم بوثيقة قد يفشل لأن الوثيقة غير صالحة، أو لأن الحساب مختلف، أو لأن الفحص غير متاح في اللحظة التي يحتاجها المستخدم. وتسجيل نوع البوابة التي أنتجت القرار هو ما يجعل القرار قابلا للتدقيق لاحقا.
وتحت الثالثة عشرة تختلف الصورة مرة أخرى: فقواعد الموافقة وجمع البيانات تتعلق بمسألة امتثال لا بمسألة تحقق، وهي خارج ما يستطيع أي تحقق في النموذج حسمه. وما يفعله المنتج هنا ينبغي أن يكون قرارا موثقا، لا قيمة افتراضية نشأت من قاعدة تحقق.
كيف ينبغي اختبار القيم الحدية؟
اختبار الحدود لهذا النوع من القواعد يعني اختيار التاريخ لا اختيار الشخص. ثبّت التاريخ المرجعي الذي سيستخدمه النظام، ثم ابن تواريخ ميلاد على جانبي كل حد، وأكد النتيجة الدقيقة.
- تاريخ الميلاد الذي يجعل الشخص في عمر الحد بالضبط في التاريخ المرجعي، وهو ما يجب أن يمر وفق العرف المعتاد الذي يعد يوم الميلاد نفسه سن انتقال.
- تاريخ الميلاد التالي له بيوم واحد، فيكون أقل بيوم ويجب أن يفشل.
- تاريخ الميلاد السابق له بيوم واحد، فيكون قد تجاوز الحد بيوم ويجب أن يمر.
- تاريخ ميلاد في اليوم الكبيس مع تاريخ مرجعي في سنة غير كبيسة، حيث تهم قاعدة المقارنة.
- تاريخ ميلاد في أقصى طرف النطاق المعقول، لكشف الحسابات التي تفترض توزيعا ضيقا للأعمار.
والتواريخ الثلاثة الأولى تلتقط كل شيء تقريبا، والرابع يلتقط التنفيذات التي تقرر بصمت أن عيد ميلاد في اليوم الكبيس قد انتقل إلى أول مارس في بعض السنوات. والخمسة كلها تحتاج تاريخا مرجعيا ثابتا؛ فالاختبار الذي يقرأ الساعة الحالية يمر اليوم ويفشل قرب عيد ميلاد، ويسقط الفشل في يوم إصدار أحدهم.
وثمة أمر يستحق التصريح به: أن تجري المقارنة في الاتجاه الذي يجعل الطرف الأصغر واضحا، أي هل الشخص في هذا العمر أو أكبر، لا هل هذا التاريخ أصغر من ذاك. فصياغة القاعدة كمقارنة بين تاريخين تدعو إلى إشارات مقلوبة، والإشارة المقلوبة في حد تحول البوابة إلى نقيضها.
كيف تغير المناطق الزمنية الجواب؟
يُقيّم الحد في لحظة، أما تاريخ الميلاد فليس لحظة. وإن أُخذ التاريخ الحالي من خادم في منطقة زمنية بينما المستخدم في أخرى، فسيختلف الاثنان لبضع ساعات كل يوم حول ما هو اليوم. ومن كان عيد ميلاده اليوم قد يعامل كأصغر بيوم أو أكبر بيوم، بحسب الساعة التي استُشيرت.
والفحص التفاعلي ينبغي أن يستخدم تاريخ المستخدم المحلي عادة، لأن المستخدم هو من يعرف أي يوم في مكانه. أما الفحص المجدول أو الدفعي فينبغي أن يستخدم تاريخا مرجعيا واحدا ثابتا، لأن النتيجة يجب أن تكون قابلة للإعادة. وما لا يجوز أن يحدث هو المزيج: جزء من النظام يستخدم التاريخ المحلي وجزء آخر يستخدم تاريخ الخادم، فتنتج سجلات لا تتفق مع نفسها إلا في معظم الأيام.
وثمة التباس متصل يتعلق بتواريخ الميلاد المسجلة بلا مكوّن زمني. خزن تاريخا تقويميا صرفا ولا ترفق به منطقة زمنية أبدا، وإلا عنى السجل نفسه أياما مختلفة في أنظمة مختلفة.
ماذا عن المولودين في اليوم الكبيس؟
يأتي عيد ميلادهم، وفق معظم الأعراف، في أول مارس من سنة غير كبيسة، أو في آخر يوم من فبراير، وتجيب الأنظمة والبلدان عن ذلك بطرق مختلفة. والنتيجة على بوابة العمر نافذة لا تزيد على يوم واحد تختلف فيها المقاربتان حول ما إذا كان أحدهم قد بلغ الحد.
والاستجابة العملية ليست الانحياز إلى طرف وتناسي الأمر، بل الاختيار المتعمد مع جعل الاختيار قابلا للاختبار. فأي عرف يتبناه المنتج ينبغي أن يكتب حيث يحسب العمر ويغطى بملف تجهيز، كي لا تعكسه بصمت تغييرات لاحقة في مكتبة التواريخ. وفي حد ذي نتائج حقيقية، يكون الخلاف بيوم واحد بالضبط من نوع ما يولد طعونا، والطعن يسهل الرد عليه حين يكون العرف موثقا.
والقيم المنتجة لهذا النوع من الاختبار وهمية وموجودة فقط لتمرين البوابة؛ وهي ليست تواريخ ميلاد أشخاص حقيقيين، ولا يمكن استخدامها لاجتياز أي فحص حقيقي للعمر أو الهوية. وتنتج أداة الهوية وبيانات الاختبار تواريخ ميلاد على نطاق واسع من السنوات مع بذرة هوية ثابتة، وهذا ما يجعل تجميع مجموعة حدود وإعادة إنتاجها عند الطلب أمرا مباشرا.
للمطورين: اجعل الحدود قابلة للضبط
اقرأ كل حد من الإعدادات بدلا من كتابته صريحا في الشيفرة. فالحدود تتغير، وأحيانا لولاية واحدة، ورقم مدفون في شرط لا يفصله عن فجوة امتثال إلا إصدار واحد. وانسب كل قاعدة إلى الواجب الذي تنفذه، كي يعرف القارئ لماذا وُجدت البوابة لا أنها موجودة فقط.
وأبق حساب العمر في موضع واحد واستدعه من كل مكان. فتنفيذان للقاعدة نفسها ينحرفان، والمنحرف منهما دائما هو الذي يسكن المسار الذي لا يعيد أحد قراءته. وخذ التاريخ المرجعي كوسيط بدلا من قراءة الساعة داخل الدالة، كي تثبته الاختبارات ويمرر له كل عمل دفعي تاريخا ثابتا خاصا به.
وخزن تاريخ الميلاد، لا العمر. فالعمر قيمة مشتقة تصبح خاطئة وفق جدولها الخاص، والعمر المخزون سيكون خاطئا لكل سجل في الجدول في اليوم التالي لكتابته. وسمِّ القيمة المشتقة بأنها مشتقة حيث تظهر، كي لا يبدأ أحد في الوثوق بها كواقعة مخزونة.
وأخيرا اجعل مجموعة التجهيز تثبت الحدود. فأربعة سجلات—بالحد بالضبط، وأقل بيوم، وأكثر بيوم، وفي اليوم الكبيس—مؤكدة مقابل تاريخ ثابت تلتقط الغالبية العظمى من العيوب في هذا الباب، وتبقى عاملة سنوات لأن التاريخ المرجعي معطى لا مرصود. وتشرح مقالة التحقق من تاريخ الميلاد والحالات الحدية مشكلات التقويم التي تقع تحت هذه البوابة، وهي مشكلات تظهر في كل فحص عمري تقريبا.
الخطوات التالية
اختر أعلى بوابة عمر أثرا في منتجك واكتب من أي قاعدة تأتي؛ فإن لم يستطع أحد الإجابة فذلك هو الاكتشاف. ثم ابن سجلات الحدود الأربعة، وثبّت التاريخ المرجعي، وشغلها—وكل ما يخالف النتيجة المتوقعة عيب في المقارنة لا في النموذج. ولسحب نطاق أوسع من تواريخ الميلاد التي لا تلامسها اختبارات الحدود، ابدأ من دليل الهوية وأنشئ دفعة بحقولها المتسقة بحسب البلد.