Валидация и побочные эффекты
Часть раздела Объектно-ориентированное программирование путешествия по 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"; // Ошибка: возраст должен быть числомПроверка = проверка того, что значение допустимо, прежде чем сохранить его
Побочные эффекты = дополнительные действия, которые происходят при изменении свойства
Задание
Тебе дан класс 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);
// Тест 2: Invalid balance (отрицательное значение)
account.balance = -50;
console.log(account.balance);
// Тест 3: Invalid balance (не число)
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