Zum Inhalt springen

ValueObjects (Teil 2)

letzte Woche haben wir ValueObjects kennen gelernt und auch die Möglickeit eines Object-Pools gesehen. Jetzt geht es um einen weiteren Punkt, die Erzeugung valider Objekte. Schließlich kann das Person-Objekt aus der letzten Woche durchaus als Vor- und Nachname null haben. Um daraus entstehende Probleme zu vermeiden, passen wir das ValueObject heute noch etwas an.

Ein VO muss von vorneherein valide sein. Genau wie wir von einer 2 erwarten, dass sie valide ist. Hierfür erweitern wir das VO von letzter Woche um eine isValid Methode. Diese Methode überpüft die Eingabe und nur dann wir das VO erzeugt. Damit man den Fehlerfall sauber behandeln kann, wird eine Exception geworfen.

class IllegalArgumentException extends Exception {}

final class Person {

    private $firstname;
    private $lastname;
    private static $pool = array();

    private function __construct($firstname, $lastname) {
        $this->firstname = $firstname;
        $this->lastname = $lastname;
    }

    public static function valueOf($firstname, $lastname) {
        if (!self::isValid($firstname, $lastname)){
            throw new IllegalArgumentException();
        }
        
        $key = md5($firstname . '_' . $lastname);
        if (!array_key_exists($key, self::$pool)) {
            self::$pool[$key] = new self($firstname, $lastname);
        }
        return self::$pool[$key];
    }
    
    private static function isValid($firstname, $lastname) {
        return is_string($firstname) && is_string($lastname);
    }

    public function getFirstname() {
        return $this->firstname;
    }

    public function getLastName() {
        return $this->lastname;
    }

}

Nutzt man in einem VO ein weiteres VO, bspw. die Adresse, die zur Person passt, so kann man in der isValid-Methode überprüfen, ob das entsprechende Objekt nicht null ist und auch von der richtigen Klasse ist. So erhält man eine konsistente Abbildung der fachlichen Domäne.

Published inAllgemein

By continuing to use the site, you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close