Menu
CoddyTech

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

Часть раздела Объектно-ориентированное программирование путешествия по 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;  // Ошибка: возраст должен быть от 0 до 120
// Это тоже вызывает ошибку
user.age = "thirty";  // Ошибка: возраст должен быть числом

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

challenge icon

Задание

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

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

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

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

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

// Тестовые случаи
const account = new BankAccount("Savings");

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

// Тест 2: Invalid balance (отрицательное значение)
account.balance = -50;
console.log(account.balance);

// Тест 3: Invalid balance (не число)
account.balance = "abc";
console.log(account.balance);

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

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор JavaScript