J'ai récemment été de plus en plus frustré par un problème que je vois émerger dans la base de code de mes projets.
Je travaille sur un projet Java de grande envergure qui compte plus d'un million de lignes de code. Les interfaces et la structure des classes sont très bien conçues et les ingénieurs qui écrivent le code sont très compétents. Le problème est qu'en essayant de rendre le code plus propre, les gens écrivent des classes utilitaires chaque fois qu'ils ont besoin de réutiliser une fonctionnalité, ce qui fait qu'avec le temps et la croissance du projet, de plus en plus de méthodes utilitaires apparaissent. Cependant, lorsque l'ingénieur suivant a besoin de la même fonctionnalité, il n'a aucun moyen de savoir que quelqu'un a déjà implémenté une classe (ou méthode) utilitaire quelque part dans le code et implémente une autre copie de la fonctionnalité dans une classe différente. Il en résulte une grande duplication du code et un trop grand nombre de classes utilitaires dont les fonctionnalités se chevauchent.
Existe-t-il des outils ou des principes de conception que nous pouvons mettre en œuvre en tant qu'équipe afin d'éviter la duplication et la faible visibilité des classes d'utilité ?
Exemple : L'ingénieur A a 3 endroits où il doit transformer le XML en String. Il écrit donc une classe utilitaire appelée XMLUtil et place un toString(Document)
dans celui-ci. L'ingénieur B a plusieurs endroits où il sérialise les documents dans différents formats, y compris les chaînes de caractères, il écrit donc une classe utilitaire appelée SerializationUtil et possède une méthode statique appelée serialize(Document)
qui renvoie une chaîne de caractères.
Notez que c'est plus qu'une simple duplication de code car il est tout à fait possible que les 2 implémentations de l'exemple ci-dessus soient différentes (disons que l'une utilise l'API du transformateur et l'autre Xerces2-J) donc cela peut être vu comme un problème de "meilleures pratiques" également...
Mise à jour : Je suppose que je décris mieux l'environnement actuel dans lequel nous évoluons. Nous utilisons Hudson pour le CI, Clover pour la couverture du code et Checkstyle pour l'analyse statique du code. Nous utilisons un développement agile comprenant des entretiens quotidiens et des revues de code (peut-être insuffisantes). Nous définissons toutes nos classes utilitaires dans un .util qui, en raison de sa taille, compte maintenant 13 sous-paquets et environ 60 classes sous la classe Root (.util). Nous utilisons également des bibliothèques tierces telles que la plupart des jars apache commons et certains des jars qui composent Guava.
Je suis certain que nous pouvons réduire de moitié le nombre d'utilitaires si nous confions à quelqu'un la tâche de remanier l'ensemble de ce paquet. Je me demandais s'il existe des outils qui peuvent rendre cette opération moins coûteuse et s'il existe des méthodologies qui peuvent retarder autant que possible la répétition du problème.