Page 1 of 1

refactorisation

PostPosted: Thu 19 Jun 2014 17:07
by Teaniel
Bonjour,

J'ai une question à vous soumettre :
Depuis un certain temps déjà, je travaille sur un projet assez conséquent (environ 400 classes actuellement).
Or il est apparu qu'un certain nombre de classes 'utilitaires' et utilisées partout de fait (genre types de données) étaient mal foutues. Je les ai donc refaites, mais dans le cadre d'un autre projet dans lequel je les utilisais aussi.
Cependant elles avaient été importées dans ce dernier projet en mode simple (pas librairie). En conséquence de quoi les classes modifiées ne sont pas utilisées dans mon gros projet...

La question est donc de savoir comment je peux faire pour remplacer l'ensemble de mes classes mal foutues par les nouvelles.
En fait j'ai commencé par importer un projet dans lequel je les avais copiées. Ensuite j'ai pris la première à retirer, ai calculé ses références, puis ai remplacé partout la référence à l'ancienne par la nouvelle. Une fois que l'ancienne n'avait plus de référence utile, je l'ai supprimée. Deux heures pour une seule classe. J'en ai une vingtaine à remplacer de cette manière.

Y aurait-il une meilleure solution pour faire cette refactorisation?

Cordialement
Marc

Re: refactorisation

PostPosted: Fri 20 Jun 2014 07:02
by Bruno Pagès
Bonjour,

La première idée qui me viens à l'esprit est d'utiliser le roundtrip sur les parties modifiées (à priori sous un/des package(s) spécifiques). Si les deux projets ne génèrent pas leur code au même endroit il suffit de remplacer les sources de ce qui est encore l'ancienne version par la nouvelle version puis de faire le roundtrip.
S'il n'y a jamais eu de génération de code vous pouvez faire une telle génération sur le projet non à jour au niveau des classes non à jour (à priori sous un/des package(s) spécifiques) dans un répertoire de travail, puis vous remplacez les sources générés par la nouvelle version de ceux-ci, puis vous faite le roundtrip du/des package(s) correspondants.
Le roundtrip modifie les classes, les références à partir des classes se trouvant dans les parties non soumises au roundtrip perdurent donc. Par contre le renommage d'une classes détruira celle sous l'ancien nom et en créera une nouvelle.
Bien-sûr cela n'est possible que si le langage à un roundtrip, et s'il n'y a rien qui le perturbe.

L'autre solution est de faire automatiquement ce que vous avez fait à la main, via un plug-out ad-hoc. Vous importez (comme une librairie tant qu'à faire) la nouvelle version des classes modifiées de façon à avoir simultanément l'ancienne et la nouvelle version de ces classes, et votre plug-out modifie le modèle pour remplacer toute référence aux anciennes classes pas les nouvelles hormis bien-sur sous les packages regroupant les anciennes et nouvelles versions de classes

Bien évidemment je ne saurais que trop conseiller de sauvegarder les projets avant de se livrer à ce genre de manipulation.

Re: refactorisation

PostPosted: Fri 20 Jun 2014 11:56
by Teaniel
Bonjour,

Je vous remercie pour ces réponses.
Je pense que je vais tenter de m'attaquer à la création du plug-out. Si c'est sans doute plus long, cela me semble moins aléatoire (génération/roundtrip ne sont en effet pas toujours symétriques). Et surtout, si bien écrit, cela sera réutilisable.

Cordialement,
Marc

Re: refactorisation

PostPosted: Thu 3 Jul 2014 19:05
by Bruno Pagès
Bonsoir,

Avez vous réalisé votre "plug-out" ?

Re: refactorisation

PostPosted: Thu 17 Jul 2014 17:25
by Teaniel
Bonjour,

Désolé je suis un peu distrait ces temps-ci...
Non, je ne m'y suis pas encore attaqué.

Je vous tiendrai de toutes façons au courant :)

A bientôt
Marc