الخلفية
بعد أن اجتمعت في العديد من الأماكن في تطوير Javascript مع المواقف التي كان من الضروري فيها التحقق من القيم ، أصبح من الواضح أنه كان من الضروري حل هذه المشكلة بطريقة أو بأخرى. لهذا الغرض ، تم تعيين المهمة التالية:
تطوير مكتبة تمكن:
- التحقق من أنواع البيانات ؛
- تعيين القيم الافتراضية بدلاً من الحقول أو العناصر غير الصالحة ؛
- حذف أجزاء غير صالحة من كائن أو صفيف ؛
- تلقي رسالة خطأ
سيكون أساسها:
- سهل التعلم
- قراءة الرمز المستلم.
- سهولة تعديل الكود
لتحقيق هذه الأهداف ، تم تطوير مكتبة للتحقق من صحة الرباعية .
طوب التحقق الأساسي
في قلب معظم الأنظمة التي تم تصميمها لتكون قابلة للتطبيق في مجموعة واسعة من المهام هي أبسط العناصر : الإجراءات والبيانات والخوارزميات. بالإضافة إلى طرق تكوينها - من أجل تجميع شيء أكثر تعقيدًا من العناصر البسيطة لحل المشكلات الأكثر تعقيدًا.
مدقق
تعتمد مكتبة اللجنة الرباعية على مفهوم المدقق . المدققون في هذه المكتبة هم وظائف النموذج التالي
function validator( value: any, { key: string|int, parent: any }, { key: string|int, parent: any }, ... ): boolean
هناك عدة أشياء في هذا التعريف يجب وصفها بمزيد من التفصيل:
function(...): boolean
- تقول أن المدقق - يحسب نتيجة التحقق ، ونتيجة التحقق هي قيمة منطقية - صحيحة أو خاطئة ، على التوالي صالحة أو غير صالحة
value: any
- تشير إلى أن المدقق - يحسب نتيجة التحقق من قيمة ، والتي يمكن أن تكون أي قيمة جافا سكريبت. يقوم المدقق إما بتعيين القيمة التي تم التحقق منها لتكون صالحة أو غير صالحة.
{ key: string|int, parent: any }, ...
- يشير إلى أن القيمة التي تم التحقق منها يمكن أن تكون في سياقات مختلفة بناءً على مستوى تداخل القيمة. دعونا نظهر ذلك مع الأمثلة
قيمة المثال بدون أي سياق
const value = 4;
قيمة المثال في سياق صفيف
قيمة المثال في سياق كائن
const obj = { a: 1, b: 2, c: value, d: 8 }
نظرًا لأن الهياكل في كائن ما يمكن أن يكون لها تداخل أكبر ، فمن المنطقي التحدث عن مجموعة متنوعة من السياقات
const arrOfObj = [{ a: 1, b: 2, c: value, d: 8 },
وهكذا دواليك.
حول التشابه مع طرق الصفيفيجب أن يذكرك تعريف المدقق بتعريف الدوال التي يتم تمريرها كحجة لطرق الصفيف ، مثل: خريطة ، مرشح ، بعض ، كل ، إلخ.
- الوسيطة الأولى لهذه الوظائف هي عنصر صفيف.
- الوسيطة الثانية هي فهرس العنصر.
- الحجة الثالثة هي المصفوفة نفسها.
المدقق في هذه الحالة هو دالة أكثر عمومية - لا يأخذ فقط فهرس العنصر في الصفيف والصفيف ، ولكن أيضًا فهرس الصفيف - في أصله وأصله ، وما إلى ذلك.
ماذا يجب أن نبني منزل؟
لا يبرز الطوب الموصوف أعلاه من بين "الحلول الحجرية" الأخرى التي تقع على عكاز جافا سكريبت "الشاطئ" . لذلك ، دعونا نبني منهم ، شيء أكثر تماسكًا وإثارة للاهتمام. لهذا لدينا تكوين .
كيفية بناء ناطحة سحاب للتحقق من الكائن؟
أوافق ، سيكون من المناسب التحقق من الكائنات بطريقة تجعل وصف التحقق يتطابق مع وصف الكائن. لهذا سوف نستخدم تكوين كائن المصادقات . يبدو هذا:
كما ترون ، من طابوق المصادقة المختلفة المحددة لحقول معينة ، يمكننا تجميع مدقق الكائن - بعض "المباني الصغيرة" التي لا تزال ضيقة للغاية - ولكن أفضل من دونها. لهذا ، نستخدم مؤلف المدققين v
. في كل مرة ، يلتقي الكائن بالحرف v
في مكان المدقق ، سيعتبره تكوينًا للكائن ، ويحوله إلى مدقق كائن في حقوله.
في بعض الأحيان لا يمكننا وصف جميع الحقول . على سبيل المثال ، عندما يكون الكائن عبارة عن قاموس بيانات:
const quartet = require('quartet') const v = quartet() const isStringValidator = name => typeof name === 'string' const keyValueValidator = (value, { key }) => value.length === 1 && key.length === 1 const dictionarySchema= { dictionaryName: isStringValidator, ...v.rest(keyValueValidator) } const compositeObjValidator = v(dictionarySchema) const obj = { dictionaryName: 'next letter', b: 'c', c: 'd' } const isObjValid = compositeObjValidator(obj) console.log(isObjValid)
كيفية إعادة استخدام حلول البناء؟
كما رأينا أعلاه ، هناك حاجة إلى إعادة استخدام أدوات التحقق البسيطة. في هذه الأمثلة ، كان علينا بالفعل استخدام "مدقق نوع السلسلة" مرتين بالفعل.
من أجل تقصير السجل وزيادة قابليته للقراءة ، تستخدم مكتبة اللجنة الرباعية سلسلة مرادفات للمصادقين. عندما يصادف مؤلف المدقق سلسلة في المكان الذي يجب أن يكون فيه المدقق ، فإنه يبحث في القاموس عن مدققه ويستخدمه .
بشكل افتراضي ، يتم تحديد أدوات التحقق الأكثر شيوعًا بالفعل في المكتبة.
خذ بعين الاعتبار الأمثلة التالية:
v('number')(1)
والعديد من الآخرين الموصوفة في الوثائق .
كل قوس له نوعه الخاص من الطوب؟
مؤلف المصدق (الوظيفة v
) هو أيضًا مصنع مصدق. بمعنى أنه يحتوي على العديد من الطرق المفيدة التي تعود
- المصادق وظيفة
- القيم التي سوف يدركها الملحن على أنها مخططات لإنشاء مدققين
على سبيل المثال ، دعنا نلقي نظرة على التحقق من صحة المصفوفة: غالبًا ما تتكون من التحقق من نوع المصفوفة والتحقق من جميع عناصره. سنستخدم طريقة v.arrayOf(elementValidator)
لهذا الغرض. على سبيل المثال ، خذ مجموعة من النقاط مع الأسماء.
const a = [ {x: 1, y: 1, name: 'A'}, {x: 2, y: 1, name: 'B'}, {x: -1, y: 2, name: 'C'}, {x: 1, y: 3, name: 'D'}, ]
بما أن مصفوفة النقاط هي مصفوفة من الكائنات ، فمن المنطقي استخدام تكوين الكائن للتحقق من صحة عناصر الصفيف.
const namedPointSchema = { x: 'number',
الآن ، باستخدام طريقة المصنع v.arrayOf
، قم بإنشاء مدقق للصفيف بأكمله.
const isArrayValid = v.arrayOf({ x: 'number', y: 'number', name: 'string' })
دعونا نرى كيف يعمل هذا المدقق:
isArrayValid(0)
هذه مجرد واحدة من طرق المصنع ، كل منها موصوف في الوثائق.
كما رأيت أعلاه ، فإن v.rest
أيضًا أسلوب مصنع يقوم بإرجاع تكوين كائن يتحقق من جميع الحقول غير المحددة في تكوين الكائن. وهذا يعني أنه يمكن تضمينها في تكوين كائن آخر باستخدام spread-operator
.
دعونا نذكر كمثال على استخدام العديد منهم:
أكون أو لا أكون؟
غالبًا ما يحدث أن تأخذ البيانات الصالحة أشكالًا مختلفة ، على سبيل المثال:
- يمكن أن يكون الرقم رقمًا ، أو يمكن أن يكون سلسلة.
- قد يحتوي الكائن
point
أو لا يحتوي على بعض الإحداثيات ، اعتمادًا على البعد. - والعديد من الحالات الأخرى.
لتنظيم التحقق من المتغيرات ، يتم توفير نوع منفصل من التكوين - تكوين متغير. ويمثلها مجموعة من المصدقين من الخيارات الممكنة. يعتبر الكائن صالحًا عندما يبلغ أحد المصدقين على الأقل عن صحته.
خذ بعين الاعتبار مثال مع التحقق من صحة المعرف:
const isValidId = v([ v.and('not-empty', 'string'),
مثال للتحقق من النقطة:
const isPointValid = v([ {
وبالتالي ، كلما رأى الملحن صفيفًا ، سيعتبره تكوينًا لعناصر التحقق من الصفيف بهذه الطريقة بحيث عندما يعتبر أحدهم القيمة صالحة ، سيتوقف حساب التحقق وسيتم الاعتراف بالقيمة على أنها صالحة.
كما نرى ، لا يعتبر المؤلف وظيفة المدقق مدققًا فحسب ، بل أيضًا كل ما يمكن أن يؤدي إلى وظيفة المدقق.
نوع المدقق | مثال | كما يتصورها الملحن |
---|
دالة التحقق | x => typeof x === 'bigint' | فقط استدعي القيم الضرورية |
تكوين الكائن | { a: 'number' } | يقوم بإنشاء وظيفة مدقق لكائن بناءً على مدققي المجال المحدد |
تكوين متغير | ['number', 'string'] | ينشئ وظيفة مدقق للتحقق من صحة قيمة بخيار واحد على الأقل من الخيارات |
نتائج استدعاء طريقة المصنع | v.enum('male', 'female') | ترجع معظم طرق المصنع وظائف التحقق من الصحة (باستثناء v.rest ، التي تُرجع تكوين الكائن) ، لذلك يتم التعامل معها مثل وظائف التحقق العادية |
كل خيارات المدقق هذه صالحة ويمكن استخدامها في أي مكان داخل المخطط حيث يجب أن يكون المدقق.
ونتيجة لذلك ، يكون مخطط العمل دائمًا على هذا النحو: v(schema)
يُرجع وظيفة التحقق من الصحة. بعد ذلك ، يتم استدعاء وظيفة التحقق من الصحة هذه على قيم محددة:
v(schema)(value[, ...parents])
هل تعرضت لأي حوادث في موقع البناء؟
- ليس بعد ، ولا واحد
- سيفعلون!
يحدث أن البيانات غير صالحة ويجب أن نكون قادرين على تحديد سبب عدم صلاحيتها.
لهذا ، توفر مكتبة الرباعية آلية تفسير . وهو يتألف من حقيقة أنه عندما يكتشف المدقق ، سواء كان داخليًا أو خارجيًا ، صحة البيانات التي تم التحقق منها ، فيجب عليه إرسال ملاحظة توضيحية .
لهذه الأغراض ، يتم استخدام الوسيطة الثانية لملحن المصدقين v
. يضيف التأثير الجانبي لإرسال ملاحظة توضيحية إلى صفيف v.explanation
في حالة البيانات غير الصالحة.
مثال ، دعنا نتحقق من مصفوفة ، ونريد معرفة أرقام جميع العناصر غير الصالحة وقيمتها:
كما ترى ، يعتمد اختيار الشرح على المهمة. في بعض الأحيان ليس من الضروري.
في بعض الأحيان نحتاج إلى القيام بشيء مع الحقول غير الصالحة. في مثل هذه الحالات ، من المنطقي استخدام اسم الحقل غير الصحيح كشرح :
const objSchema = { a: v('number', 'a'), b: v('number', 'b'), c: v('string', 'c') } const isObjValid = v(objSchema) let invalidObj = { a: 1, b: '1', c: 3 } isObjValid(invalidObj)
باستخدام آلية التفسير هذه ، يمكنك تنفيذ أي سلوك مرتبط بنتائج التحقق.
يمكن أن يكون التفسير أي شيء:
- كائن يحتوي على المعلومات اللازمة ؛
- وظيفة تصحح الخطأ. (
getExplanation => function(invalid): valid
) ؛ - اسم الحقل أو فهرس العنصر غير الصالح ؛
- رمز الخطأ
- وكل هذا يكفي لخيالك.
ماذا تفعل عندما لا يتم بناء الأشياء؟
تصحيح أخطاء التحقق من الصحة ليست مهمة نادرة. لهذه الأغراض ، تستخدم المكتبة مدققين مع تأثير جانبي يتذكر مكان الخطأ وكيفية إصلاحه.
v.default(validator, value)
- إرجاع مدقق يتذكر قيمة غير صالحة ، وفي وقت استدعاء v.fix
- يقوم بتعيين القيمة الافتراضيةv.filter(validator)
- إرجاع مدقق يتذكر قيمة غير صالحة ، وفي وقت استدعاء v.fix
- يزيل هذه القيمة من الأصلv.addFix(validator, fixFunc)
- يقوم بإرجاع المدقق الذي يتذكر قيمة غير صالحة ، وفي وقت استدعاء v.fix
- يستدعي fixFunc بالمعلمات (القيمة ، {key ، mother} ، ...). fixFunc
- يجب أن fixFunc
أحد الشركاء - لتغيير القيمة
const toPositive = (negativeValue, { key, parent }) => { parent[key] = -negativeValue } const objSchema = { a: v.default('number', 1), b: v.filter('string', ''), c: v.default('array', []), d: v.default('number', invalidValue => Number(invalidValue)),
الأعمال لا تزال في متناول اليد
هناك أيضًا طرق مساعدة لإجراءات التحقق في هذه المكتبة:
الطريقة | النتيجة |
---|
v.throwError | إذا كان غير صالح ، يلقي خطأ TypeE برسالة معينة. |
v.omitInvalidItems | إرجاع صفيف جديد (أو كائن قاموس) بدون عناصر (حقول) غير صالحة. |
v.omitInvalidProps | إرجاع كائن جديد بدون حقول غير صالحة ، وفقًا لمدقق الكائن المحدد. |
v.validOr | تُرجع القيمة إذا كانت صالحة ، وإلا فإنها تستبدلها بالقيمة الافتراضية المحددة. |
v.example | للتحقق مما إذا كانت القيم المحددة تناسب المخطط. إذا لم تكن مناسبة ، يتم طرح خطأ. بمثابة توثيق واختبار الدائرة |
النتائج
تم حل المهام بالطرق التالية:
التحدي | الحل |
---|
التحقق من نوع البيانات | المدققون المسمى الافتراضي. |
القيم الافتراضية | v.default |
إزالة الأجزاء غير الصالحة | v.filter و v.omitInvalidItems و v.omitInvalidProps . |
سهل التعلم | مدققون بسيطون ، طرق بسيطة لتكوينها في مدققين معقدين. |
قراءة التعليمات البرمجية | كان أحد أهداف المكتبة تشبيه مخططات التحقق نفسها |
كائنات تم التحقق من صحتها. |
سهولة التعديل | بعد إتقان عناصر التراكيب واستخدام وظائف التحقق الخاصة بك - تغيير الرمز أمر بسيط للغاية. |
رسالة خطأ | شرح في شكل رسالة خطأ. أو حساب رمز الخطأ على أساس التفسيرات. |
خاتمة
تم تصميم هذا الحل لإنشاء وظائف التحقق من الصحة بسرعة وسهولة مع القدرة على تضمين وظائف التحقق من الصحة المخصصة. لذلك ، إذا كان هناك أي تصحيحات ، انتقادات ، خيارات تحسين من أولئك الذين يقرؤون هذه المقالة ، نرحب بهم. شكرا لكم على اهتمامكم.