Menu
Coddy logo textTech

Informationsverbergung

Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 41 von 91.

Informationsverbergung ist das Prinzip hinter der Kapselung – die Idee, dass eine class nur das Notwendige offenlegen und ihre internen Implementierungsdetails verbergen sollte. Während Zugriffsmodifikatoren und Getter/Setter die Werkzeuge sind, ist die Informationsverbergung die Designphilosophie, die vorgibt, wie du sie verwendest.

Das Ziel besteht darin, eine klare Grenze zwischen dem zu schaffen, was eine Klasse tut (ihrer öffentlichen Schnittstelle), und der Art und Weise, wie sie es tut (ihrer internen Implementierung). Diese Trennung bedeutet, dass du die interne Funktionsweise ändern kannst, ohne den Code zu beeinträchtigen, der die Klasse verwendet:

<?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";

Ausgabe:

25C = 77F

Die Klasse speichert die Temperatur intern in Celsius, aber die Benutzer müssen das nicht wissen. Du könntest die interne Speicherung später auf Fahrenheit oder Kelvin ändern, und solange die öffentlichen Methoden weiterhin auf dieselbe Weise funktionieren, wird kein externer Code beeinträchtigt.

Wichtiger Punkt: Informationsverbergung schützt deinen Code vor Änderungen. Verberge Implementierungsdetails, lege nur stabile Schnittstellen offen, und deine Klassen werden im Laufe der Zeit leichter zu warten und zu ändern.

challenge icon

Aufgabe

Einfach

Erstellen wir einen Währungsumrechner, der Informationsverbergung in der Praxis demonstriert. Du erstellst eine Klasse, die Geld intern in einer Währung speichert, aber nahtlos die Umrechnung in mehrere Währungen und aus mehreren Währungen ermöglicht, ohne dass externer Code jemals wissen muss, wie die Daten tatsächlich gespeichert werden.

Du organisierst deinen Code über zwei Dateien:

  • Money.php: Erstelle eine Money-Klasse, die alle Beträge intern in Cent (als Ganzzahl) speichert, um Probleme mit der Genauigkeit von Gleitkommazahlen zu vermeiden. Dieses Implementierungsdetail sollte für Benutzer der Klasse vollständig verborgen bleiben. Die Klasse sollte Folgendes bereitstellen:
    • Eine private Eigenschaft zum Speichern des Betrags in Cent
    • setDollars(float $amount): akzeptiert einen Dollarbetrag und speichert ihn intern als Cent
    • getDollars(): gibt den Betrag als Dollar zurück (Gleitkommazahl mit 2 Dezimalstellen)
    • setEuros(float $amount): akzeptiert Euro und rechnet sie anhand des Kurses 1 EUR = 1.10 USD in Cent um
    • getEuros(): gibt den in Euro umgerechneten Betrag zurück (Gleitkommazahl mit 2 Dezimalstellen)
    • getInternalValue(): gibt den rohen Centwert (Ganzzahl) zu Debugging-Zwecken zurück
  • main.php: Binde die Money-Datei ein. Du erhältst zwei Eingaben: einen Dollarbetrag und einen Eurobetrag. Erstelle eine Money-Instanz. Lege zuerst den Dollarbetrag (in eine Gleitkommazahl umgewandelt) fest und gib drei Zeilen aus: den Dollarwert, das Euroäquivalent und den internen Centwert. Lege anschließend den Eurobetrag (in eine Gleitkommazahl umgewandelt) fest und gib erneut dieselben drei Werte aus.

Der Vorteil dieses Designs besteht darin, dass externer Code mit vertrauten Dollar- und Eurowerten arbeitet, ohne zu wissen, dass intern alles als Cent gespeichert wird. Du könntest später die interne Speicherung auf eine andere Basiswährung oder eine andere Strategie für die Genauigkeit umstellen. Solange die öffentlichen Methoden weiterhin korrekt funktionieren, müsste kein externer Code geändert werden.

Formatiere alle Dollar- und Euroausgaben mit genau 2 Dezimalstellen. Jeder Wert sollte in einer eigenen Zeile ausgegeben werden, sodass insgesamt sechs Ausgabezeilen entstehen.

Probier es selbst

<?php

require_once 'Money.php';

// Eingaben lesen
$dollarAmount = floatval(trim(fgets(STDIN)));
$euroAmount = floatval(trim(fgets(STDIN)));

// TODO: Erstelle eine Money-Instanz

// TODO: Setze den Dollarbetrag und gib aus:
// - Den Dollarwert (2 Nachkommastellen)
// - Das Euro-Äquivalent (2 Nachkommastellen)
// - Den internen Cent-Wert (Ganzzahl)

// TODO: Setze den Eurobetrag und gib aus:
// - Den Dollarwert (2 Nachkommastellen)
// - Das Euro-Äquivalent (2 Nachkommastellen)
// - Den internen Cent-Wert (Ganzzahl)

?>
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-PHP-Compiler