Occultamento delle informazioni
Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 41 di 91.
L'occultamento delle informazioni è il principio alla base dell'incapsulamento: l'idea che una classe debba esporre solo ciò che è necessario e nascondere i dettagli della sua implementazione interna. Mentre i modificatori di accesso e i getter/setter sono gli strumenti, l'occultamento delle informazioni è la filosofia di progettazione che guida il loro utilizzo.
L'obiettivo è creare un confine chiaro tra ciò che fa una classe (la sua interfaccia pubblica) e il modo in cui lo fa (la sua implementazione interna). Questa separazione significa che puoi modificare il funzionamento interno senza influire sul codice che usa la classe:
<?php
class Temperature {
private float $celsius;
public function setCelsius(float $value): void {
$this->celsius = $value;
}
public function getCelsius(): float {
return $this->celsius;
}
public function getFahrenheit(): float {
return ($this->celsius * 9/5) + 32;
}
}
$temp = new Temperature();
$temp->setCelsius(25);
echo $temp->getCelsius() . "C = " . $temp->getFahrenheit() . "F";
Output:
25C = 77FLa classe memorizza internamente la temperatura in gradi Celsius, ma gli utenti non devono saperlo. In seguito potresti cambiare l’unità di memorizzazione interna in gradi Fahrenheit o Kelvin e, finché i metodi pubblici continueranno a funzionare allo stesso modo, nessun codice esterno si romperà.
Punto chiave: L'occultamento delle informazioni protegge il tuo codice dalle modifiche. Nascondi i dettagli dell'implementazione, esponi solo interfacce stabili e le tue classi diventeranno più facili da mantenere e modificare nel tempo.
Sfida
FacileCreiamo un convertitore di valuta che dimostra in pratica l'incapsulamento delle informazioni. Creerai una classe che archivia internamente il denaro in una valuta, ma può convertirlo facilmente da e verso più valute, senza che il codice esterno sappia mai come sono effettivamente archiviati i dati.
Organizzerai il codice in due file:
Money.php: crea una classeMoneyche archivia internamente tutti gli importi in centesimi (come numeri interi) per evitare problemi di precisione in virgola mobile. Questo dettaglio di implementazione deve essere completamente nascosto agli utenti della classe. La classe deve fornire:- Una proprietà privata per archiviare l'importo in centesimi
setDollars(float $amount): accetta un importo in dollari e lo archivia internamente in centesimigetDollars(): restituisce l'importo in dollari (float, 2 cifre decimali)setEuros(float $amount): accetta un importo in euro e lo converte in centesimi usando il tasso: 1 EUR = 1.10 USDgetEuros(): restituisce l'importo convertito in euro (float, 2 cifre decimali)getInternalValue(): restituisce il valore grezzo in centesimi (intero) a scopo di debug
main.php: includi il file Money. Riceverai due input: un importo in dollari e un importo in euro. Crea un'istanza diMoney. Per prima cosa, imposta l'importo in dollari (convertito in float) e stampa tre righe: il valore in dollari, l'equivalente in euro e il valore interno in centesimi. Poi imposta l'importo in euro (convertito in float) e stampa di nuovo gli stessi tre valori.
Il bello di questo design è che il codice esterno lavora con valori familiari in dollari ed euro, senza sapere che tutto è archiviato internamente in centesimi. In seguito potresti cambiare l'archiviazione interna per usare una valuta di base diversa o una diversa strategia di precisione e, finché i metodi pubblici continueranno a funzionare correttamente, non sarà necessario modificare alcun codice esterno.
Formatta tutti i valori in dollari ed euro con esattamente 2 cifre decimali. Ogni valore deve essere stampato su una riga a sé, per un totale di sei righe di output.
Provalo tu
<?php
require_once 'Money.php';
// Lee las entradas
$dollarAmount = floatval(trim(fgets(STDIN)));
$euroAmount = floatval(trim(fgets(STDIN)));
// TODO: Crea una instancia de Money
// TODO: Establece el importe en dólares e imprime:
// - El valor en dólares (2 decimales)
// - El equivalente en euros (2 decimales)
// - El valor interno en centavos (entero)
// TODO: Establece el importe en euros e imprime:
// - El valor en dólares (2 decimales)
// - El equivalente en euros (2 decimales)
// - El valor interno en centavos (entero)
?>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
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave $thisMetodiProprietàCostruttore (__construct)Distruttore (__destruct)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa parola chiave parent::Sovrascrittura dei metodiLa parola chiave finalClassi astratteRiepilogo - Gerarchia dei dipendenti7Incapsulamento
Pubblico, Protetto, PrivatoApprofondimento sui modificatori di accessoGetter e SetterOccultamento delle informazioniPromozione dei parametri del costruttore (8.0)Riepilogo - Sistema di gestione dei registri degli studenti10Concetti avanzati di programmazione a oggetti
Composizione vs ereditarietàDependency InjectionClassi anonimeEnumerazioni (PHP 8.1)Fibers (PHP 8.1)Approfondimento sulla clonazione degli oggettiGeneratori e iteratori13Modelli di progettazione, parte 2
Modello CommandModello AdapterModello DecoratorModello Template MethodModello StateModello CompositeModello Repository2Namespace e autoloading
Introduzione ai namespaceLa keyword useStandard di autoloading PSR-4Autoloader di ComposerRiepilogo - Progetto organizzato5Interfacce e contratti
Introduzione alle interfacceImplementare le interfacceImplementare più interfacceInterfaccia vs classe astrattaType hinting con le interfacceRiepilogo - Calcolatore di forme8Metodi magici
Introduzione ai metodi magici__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e clonazione degli oggetti__serialize e __unserializeRiepilogo - Collezione personalizzata11Sistema dei tipi e gestione degli errori
Dichiarazioni di tipoTipi nullableTipi unione e intersezioneClassi di eccezioneGerarchia di eccezioni personalizzataTry, Catch, FinallyRiepilogo - Validatore di moduli14Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Proprietà delle classi
Proprietà di istanza e staticheCostanti nelle classiMetodi e proprietà staticiProprietà private e protectedProprietà readonly (PHP 8.1)Riepilogo - Gestore di conti bancari6Polimorfismo
Ridefinizione dei metodi, ripresaPolimorfismo tramite interfacceSuggerimenti sui tipi e tipi UnionBinding statico tardivoRiepilogo - Processore di pagamenti9Tratti
Introduzione ai trattiUtilizzare più trattiRisoluzione dei conflitti tra trattiMetodi astratti nei trattiTratti vs ereditarietà12Design pattern - Parte 1
Introduzione ai design patternPattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore PHP online