Bonjour à tous,
Ça y est, je suis enfin tombé (professionnellement, j'entends) sur un code développé par quelqu'un de plus fanatique que moi.
Moi qui prône le bien coder, le boost, le template, la meta-prog à tous crins depuis de longues années, j'ai aujourd'hui pour mission de péréniser un code tellement plein de templates, que j'ai le plus grand mal à le lire.
Pour vous donner une idée, une recherche du mot clef "typename" dans le projet donne 8417 résultats pour 911 fichiers (*)
J'en appelle donc à tous mes co-fanatiques en cette discipline qu'est l'abus de templates : ceux avec lesquels j'ai eu l'occasion d'avoir de long débats passionnés (ici même et ailleurs), et ceux qui ne m'ont pas encore offert cette chance.
Ma question est simple : "Quels outils utilisez-vous pour parcourir vos codes templatés ?"
Mieux qu'une explication, voici un exemple :
Toto.hTiti.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 class Toto { typedef int Count; }Tata.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 template<typename T> class Titi { typedef T::Count Count; Count count; }main.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 template<typename T> class Tata { typedef Titi<T> Tutu; }Tata.hpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ... Tata<Toto> > instance_de_Tata; ...Quand je tombe sur la ligne marquée du fichier Tata.hpp, aujourd'hui, il me faut une bonne minute pour remonter au type de "count". (d'autant plus que les fichiers sont répartis dans de nombreux répertoires, et que mon IDE ne sait, la plupart du temps répondre que : "symbol not defined").
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4... Tutu tutu; tutu.count; // <--- de quel type est ceci ? ...
Cette minute me prend d'énergie, qu'en général quand j'obtiens ma réponse, je n'ai plus du tout en tête la raison pour laquelle je me suis posé cette question.
Ma découverte du code est donc excessivement longue, et par la même, la maintenance engendrée doit l'être aussi.
J'ai donné le code à manger à tous les "code completer" dont je dispose (dont celui de crosoft). Et sous prétexte de ne pas savoir résoudre parfaitement le problème, aucun d'entre eux ne semble le résoudre même partiellement.
En particulier, le lien entre Tata et Toto est très compliqué à faire. Je me contenterais d'un système semi-automatique, mais cela ne semble pas exister.
A l'heure actuelle, je n'ai que trois pistes :
- écrire mon propre outil (ouhla !)
- proposer une réorganisation du code (en supprimant une partie des templates)
- écrire un pseudo-dictionnaire (étant donné que souvent les mêmes noms de typename ou presque désignent souvent les mêmes types)
Avant de me lancer sur l'une ou l'autre de ces pistes, je préfèrerais savoir si l'un d'entre vous connait un outil qui pourrait m'aider.
Merci à ceux qui ont lu.
Merci à ceux qui répondront.
(*) je sais, certains vont me dire que l'on peut (et que l'on doit) utiliser des typedef même si l'on n'utilise pas de template, et ils auront raison. Mais j'espère qu'ils m'accorderont le fait que cette utilisation est négligeable (si ce n'est en importance, au moins en volume) devant celle des typename et typedef induits par les templates.
Partager