Валидация и побочные эффекты
Часть раздела Объектно-ориентированное программирование путешествия по 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 должен быть между 0 и 120
// Это также выбрасывает ошибку
user.age = "thirty"; // Ошибка: Age должен быть числомВалидация = проверка того, что значение допустимо, перед его сохранением
Побочные эффекты = дополнительные действия, которые выполняются при изменении свойства
Задание
Вам дан класс BankAccount с базовым сеттером. Ваша задача — завершить работу сеттера balance.
Добавьте в сеттер:
- Проверка: проверьте, не является ли
valueчислом ИЛИ не меньше ли оно 0 — если это так, выполнитеconsole.log("Invalid balance")и используйтеreturn, чтобы выйти из сеттера - Побочный эффект: после сохранения допустимого значения выполните
console.log(\`Balance updated to $${value}\`)
Попробуйте сами
import { BankAccount } from './account.js';
// Тестовые случаи
const account = new BankAccount("Savings");
// Тест 1: Допустимый баланс
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