Lecții din modul (3/4)
Provocare: validator de date
Validarea datelor de intrare este unul dintre lucrurile pe care le veți face cel mai des: nici un formular, nici un API nu poate face orbește ai încredere în ceea ce primește. Să construim un mic validator care combină reguli componabile și returnează toate erorile găsite, nu doar prima.
O regulă = o funcție
O regulă preia obiectul și returnează null (toate bune) sau un șir cu mesajul de eroare.
const nomeRichiesto = (utente) =>
utente.nome && utente.nome.length > 0 ? null : 'nome obbligatorio';
const etaMaggiore = (utente) => (utente.eta >= 18 ? null : 'devi essere maggiorenne');Alcătuirea mai multor reguli
Validatorul rulează toate regulile și colectează erorile:
function valida(utente, regole) {
const errori = [];
for (const regola of regole) {
const msg = regola(utente);
if (msg) errori.push(msg);
}
return errori;
}Stilul functional:
const valida = (obj, regole) => regole.map((r) => r(obj)).filter((m) => m !== null);Decizi dacă este valabil
const errori = valida(utente, [nomeRichiesto, etaMaggiore]);
const ok = errori.length === 0;Model util: fabrica de reguli
Când aveți multe câmpuri de validat cu aceeași logică, scrieți o fabrică:
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)];Fiecare fabrică returnează o funcție de regulă preconfigurată. Este exact ca folosirea unui parser generator sau un validator precum Zod, doar în miniatură.
Încearcă
Definiți `validate(obj, rules)`: aplicați fiecare regulă (funcție obj -> șir|null) și returnați o matrice care conține numai mesajele non-null, în aceeași ordine cu regulile.
Afișează indiciu
reguli.hartă((r) => r(obj)).filter((m) => m !== null)
Soluție disponibilă după 3 încercări
Exercițiu de revizuire
Definiți fabrica `required(field)`: returnează o regulă care, dat un obiect, returnează null dacă obj[câmp] este nevid (nu nul, nedefinit, nu este un șir gol), în caz contrar șirul '<câmp> obligatorio'.
Afișează indiciu
Returnează o închidere care citește obj[câmp].
Soluție disponibilă după 3 încercări