Un truc que j'ai rencontré il y a pas longtemps: les moteurs de templates.
On commence avec une template textuelle, on va la parser pour pouvoir la traiter, donc on crée une fonction "parse" pour parser et une fonction "render" pour l'afficher. Jusque là tout va bien.
Le problème, c'est que dans cette template il y a des sous templates, des éléments de templates qui vont traiter des itérations, des propositions conditionnelles, ... et ces différentes sous-templates ont toutes des modes de rendu très différents (parce qu'il y a des logiques variables à appliquer), donc on se retrouve avec plein de cas particuliers bordéliques et de conditions dans notre fonction 'render' (on oublie la partie parsing).
Donc plutôt qu'avoir une structure template uniforme avec plein de bordel dedans, on va plutôt créer un objet Template de base, avec une méthode unique "render" (on peut en ajouter d'autres, mais c'est la principale). Et dans cette méthode, on a la logique applicative permettant d'afficher une template "racine" (principalement rendre toutes les sous-templates, et renvoyer le résultat).
Ensuite, pour chaque sous-template on peut créer une classe dérivée de Template: IfTemplate, ForTemplate, WhileTemplate, ... qui vont avoir strictement la même interface que Template, càd une unique méthode "render", mais elles auront leur logique applicative perso dans leur méthode "render". De plus, nos templates étant spécialisées elles peuvent stocker spécifiquement les éléments dont elles ont besoin, et potentiellement effectuer des optimisations à la compilation (à l'instantiation toussa): on regroupe les données et les comportements (méthode render) au sein d'entités independantes.
De cette manière, on peut tester une sous-template totalement en isolation (puisque son comportement à elle ne dépend pas des comportements des autres) et si une sous-template a un bug, la zone à surveiller/observer est limitée et contenue.
De plus, si on veut créer une sous-template (IncludeTemplate par exemple) on crée simplement un nouvel objet (et on modifie le parser, mais c'est un autre problème), les autres sous-templates n'ont pas à changer parce qu'elles se foutent éperdument des détails de l'implémentation de la nouvelle sous-template.
Message édité par masklinn le 27-06-2007 à 21:59:49
---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody