Je vais vous donner notre expérience refactoring LedgerSMB. Nous avons pris la décision de faire les choses différemment au début et faisons toujours exactement ce que vous décrivez, mais sans beaucoup de méthodes de collage (nous avons quelques méthodes de collage, mais pas beaucoup).
La vie avec deux bases de code
LedgerSMB a survécu avec deux bases de code pendant environ 5 ans et il en faudra encore plusieurs avant d'éliminer l'ancienne base de code. L'ancienne base de code est une véritable horreur à voir. Mauvaise conception de la base de données, Perl construit comme IS->some_func(\%$some_object);
avec du code qui montre exactement pourquoi la métaphore spaghetti est parfois utilisée (des chemins d'exécution serpentant entre les modules et le dos, et entre les langues, sans rime ni raison). La nouvelle base de code évite cela en déplaçant les requêtes db dans des procédures stockées, en ayant un cadre plus propre pour le traitement des demandes, et bien plus encore.
La première chose que nous avons décidé de faire était d'essayer de refactoriser module par module. Cela signifie déplacer toutes les fonctionnalités d'une zone spécifique dans un nouveau module, puis raccorder l'ancien code au nouveau module. Si la nouvelle API est propre, ce n'est pas grave. Si la nouvelle API n'est pas les choses deviennent velues et c'est une invitation à travailler un peu plus fort à la nouvelle API ....
La deuxième chose est qu'il y a de nombreuses fois où le nouveau code doit accéder à la logique de l'ancien code. Cela doit être évité dans la mesure du possible car cela conduit à des méthodes de collage qui sont laides mais on ne peut pas toujours l'éviter. Dans ce cas, les méthodes de collage doivent être minimisées et évitées dans la mesure du possible mais utilisées lorsque cela est nécessaire.
Pour que cela fonctionne, vous devez vous engager à réécrire toutes les fonctionnalités dans une zone spécifique. Si vous pouvez, par exemple, réécrire tous les codes de suivi des informations client à la fois, cela signifie que le code qui appelle cela à partir de l'ancien code n'est pas difficile à travailler, et la répartition vers l'ancien code à partir du nouveau code est minimisée.
La deuxième chose est que si vous avez des abstractions raisonnables à votre place, vous devriez pouvoir choisir le niveau de l'API à appeler et comment le garder propre. Cependant, vous devriez penser à réécrire les parties qui appellent votre API afin qu'elles soient également un peu plus propres.
Il existe de nombreux domaines des outils commerciaux qui sont irréductiblement complexes. Vous ne pouvez pas vous débarrasser de toute complexité. Mais vous pouvez le gérer en vous concentrant sur des API propres qui font spécifiquement ce que vous devez faire et des modules qui utilisent cette API de manière constructive. La colle ne devrait être un dernier recours qu'après avoir considéré que la réécriture du reste du code appelant peut être plus rapide.