Il existe un fichier source dans un projet assez volumineux avec plusieurs fonctions extrêmement sensibles aux performances (appelées des millions de fois par seconde). En fait, le responsable précédent a décidé d'écrire 12 copies d'une fonction chacune différant très légèrement, afin de gagner du temps qui serait consacré à la vérification des conditions dans une seule fonction.
Malheureusement, cela signifie que le code est un PITA à maintenir. Je voudrais supprimer tout le code en double et écrire un seul modèle. Cependant, le langage Java ne prend pas en charge les modèles et je ne suis pas sûr que les génériques conviennent à cela.
Mon plan actuel est d'écrire à la place un fichier qui génère les 12 copies de la fonction (un expanseur de modèle à usage unique, pratiquement). Je fournirais bien sûr de nombreuses explications pour lesquelles le fichier doit être généré par programme.
Ma préoccupation est que cela conduirait à la confusion des futurs responsables, et introduirait peut-être des bugs désagréables s'ils oublient de régénérer le fichier après l'avoir modifié, ou (pire encore) s'ils modifient à la place le fichier généré par programme. Malheureusement, à moins de réécrire le tout en C ++, je ne vois aucun moyen de résoudre ce problème.
Les avantages de cette approche l'emportent-ils sur les inconvénients? Dois-je plutôt:
- Profitez des performances et utilisez une seule fonction maintenable.
- Ajoutez des explications sur les raisons pour lesquelles la fonction doit être dupliquée 12 fois et supportez gracieusement la charge de maintenance.
- Essayez d'utiliser des génériques comme modèles (ils ne fonctionnent probablement pas de cette façon).
- Criez à l'ancien mainteneur pour avoir rendu le code si dépendant des performances d'une seule fonction.
- Autre méthode pour maintenir les performances et la maintenabilité?
PS En raison de la mauvaise conception du projet, le profilage de la fonction est plutôt délicat ... cependant, l'ancien mainteneur m'a convaincu que le niveau de performance est inacceptable. Je suppose qu'il entend par là plus de 5%, bien que ce soit une supposition complète de ma part.
Je devrais peut-être élaborer un peu. Les 12 copies font une tâche très similaire, mais ont des différences infimes. Les différences se trouvent à divers endroits de la fonction, donc malheureusement, il existe de très nombreuses instructions conditionnelles. Il y a effectivement 6 "modes" de fonctionnement, et 2 "paradigmes" de fonctionnement (mots inventés par moi-même). Pour utiliser la fonction, on précise le "mode" et le "paradigme" de fonctionnement. Ce n'est jamais dynamique; chaque morceau de code utilise exactement un mode et un paradigme. Les 12 paires mode-paradigme sont utilisées quelque part dans l'application. Les fonctions sont bien nommées func1 à func12, les nombres pairs représentant le deuxième paradigme et les nombres impairs représentant le premier paradigme.
Je suis conscient que c'est à peu près la pire conception jamais réalisée si la maintenabilité est l'objectif. Mais il semble être "assez rapide", et ce code n'a pas eu besoin de modifications depuis un moment ... Il convient également de noter que la fonction d'origine n'a pas été supprimée (bien qu'il s'agisse d'un code mort pour autant que je sache) , le refactoring serait donc simple.
Makefile
" (ou du système que vous utilisez) et supprimez-le juste après la compilation . De cette façon, ils n'ont tout simplement pas la possibilité de modifier le mauvais fichier source.