Sobes.tech
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:

  1. 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).
  2. 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.