Lekcje modułu (3/4)
Wyzwanie: walidator danych
Walidacja danych wejściowych to jedno z najczęstszych zadań programistycznych: żaden formularz ani API nie może ślepo ufać otrzymywanym danym. Zbudujmy prosty walidator, który łączy komponowalne reguły i zwraca wszystkie znalezione błędy, a nie tylko pierwszy z nich.
Jedna reguła = Jedna funkcja
Reguła przyjmuje walidowany obiekt i zwraca null (jeśli wszystko jest w porządku) lub ciąg znaków
(string) z komunikatem o błędzie.
const nomeRichiesto = (utente) =>
utente.nome && utente.nome.length > 0 ? null : 'nome obbligatorio';
const etaMaggiore = (utente) => (utente.eta >= 18 ? null : 'devi essere maggiorenne');Komponowanie wielu reguł
Walidator uruchamia kolejno wszystkie reguły i zbiera komunikaty o błędach:
function valida(utente, regole) {
const errori = [];
for (const regola of regole) {
const msg = regola(utente);
if (msg) errori.push(msg);
}
return errori;
}W stylu funkcyjnym:
const valida = (obj, regole) => regole.map((r) => r(obj)).filter((m) => m !== null);Sprawdzanie, czy obiekt jest poprawny
const errori = valida(utente, [nomeRichiesto, etaMaggiore]);
const ok = errori.length === 0;Przydatny wzorzec: Fabryka reguł (Rule Factory)
Gdy masz wiele pól do zweryfikowania według tej samej logiki, napisz fabrykę reguł:
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)];Każda fabryka zwraca już skonfigurowaną funkcję reguły. To działa dokładnie tak samo, jak generatory parserów lub biblioteki takie jak Zod, tylko w mniejszej skali.
Spróbuj sam
Zdefiniuj funkcję `validate(obj, rules)`: aplikuje każdą regułę (funkcję obj -> stringa|null) i zwraca tablicę zawierającą wyłącznie komunikaty różne od null, w tej samej kolejności co przekazane reguły.
Pokaż wskazówkę
rules.map((r) => r(obj)).filter((m) => m !== null)
Rozwiązanie dostępne po 3 próbach
Ćwiczenie powtórzeniowe
Zdefiniuj fabrykę reguł `required(field)`: zwraca regułę, która dla danego obiektu zwraca null, jeśli pole obj[field] nie jest puste (nie jest null, undefined ani pustym ciągiem znaków), w przeciwnym razie zwraca ciąg znaków '<field> obbligatorio'.
Pokaż wskazówkę
Ritorna una closure che legge obj[field].
Rozwiązanie dostępne po 3 próbach