Валидация и побочные эффекты
Часть раздела Объектно-ориентированное программирование путешествия по 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}`);
}
}Теперь при использовании setter проверка выполняется автоматически:
const user = new User('Alice', 25);
// Это работает
user.age = 30; // Логирует: "Age updated to 30"
// Это вызывает ошибку
user.age = -5; // Ошибка: Возраст должен быть между 0 и 120
// Это также вызывает ошибку
user.age = "thirty"; // Ошибка: Возраст должен быть числомValidation = Проверка того, является ли значение допустимым, перед его сохранением
Побочные эффекты = Дополнительные действия, происходящие при изменении свойства
Задание
Вам дан класс BankAccount с базовым setter. Ваша задача — завершить setter balance.
Добавьте в setter:
- Validation: проверьте, является ли
valueне числом ИЛИ меньше 0 — если да, вызовитеconsole.log("Invalid balance")и используйтеreturn, чтобы выйти из setter - Side Effect: после сохранения допустимого значения вызовите
console.log(\`Balance updated to $${value}\`)
Попробуйте сами
import { BankAccount } from './account.js';
// Тестовые случаи
const account = new BankAccount("Savings");
// Test 1: Valid balance
account.balance = 100;
console.log(account.balance);
// Test 2: Invalid balance (negative)
account.balance = -50;
console.log(account.balance);
// Test 3: Invalid balance (not a number)
account.balance = "abc";
console.log(account.balance);
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Объекты и ключевое слово this
Краткий обзор: ОбъектыДобавление методов в объектыПонимание ключевого слова thisФункции-конструкторыКлючевое слово newИтоговое испытание7Наследование и ключевое слово extends
НаследованиеОтношение «is-a»Ключевое слово extendsМетод super()Наследование свойств и методовИтоговое испытание10Полиморфизм
Что такое полиморфизм?Переопределение унаследованных методовИспользование superИтоговое задание13Композиция против наследования
Отношения «has-a» и «is-a»Ограничения глубокого наследованияСоздание объектов2Организация кода
Что такое модули?Экспорт с помощью exportИмпорт с помощью importDefault против именованных экспортов5Инкапсуляция и доступ
ИнкапсуляцияПубличные и приватные поля классовПриватные методыЗадание на повторение8Организация кода ООП
Организация классов в модули11Проект: Отрисовщик фигур
Настройка: Класс Shape и экспортНаследование класса CircleПереопределение и метод AreaСтатический счетчик фигур14Система управления библиотекой
Проектирование библиотекиКласс Book с использованием композицииВалидация автора книги6Проект: Простой банковский счет
Класс BankAccountПополнение и снятие средствБаланс как приватное поле9Статические методы и свойства
Уровень класса против уровня экземпляраСтатические свойстваСтатические вспомогательные методыЗадание на закрепление12Геттеры и сеттеры
Ключевые слова get и setВычисляемые свойстваВалидация и побочные эффектыИтоговое заданиеПотренируйтесь самостоятельно: Онлайн-компилятор JavaScript