Przejdź do głównej treści
eLearner.app
Moduł 8 · Lekcja 3 z 431/32 w kursie~15 min
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.

JS
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:

JS
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:

JS
const valida = (obj, regole) => regole.map((r) => r(obj)).filter((m) => m !== null);

Sprawdzanie, czy obiekt jest poprawny

JS
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ł:

JS
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

Ćwiczenie#js.m8.l3.e1
Próby: 0Ładowanie...

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.

Ładowanie edytora...
Pokaż wskazówkę

rules.map((r) => r(obj)).filter((m) => m !== null)

Rozwiązanie dostępne po 3 próbach

Ćwiczenie powtórzeniowe

Ćwiczenie#js.m8.l3.e2
Próby: 0Ładowanie...

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'.

Ładowanie edytora...
Pokaż wskazówkę

Ritorna una closure che legge obj[field].

Rozwiązanie dostępne po 3 próbach