Walidacja i efekty uboczne
Część sekcji Programowanie obiektowe ścieżki JavaScript w Coddy. Lekcja 45 z 56.
Gettery i settery mogą robić więcej niż tylko odczytywać i zapisywać właściwości — mogą sprawdzać poprawność danych wejściowych i wywoływać efekty uboczne, gdy wartości się zmieniają.
Stwórzmy klasę User z walidacją:
class User {
constructor(name, age) {
this._name = name;
this._age = age;
}
get age() {
return this._age;
}
set age(value) {
// Sprawdź, czy wiek jest liczbą i mieści się w rozsądnym zakresie
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;
// Efekt uboczny: zapisanie w dzienniku informacji o zmianie wieku
console.log(`Age updated to ${value}`);
}
}Teraz, gdy używamy settera, walidacja odbywa się automatycznie:
const user = new User('Alice', 25);
// To działa
user.age = 30; // Zapisuje w dzienniku: "Age updated to 30"
// To powoduje błąd
user.age = -5; // Błąd: Wiek musi mieścić się w przedziale od 0 do 120
// To również powoduje błąd
user.age = "thirty"; // Błąd: Wiek musi być liczbąWalidacja = sprawdzanie, czy wartość jest prawidłowa, przed jej zapisaniem
Efekty uboczne = dodatkowe działania wykonywane po zmianie właściwości
Wyzwanie
Otrzymujesz klasę BankAccount z podstawowym setterem. Twoim zadaniem jest uzupełnienie settera balance.
Dodaj do settera:
- Walidacja: Sprawdź, czy
valuenie jest liczbą LUB jest mniejsze niż 0 — jeśli tak, użyjconsole.log("Invalid balance")ireturn, aby wyjść z settera - Efekt uboczny: Po zapisaniu prawidłowej wartości użyj
console.log(\`Balance updated to $${value}\`)
Spróbuj swoich sił
import { BankAccount } from './account.js';
// Przypadki testowe
const account = new BankAccount("Savings");
// Test 1: Prawidłowe saldo
account.balance = 100;
console.log(account.balance);
// Test 2: Invalid balance (wartość ujemna)
account.balance = -50;
console.log(account.balance);
// Test 3: Invalid balance (wartość nie jest liczbą)
account.balance = "abc";
console.log(account.balance);
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Obiekty i słowo kluczowe this
Szybka powtórka: obiektyDodawanie metod do obiektówZrozumienie słowa kluczowego thisFunkcje konstruktoraSłowo kluczowe newWyzwanie podsumowujące7Dziedziczenie i słowo kluczowe extends
DziedziczenieRelacja „jest rodzajem”Słowo kluczowe extendsMetoda super()Dziedziczenie właściwości i metodWyzwanie podsumowujące10Polimorfizm
Czym jest polimorfizm?Nadpisywanie odziedziczonych metodUżywanie superWyzwanie podsumowujące13Kompozycja a dziedziczenie
Relacja „ma” a relacja „jest”Ograniczenia głębokiego dziedziczeniaTworzenie obiektów2Organizowanie kodu
Czym są moduły?Eksportowanie za pomocą exportImportowanie za pomocą importEksporty domyślne a nazwane5Enkapsulacja i dostęp
EnkapsulacjaPubliczne i prywatne pola klasyMetody prywatneWyzwanie podsumowujące8Organizowanie kodu OOP
Organizowanie klas w moduły11Projekt: Renderer kształtów
Konfiguracja: klasa Shape i eksportDziedziczenie klasy CircleNadpisywanie i metoda obliczania polaStatyczny licznik kształtów14System zarządzania biblioteką
Projektowanie bibliotekiKlasa Book z kompozycjąWalidacja autora książki9Metody i właściwości statyczne
Poziom klasy a poziom instancjiWłaściwości statyczneStatyczne metody pomocniczeWyzwanie podsumowujące12Gettery i settery
Słowa kluczowe get i setWłaściwości obliczaneWalidacja i efekty uboczneWyzwanie podsumowującePoćwicz samodzielnie: Kompilator JavaScript online