Validazione ed effetti collaterali
Fa parte della sezione Programmazione orientata agli oggetti del percorso JavaScript di Coddy. Lezione 45 di 56.
I getter e i setter possono fare più che limitarsi a leggere e scrivere proprietà: possono convalidare gli input e attivare effetti collaterali quando i valori cambiano.
Creiamo una classe User con la convalida:
class User {
constructor(name, age) {
this._name = name;
this._age = age;
}
get age() {
return this._age;
}
set age(value) {
// Verifica che l'età sia un numero e rientri in un intervallo ragionevole
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;
// Effetto collaterale: registra un messaggio quando l'età cambia
console.log(`Age updated to ${value}`);
}
}Ora, quando usiamo il setter, la convalida avviene automaticamente:
const user = new User('Alice', 25);
// Questo funziona
user.age = 30; // Registra: "Age updated to 30"
// Questo genera un errore
user.age = -5; // Errore: l'età deve essere compresa tra 0 e 120
// Anche questo genera un errore
user.age = "thirty"; // Errore: l'età deve essere un numeroConvalida = Controllare se un valore è valido prima di memorizzarlo
Effetti collaterali = Azioni aggiuntive che avvengono quando una proprietà cambia
Sfida
Ti viene fornita una classe BankAccount con un setter di base. Il tuo compito è completare il setter balance.
Aggiungi al setter:
- Validazione: Controlla se
valuenon è un numero OPPURE è minore di 0: in tal caso,console.log("Invalid balance")e usareturnper uscire dal setter - Effetto collaterale: Dopo aver memorizzato un valore valido,
console.log(\`Balance updated to $${value}\`)
Provalo tu
import { BankAccount } from './account.js';
// Casi di test
const account = new BankAccount("Savings");
// Test 1: saldo valido
account.balance = 100;
console.log(account.balance);
// Test 2: Invalid balance (negativo)
account.balance = -50;
console.log(account.balance);
// Test 3: Invalid balance (non è un numero)
account.balance = "abc";
console.log(account.balance);
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Oggetti e la keyword this
Ripasso rapido: oggettiAggiungere metodi agli oggettiCapire la keyword thisFunzioni costruttriciLa keyword newSfida di ripasso7Ereditarietà e parola chiave extends
EreditarietàLa relazione «è un»La parola chiave extendsIl metodo super()Ereditare proprietà e metodiSfida di ripasso13Composizione vs. ereditarietà
«Ha-un» vs. «è-un»I limiti dell’ereditarietà profondaCostruire oggetti2Organizzare il codice
Cosa sono i moduli?Esportare con exportImportare con importExport predefiniti vs. export nominati5Incapsulamento e accesso
IncapsulamentoCampi di classe pubblici e privatiMetodi privatiSfida di riepilogo8Organizzare il codice OOP
Organizzare le classi in moduli11Progetto: Un renderizzatore di forme
Configurazione: classe Shape ed esportazioneEreditarietà della classe CircleOverride e metodo areaContatore statico di Shape14Sistema di gestione della biblioteca
Progettare la bibliotecaClasse Book con composizioneValidazione dell'autore del libro9Metodi e proprietà statici
A livello di classe o di istanzaProprietà staticheMetodi statici di utilitàSfida di riepilogo12Getter e Setter
Le parole chiave get e setProprietà calcolateValidazione ed effetti collateraliSfida di riepilogoEsercitati da solo: Compilatore JavaScript online