Sven Rautenberg: Static in MVC-Architektur?

Beitrag lesen

Moin!

Wobei ich ein cachen von Rückgabewerten dann doch lieber über einen Cache-Proxy erledigen würde anstatt durch das Objekt selber. Das hat den Vorteil, dass man die Caching-Strategie (pro Klasse oder Instanz) viel einfach auswechseln kann und das der Business-Code vom Thema Caching entkoppelt ist, was es einfacher zu testen macht.

kannst mal n beispiel machen??? Nie gesehen oder ähnlich aber der Begriff wäre mir nicht geläufig

interface MyTask {
    public function doSomething($param);
}

class MyTaskImpl implements MyTask {
    public function doSomething($param) {
        sleep(1000); // braucht ewig
        return $param.$param;
    }
}

class MyTaskCachingProxy implements MyTask {
    public function __construct(MyTask $task) {
        $this->innerTask = $task;
    }

    public function doSomething($param) {
        return $this->innerTask->doSomething($param);
    }
}

Der CachingProxy macht im Moment noch kein Caching - aber man kann die Logik, um einen Speicher anzubinden, auf Vorkommen eines Speicherwertes je nach $param zu durchsuchen, im Erfolgsfall das Auslesen und zurückgeben des gecachten Wertes, im Mißerfolgsfall das Aufrufen der Originalfunktion, das Abfangen des Rückgabewerts mit Abspeichern, viel besser auslagern, wenn man sie nicht zusammen mit der fachlichen Funktionalität in eine Klasse kippt.

Bonuspunkt: Wenn irgendwas mit dem Cache nicht funktioniert, lässt man den Proxy mal weg und schaut, ob es dann immer noch nicht funktioniert: Wenn das Problem bleibt, liegt es in der eigentlichen Fachlogik, wenn es dann verschwunden ist, hat man vermutlich ein Problem in der Cachelogik.

Und weil sowohl Fachlogik als auch Cachelogik komplex werden dürften, will man das nicht vermischen.

Es gibt übrigens nur zwei Bibliotheken für PHP, die Caching einigermaßen vernünftig für beide Aspekte umsetzen: Zend_Cache aus dem Zend Framework 1, und Zend\Cache aus dem Zend Framework 2. Alle anderen üblichen Verdächtigen, wie Symfony oder Doctrine, haben lediglich einen Layer für die Abstraktion des Storage, nicht aber für das Implementieren einer Proxy-Klasse mit Abfangen der Rückgaben (nicht vergessen: auch ECHO ist eine Art Rückgabe).

Grüße Sven