Guard Clauses

Oft brauche ich eine Funktion, die mir einen von verschiedenen Faktoren abhängigen Wert zurück liefert. Das folgende Beispiel stammt aus der Berechnung von Bonuspunkten für einen Onlineshop.

public function getCreditPoints()
{
    $points = $this->_getBasisPoints();

    if ($this->_isPayedWithCreditCard()) {
        $points *= 1.1;
    } else if ($this->_isPayedWithPrepayment()) {
        $points *= 1.25;
    }
    return $points;
}

Der Code ist soweit okay, lässt sich aber in einer Hinsicht noch optimieren. Jeder, der sich die Methode anschaut, muss sich sowohl beim if-Block als auch beim elseif-Block merken, was bisher passiert ist. Denn zu dem Zeitpunkt weiß der Leser ja noch nicht, dass mit $points nichts mehr gemacht wird.

An dieser Stelle kommen nun die Guard Clauses (zu deutsch Wächterbedingungen) ins Spiel. Mit ihnen sieht das Beispiel so aus:

public function getCreditPoints()
{
    if ($this->_isPayedWithCreditCard()) {
        return $this->_getBasisPoints() * 1.1;
    }

    if ($this->_isPayedWithPrepayment()) {
        return $this->_getBasisPoints() * 1.25;
    }

    return $this->_getBasisPoints();
}

Der Code lässt sich nun flüssiger lesen, die Informationen, die man im Hinterkopf halten muss, sind deutlich reduziert.

Guard Clauses lassen sich aber nicht nur für Rückgabewerte nutzen. Auch bei Schleifen können sie zu einer verbesserten Lesbarkeit beitragen.

foreach ($elements AS $object) {
    if ($object->isValid($value)) {
        //normale Verarbeitung
    }
}

Die ganze Zeit, während man sich die normale Verarbeitung anschaut, muss man im Hinterkopf behalten, wie die Bedingung aussah und dass es noch einen else-Teil zu der Bedingung geben könnte. Mit Guard Clauses lässt sich dies wieder vermeiden:

foreach ($elements AS $object) {
    if (!$object->isValid($value)) {
        continue;
    }
    //normale Verarbeitung
}

Ich hoffe der nutzen von Guard Clauses ist anhand diese Beispiele deutlich geworden. Sie sind natürlich kein Garant für lesbaren Code, aber sie tragen mit Sicherheit ihren Teil dazu bei. Es schadet jedenfalls nicht, sich ihrer ab und an zu erinnern 😉

Schreibe einen Kommentar

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