ماڈیول اسباق (3/4)
چیلنج: ڈیٹا کی توثیق کرنے والا
ان پٹ ڈیٹا کی توثیق کرنا ان چیزوں میں سے ایک ہے جو آپ اکثر کریں گے: کوئی فارم، کوئی API آنکھ بند کر کے نہیں کر سکتا جو کچھ حاصل کرتا ہے اس پر بھروسہ کریں۔ آئیے ایک چھوٹا سا توثیق کار بناتے ہیں جو کمپوز ایبل قواعد اور کو یکجا کرتا ہے۔ تمام خرابیاں پائی جاتی ہیں، نہ صرف پہلی والی۔
ایک اصول = ایک فنکشن
ایک اصول آبجیکٹ کو لیتا ہے اور null (سب اچھا) یا خامی کے پیغام کے ساتھ سٹرنگ لوٹاتا ہے۔
const nomeRichiesto = (utente) =>
utente.nome && utente.nome.length > 0 ? null : 'nome obbligatorio';
const etaMaggiore = (utente) => (utente.eta >= 18 ? null : 'devi essere maggiorenne');متعدد قواعد کی تشکیل
توثیق کرنے والا تمام اصول چلاتا ہے اور غلطیاں جمع کرتا ہے:
function valida(utente, regole) {
const errori = [];
for (const regola of regole) {
const msg = regola(utente);
if (msg) errori.push(msg);
}
return errori;
}فنکشنل انداز:
const valida = (obj, regole) => regole.map((r) => r(obj)).filter((m) => m !== null);فیصلہ کرنا کہ آیا یہ درست ہے۔
const errori = valida(utente, [nomeRichiesto, etaMaggiore]);
const ok = errori.length === 0;مفید پیٹرن: قاعدہ فیکٹری
جب آپ کے پاس ایک ہی منطق سے توثیق کرنے کے لیے بہت سے فیلڈز ہوں تو فیکٹری لکھیں:
const richiesto = (campo) => (obj) =>
obj[campo] != null && obj[campo] !== '' ? null : `${campo} obbligatorio`;
const minimo = (campo, n) => (obj) => (obj[campo] >= n ? null : `${campo} deve essere >= ${n}`);
const regole = [richiesto('nome'), richiesto('email'), minimo('eta', 18)];ہر فیکٹری پہلے سے تشکیل شدہ قاعدہ فنکشن لوٹاتی ہے۔ یہ بالکل ایسے ہی ہے جیسے پارسر کا استعمال کرنا جنریٹر یا توثیق کرنے والا جیسے Zod، صرف چھوٹے میں۔
اسے آزمائیں
`validate(obj, rules)` کی وضاحت کریں: ہر اصول کا اطلاق کریں (function obj -> string|null) اور ایک صف واپس کریں جس میں صرف غیر null پیغامات ہوں، اسی ترتیب میں اصولوں کی طرح۔
اشارہ دکھائیں۔
قوانین کا نقشہ((r) => r(obj)).filter((m) => m !== null)
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش کا جائزہ لیں۔
فیکٹری کی وضاحت کریں `ضرورت (فیلڈ)`: یہ ایک قاعدہ لوٹاتا ہے کہ، کسی شے کو دیئے جانے پر، اگر obj[فیلڈ] غیر خالی ہو (نال نہیں، غیر وضاحتی نہیں، خالی سٹرنگ نہیں)، بصورت دیگر سٹرنگ '<field> obbligatorio'۔
اشارہ دکھائیں۔
ایک بندش واپس کریں جو obj[field] کو پڑھتا ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔