Валидация и побочные эффекты
Часть раздела Объектно-ориентированное программирование путешествия по 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Валидация = Проверка того, является ли значение допустимым перед его сохранением
Побочные эффекты = Дополнительные действия, которые происходят при изменении свойства
Задание
Вам предоставлен класс BankAccount с базовым сеттером. Ваша задача — завершить сеттер balance.
Добавьте в сеттер:
- Валидация: Проверьте, не является ли
valueчислом ИЛИ меньше ли оно 0 — если это так, выполнитеconsole.log("Invalid balance")и используйтеreturnдля выхода из сеттера - Побочный эффект: После сохранения корректного значения выполните
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);
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Объекты и ключевое слово this
Краткий обзор: ОбъектыДобавление методов в объектыПонимание ключевого слова thisФункции-конструкторыКлючевое слово newИтоговое испытание7Наследование и ключевое слово extends
НаследованиеОтношение «is-a»Ключевое слово extendsМетод super()Наследование свойств и методовИтоговое испытание10Полиморфизм
Что такое полиморфизм?Переопределение унаследованных методовИспользование superИтоговое задание13Композиция против наследования
Отношения «has-a» и «is-a»Ограничения глубокого наследованияСоздание объектов2Организация кода
Что такое модули?Экспорт с помощью exportИмпорт с помощью importDefault против именованных экспортов5Инкапсуляция и доступ
ИнкапсуляцияПубличные и приватные поля классовПриватные методыЗадание на повторение8Организация кода ООП
Организация классов в модули11Проект: Отрисовщик фигур
Настройка: Класс Shape и экспортНаследование класса Circle14Система управления библиотекой
Проектирование библиотекиКласс Book с использованием композиции6Проект: Простой банковский счет
Класс BankAccountПополнение и снятие средств9Статические методы и свойства
Уровень класса против уровня экземпляраСтатические свойстваСтатические вспомогательные методыЗадание на закрепление12Геттеры и сеттеры
Ключевые слова get и setВычисляемые свойстваВалидация и побочные эффектыИтоговое задание