Collections, Object Chaining, et la vérité sur le Père Noël
By Geoffrey on Wednesday 29 November 2006, 23:09 - Coding - Permalink
Aujourd'hui je vais vous parler de deux concepts que j'aime beaucoup et que j'ai (re)découverts en travaillant sur mon projet personnel de conquête de l'univers: les Collections d'objets et l'Object Chaining.
Les collections, qui sont peut-être finalement un design pattern connu sous un autre nom, permettent d'executer aisément des méthodes sur plusieurs objets (une collection d'objets quoi). Concrétement, disons qu'on à une classe My_Collection, qui implémente les interfaces Iterator (et Countable tant qu'a faire) de la SPL, ainsi que la fonction magique __call suivante (je vous fait grace du docblock):
class My_Collection implements Iterator, Countable {
public function __call($method, $args) {
$calls = 0;
foreach($this as $item) {
if (method_exists($item, $method)) {
call_user_func_array(array($item, $method), $args);
$calls++;
}
}
if ($calls > 0) {
return $this;
} else {
throw new My_Collection_Exception('Method catched but could not be called: '.$method);
}
}
}
Ce dispositif permet d'utiliser le genre de code suivant (si les objets de la collection le permettent, bien évidemment, et disons qu'ici ce sont des objets représentant des images, supportant les méthodes move et createThumbnail):
# $array contient les objets My_Image
$collection = new My_Collection($array);
$collection->move('/new/path/')->createThumbnail();
Ce qui, comme vous l'aurez deviné, déplacera les fichiers de la collection vers /new/path, puis en créera des miniatures.
Deuxième chose, l'Object Chaining. On vient de le voir en fait, ça consiste à chainer les appels de méthodes grâce à un subtil return $this;, qui retourne donc une référence à l'objet courant. Exemple pratique, dans le Zend Framework, en étendant Zend_View:
class My_View extends Zend_View {
public function assign($spec) {
$args = func_get_args();
call_user_func_array(array('parent', 'assign'), $args);
return $this;
}
}
Ce qui autorise le genre de code suivant (en admettant que vous ayiez une instance de My_View dans le registre):
Zend::registry('view')
->assign('foo', $foo)
->assign('foo', $bar)
->render('template.php');
Et là c'est fort, parceque ça rejoint fortement quelque chose dont je parlais en janvier dernier (le truc qui parle de with), et donc j'en déduis une chose formidable: Le père noël existe, et il m'a entendu. Merci Santa Copain.
Comments
Le design pattern dont tu cherches le nom en début de post ce ne serait pas par hasard les visiteurs ?
Hum, après lecture sur wikipedia (http://en.wikipedia.org/wiki/Visito...), ça ressemble un peu, mais finalement pas vraiment, vu que dans ma Collection, tous les appels de fonctions sont les mêmes (aucune notion de polymorphisme n'entre en jeu).
En fait, je vois plutot ça comme un Proxy Pattern revisité