Menu
Coddy logo textTech

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 = 77F

La 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.

challenge icon

Sfida

Facile

Creiamo 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 classe Money che 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 centesimi
    • getDollars(): 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 USD
    • getEuros(): 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 di Money. 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)

?>
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore PHP online