Facebook
Twitter
Google+
Kommentare
0

Laufzeit Abhängigkeit zu PHPUnit

Wer Komponenten entwickelt kennt das bestimmt. Hier ist die Rede von der „Design by contract“ Entwicklungs-Methodik. Ziel ist das reibungslose Zusammenspiel einzelner Programmkomponenten durch die Definition von strikten „Verträge“ zur Verwendung von Schnittstellen, die über deren statische Definition hinausgehen. Mit Verträge – sind hiermit die Bedingungen gemeint die bei der Verwendung einer Methode einzuhalten sind.

Sie die Bedingungen werden wie folgt definiert und eingesetzt:

Vorbedingungen = das sind Zusicherungen, die beim Aufrufen einzuhalten sind.
Nachbedingungen = die Zusicherungen, die nach dem Aufruf geliefert werden.
Invarianten = die Zusicherungen zum Aufbau der Klasse.

Die Bedingungen können sich auf die gesamte verfügbare Information beziehen, also auf Variablen- und Parameter-Inhalte ebenso wie auf Objektzustände des betroffenen Objekts oder anderer zugreifbarer Objekte. Sofern sich der Aufrufende an Vorbedingungen und Invarianten hält, können keine Fehler auftreten und die Methode liefert garantiert keine unerwarteten Ergebnisse.
Soweit dazu, und was hat das mit PHPUnit zu tun? Nun die PHPUnit “assertions” können in diesem Fall als Prüfwerkzeug für die Bedingungen in der „Design by contract“ Entwicklungs-Methodik eingesetzt werden. Die Überprüfung der Typen und der Bedingungen mittels der InvalidArgumentException wurde komplett auf das PHPUnit_Framework_Assert übertragen.
Hier ein Beispiel aus dem PHPUnit Manual um die Umsetzung zu veranschaulichen.

< ?php
require_once 'PHPUnit/Framework.php';

class BankAccount
{
    private $balance = 0;

    public function getBalance()
    {
        return $this->balance;
    }

    public function setBalance($balance)
    {
        PHPUnit_Framework_Assert::assertTrue($balance >= 0);

        $this->balance = $balance;
    }

    public function depositMoney($amount)
    {
        PHPUnit_Framework_Assert::assertTrue($amount >= 0);

        $this->balance += $amount;
    }

    public function withdrawMoney($amount)
    {
        PHPUnit_Framework_Assert::assertTrue($amount >= 0);
        PHPUnit_Framework_Assert::assertTrue($this->balance >= $amount);

        $this->balance -= $amount;
    }
}
?>

Wenn eine der Bedingungen nicht erfüllt wird, dann wird eine PHPUnit_Framework_AssertionFailedError Exception geworfen. Diese kann explicit abgefangen und verarbeitet werden. Hierdurch entsteht ein Vorteil: die Methoden beinhalten viel weniger Quellcode, und die Überprüfung der Bedingungen ist leichter zu lesen und verstehen. Ein Nachteil entsteht jedoch, nämlich die Laufzeit Abhängigkeit zu PHPUnit. Allgemein finde ich, dass es eine gute Alternative ist schnell und sicher seine Bedingungen in der „Design by contract“ Entwicklungs-Methodik umzusetzen. Was haltet Ihr davon?

Über den Autor

Gjero Krsteski

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen