Menu
Coddy logo textTech

Валидация и побочные эффекты

Часть раздела Объектно-ориентированное программирование путешествия по JavaScript на Coddy — урок 45 из 56.

Геттеры и сеттеры могут делать больше, чем просто читать и записывать свойства — они могут проверять входные данные и вызывать побочные эффекты при изменении значений.

Давайте создадим класс User с валидацией:

class User {
  constructor(name, age) {
    this._name = name;
    this._age = age;
  }
  
  get age() {
    return this._age;
  }
  
  set age(value) {
    // Проверить, что возраст является числом и находится в разумных пределах
    if (typeof value !== 'number') {
      throw new Error('Age must be a number');
    }
    
    if (value < 0 || value > 120) {
      throw new Error('Age must be between 0 and 120');
    }
    
    this._age = value;
    
    // Побочный эффект: логирование при изменении возраста
    console.log(`Age updated to ${value}`);
  }
}

Теперь, когда мы используем сеттер, валидация происходит автоматически:

const user = new User('Alice', 25);

// Это работает
user.age = 30;  // Выводит в лог: "Age updated to 30"

// Это вызывает ошибку
user.age = -5;  // Ошибка: Age must be between 0 and 120

// Это также вызывает ошибку
user.age = "thirty";  // Ошибка: Age must be a number

Валидация = Проверка того, является ли значение допустимым перед его сохранением
Побочные эффекты = Дополнительные действия, которые происходят при изменении свойства

challenge icon

Задание

Вам предоставлен класс BankAccount с базовым сеттером. Ваша задача — завершить сеттер balance.

Добавьте в сеттер:

  1. Валидация: Проверьте, не является ли value числом ИЛИ меньше ли оно 0 — если это так, выполните console.log("Invalid balance") и используйте return для выхода из сеттера
  2. Побочный эффект: После сохранения корректного значения выполните console.log(\`Balance updated to ${value}\`)

Шпаргалка

Геттеры и сеттеры могут проверять входные данные и вызывать побочные эффекты при изменении значений.

Валидация проверяет корректность значения перед его сохранением:

set age(value) {
  if (typeof value !== 'number') {
    throw new Error('Age must be a number');
  }
  
  if (value < 0 || value > 120) {
    throw new Error('Age must be between 0 and 120');
  }
  
  this._age = value;
}

Побочные эффекты — это дополнительные действия, которые выполняются при изменении свойства:

set age(value) {
  // валидация...
  this._age = value;
  
  // Побочный эффект: логирование при изменении возраста
  console.log(`Age updated to ${value}`);
}

Пример использования:

const user = new User('Alice', 25);
user.age = 30;  // Выводит в консоль: "Age updated to 30"
user.age = -5;  // Ошибка: Age must be between 0 and 120

Попробуйте сами

import { BankAccount } from './account.js';

// Тестовые сценарии
const account = new BankAccount("Savings");

// Тест 1: Допустимый баланс
account.balance = 100;
console.log(account.balance);

// Тест 2: Недопустимый баланс (отрицательный)
account.balance = -50;
console.log(account.balance);

// Тест 3: Недопустимый баланс (не число)
account.balance = "abc";
console.log(account.balance);

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование