Choix du modèle CSS

Cet article fait suite aux articles précédent :

J’ai finalement décidé de ne pas utiliser le moteur de CSS de batik. Plusieurs raisons m’ont amené à cette décision. Tout d’abord, batik n’implémente pas l’héritage, mais seulement la cascade, il revient donc au client de le faire. Mais ce qui m’a le plus dérangé, c’est le caractère obscure de l’api. Cette librairie est très difficile à comprendre, mal documentée pour la partie CSS et je dirais même mal conçue.

Un exemple concret est que le constructeur de CSSEngine prend 13 valeurs en argument. Oui vous avez bien lu, treize !!! Inévitablement, il est difficile de comprendre le rôle de chacun de ces arguments.

Il existe par ailleurs ce qui me semble être des incohérences. Par exemple, lorsqu’on appelle la méthode getCascadedStyleMap(CSSStylableElement,String), celle-ci cherche à récupérer les valeurs actuelles des attributs que l’on veut justement initialiser. Sans doute y a-t-il une logique dans ce mécanisme, mais elle m’échappe. Le seul cas de figure où il serait nécessaire d’y accéder serait le support des sélecteurs d’attributs, mais ce n’est pas le cas ici. Autre étrangeté, cette méthode, qui est censée être appelée après avoir parsé la feuille de style, accède à nouveau au parser CSS. Cela signifie que le modèle de la CSS est incomplet ou incohérent.

En outre, certains indices me laissent penser que les performances du moteur de style doivent être désastreuses.

Pour toutes ces raisons, je préfère implémenter moi-même le moteur de CSS. Je me baserai sur la spécification DOM-Level-2-Style pour la définition du modèle CSS. Néanmoins, je ne respecterai pas l’implémentation de cette spécification (org.w3c.dom.css) au pied de la lettre, car là encore, j’ai relevé des incohérences. La spécification précise clairement que le modèle ne doit pas donner accès aux valeurs dites « spécifiée » ou « réelle », mais seulement aux valeurs « calculée ». Ce qui signifie que les instances de CSSPrimitiveValue sont des valeurs calculées puisqu’elles sont obtenues à partir du modèle. Or cette même spécification précise que les valeurs calculées doivent être accessibles en mode « read-only » tandis que l’interface CSSPrimitiveValue expose des setters.

Le moteur de style sera applicable à tout modèle XML. J’ai donc dors et déjà commencé à implémenter un modèle XML standard. Mais je me suis lancé dans une approche expérimentale. En effet, l’api swing implémente déjà un modèle qui repose sur le pattern Composite. Implémenter un modèle parallèle obligerait donc à synchroniser ces deux modèles avec toutes les difficultés que cela entraîne. Sans compter les problèmes de fuite de mémoire.

Pour résoudre ces inconvénients, j’ai défini un pattern que j’appellerai Messenger.

Messenger est un croisement des patterns Adapter et Singleton. Il consiste à présenter au client l’interface qu’il attend, comme dans le cas d’Adapter, mais cette interface est implémentée par un Singleton, ce qui évite les fuites de mémoire et évacue les problèmes de synchronisation. L’inconvénient majeur de ce pattern est qu’il doit être utilisé avec beaucoup de précaution. En particulier, les instances de Messenger ne doivent être référencées que par des variables dont la portée est strictement limitée à la méthode qui les manipule. Si on a besoin de conserver une référence, celle-ci doit pointer sur la valeur véhiculée par le Messenger, et non sur le Messenger lui-même. En outre, Messenger n’est pas adapté à un context multi-thread.

Pour l’instant, je souhaite enrichir fonctionnellement le framework Swinger, mais je consacrerai une release à l’optimisation des performances. Le pattern Messenger offre un potentiel de gain assez important en particulier au niveau des parsers CSS et XML.

Il me reste dorénavant à implémenter le modèle de CSS ainsi que l’algorithme de la cascade et de l’héritage. Pour cela, il me faudra étudier en détail la spécification CSS2. Je vous ferai part de mes réflexions sur ce sujet dans un prochain billet.

Publicités

0 Responses to “Choix du modèle CSS”



  1. Laisser un commentaire

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s





%d blogueurs aiment cette page :