Objekte != Objektorientiert

Im Moment absolviere ich an der Uni ein Softwarepraktikum, bei dem man in einer Gruppe von 7-8 Studenten innerhalb von 6 Wochen zwei Java-Projekte umsetzten muss. Ganz interessant zu beobachten ist dabei, dass viele der Studenten — die meist zum ersten mal praktische Erfahrungen in OOP machen — die gleichen Anfängerfehler machen, die ich auch in meinen Anfängen gemacht habe.

Der größte bzw. beliebteste Fehler liegt anscheinend darin, Objekte nur als Zusammenfassung von Daten und Funktionen zu sehen. Klar, Objekte sind im Ende nichts anderes, aber um von richtigem OOP sprechen zu können, fehlt zumindest noch die Kommunikation der Objekte untereinander. Stattdessen werden große Objekte erzeugt, die so viele Daten enthalten, dass eine Kommunikation aufs Nötigste beschränkt werden kann, was zum Teil schon an prozedurale Programmierung erinnert.
Um hier Abhilfe zu schaffen, empfiehlt es sich Klasse extrahieren aus Martin Fowlers Refactoring-Katalog anzuwenden. Dabei werden Attribute (und dazugehörige Methoden) die eine gleiche Lebensdauer besitzen bzw. aus anderen Gründen zusammengehören in eine eigene Klasse verschoben.
Dadurch, dass nun kleinere Einheiten existieren, lässt sich der Code besser wiederverwenden.

Der andere Fehler, der von Anfängern häufig gemacht wird: Objekte werden gern zu reinen Datenhaltern, die mit ihren Daten nichts anderes machen, als Methoden zum Setzen und Auslesen anzubieten. Die dazugehörige Logik wird dann von anderen Klassen bereitgestellt, die sich dazu die Daten aus der Klasse holen. Als Beispiel dafür muss mal wieder der Pizza-Lieferant herhalten. In diesem Fall soll es um die Berechnung des Preises gehen:

< ?php
class Pizza {
    private $zutaten = array();
    private $basisPreis = 3;
    public function gibBasisPreis() {
        return $this->basisPreis;
    }
    public function gibZutaten() {
        return $this->zutaten;
    }
}

class Bestellung {
    private $pizza;
    public function gibPreis() {
        $preis = $this->pizza->gibBasisPreis();
        foreach ($this->pizza->gibZutaten() as $zutat) {
            $preis += $zutat->gibPreis();
        }
        return $preis;
    }
}
?>

Da die Methode gibPreis nur auf Attribute des Pizza-Objekts zugreift, würde es sich empfehlen, die Methode auch in die Pizza-Klasse zu verschieben. Auch hierdurch wird die Wiederverwendbarkeit des Codes erhöht:

< ?php
class Pizza {
    private $zutaten = array();
    private $basisPreis = 3;

    public function gibPreis() {
        $preis = $this->basisPreis;
        foreach ($this->zutaten as $zutat) {
            $preis += $zutat->gibPreis();
        }
        return $preis;
    }
    public function gibZutaten() {
        return $this->zutaten;
    }
}

class Bestellung {
    private $pizza;
    public function gibPreis() {
        return $this->pizza->gibPreis();
    }
}
?>

Ich hoffe, der ein oder andere Anfänger in OOP kann was mit diesen beiden Tipps anfangen. Schaut einfach mal ab und an euren Code an und überlegt euch, ob man ihn nicht ein wenig optimieren kann.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *