Junior
Was ist Kapselung in der objektorientierten Programmierung?
sobes.tech KI
Antwort von AI
Kapselung ist die Vereinigung von Daten (Eigenschaften) und Methoden, die mit diesen Daten in einer einzigen Entität (Objekt oder Klasse) arbeiten, sowie die Verbergung der internen Implementierung vor der Außenwelt. Dies ermöglicht die Kontrolle des Zugriffs auf die Daten und die Änderung der internen Struktur der Klasse, ohne den restlichen Code zu beeinflussen.
Hauptaspekte der Kapselung:
- Datenschutz: Der direkte Zugriff auf die internen Daten des Objekts ist eingeschränkt. Der Zugriff erfolgt über öffentliche (public) Methoden – Getter (zum Abrufen der Daten) und Setter (zum Ändern der Daten).
- Einhaltung von Invarianten: Die Methoden der Klasse können Logik enthalten, um die Korrektheit der Daten bei ihrer Festlegung zu überprüfen, um sicherzustellen, dass sich das Objekt in einem gültigen Zustand befindet.
Beispiel:
<?php
class User {
private string $name; // Versteckte Eigenschaft
private int $age; // Versteckte Eigenschaft
public function __construct(string $name, int $age) {
$this->setName($name);
$this->setAge($age);
}
// Getter für name
public function getName(): string {
return $this->name;
}
// Setter für name mit Validierung
public function setName(string $name): void {
// Bei Bedarf kann die Validierung des Namens hinzugefügt werden
$this->name = $name;
}
// Getter für age
public function getAge(): int {
return $this->age;
}
// Setter für age mit Validierung
public function setAge(int $age): void {
if ($age < 0) {
throw new InvalidArgumentException("Alter kann nicht kleiner als null sein.");
}
$this->age = $age;
}
// Methode, die interne Daten verwendet
public function introduce(): string {
return "Ich heiße " . $this->name . " und bin " . $this->age . " Jahre alt.";
}
}
// Verwendung der Klasse
$user = new User("Ivan", 30);
echo $user->introduce(); // Ausgabe: Ich heiße Ivan und bin 30 Jahre alt.
// Der Versuch, direkt auf die private Eigenschaft zuzugreifen, führt zu einem Fehler:
// $user->age = -5; // Fataler Fehler: Cannot access private property User::$age
// Verwendung des Setters mit Validierung
try {
$user->setAge(-5);
} catch (InvalidArgumentException $e) {
echo "\nFehler: " . $e->getMessage(); // Ausgabe: Fehler: Alter kann nicht kleiner als null sein.
}
Vorteile der Kapselung:
- Zugriffskontrolle: Bestimmt, wie externe Objekte mit den Daten der Klasse interagieren können.
- Flexibilität: Ermöglicht die Änderung der internen Implementierung der Klasse, ohne den externen Code zu ändern.
- Verbesserung der Wartbarkeit: Erleichtert Debugging und Modifikationen, da Änderungen auf die Klasse beschränkt sind.
- Datenschutz: Verhindert inkorrekte Änderungen am Zustand des Objekts.