Comment supprimer le code en double (en général)?

10

Dans un langage OO (par exemple, mais sans s'y limiter, Java) comment corrigez-vous le code en double en fonction de la portée de son occurrence? Je commencerais par (par exemple)

  • dans la même classe (portée), effectuez le refactoring de la méthode d'extraction (correction)
  • dans les classes de la même hiérarchie (portée), effectuez la méthode d'extraction et tirez vers le haut (correction)
  • ...
Peter Kofler
la source
jetez un oeil à un exemple pour implémenter le principe DRY (Ne vous répétez pas) avec la même classe à ceci: geekswithblogs.net/chrisfalter/archive/2008/03/07/…
NoChance
La question d'origine sur SO ( stackoverflow.com/questions/7380946/… ) a été clôturée. Je l'ai donc déplacé ici.
Peter Kofler

Réponses:

8

Récemment, j'ai trouvé une bonne réponse à ma question dans "Clean Code" d'oncle Bob, que je veux partager. Il différencie trois types de duplication

Les morceaux de code identique doivent être remplacés par une seule méthode. Le correctif consisterait donc à extraire la méthode et à déléguer à un comportement courant.

  • dans la même méthode, effectuez l'extraction de la variable locale et réutilisez-la.
  • dans la même classe, effectuez le refactoring de la méthode d'extraction.
  • dans les classes de la même hiérarchie Extract Method et Pull it Up. Une hiérarchie peut être créée pour trouver une place pour les méthodes.
  • dans les classes de hiérarchies distinctes, utilisez la délégation à de nouveaux objets.
  • Si les méthodes n'ont besoin d'aucun état englobant, le modèle "lib" peut être appliqué (c'est-à-dire un conteneur pour les méthodes statiques, généralement appelé SthUtilou SthLib).

cas de switch/caseet if/elsequi testent toujours pour le même ensemble de conditions .

  • Ceux-ci doivent être remplacés par du polymorphisme.

Modules qui implémentent des algorithmes similaires . Ce sont les plus difficiles à trouver, car aucun détecteur de clone ne peut les trouver.

  • Comme la portée est plus grande, des modèles de conception sont utilisés. Le modèle de conception de la méthode de modèle peut être appliqué pour les algorithmes à l'intérieur d'une hiérarchie de classes.
  • Un modèle de conception de stratégie peut être appliqué à tout algorithme utilisé à différents endroits.

Également un point valable mentionné par Oded, lorsqu'il s'agit de différentes versions de bibliothèques

  • consolider sur une seule version. Le modèle de conception de la façade peut aider ici.

En fin de compte, la meilleure phrase pour répondre à ma question est par stimms:

La méthode de réutilisation de code utilisée dans les langages OO est les objets.

Peter Kofler
la source
5

En général - consolidez le code en double en un seul endroit et assurez-vous que le site de duplication d'origine appelle l'endroit consolidé.

Dans vos exemples, dans une classe, ce serait la méthode extraite et dans un ensemble de classes, la méthode extraite dans la classe de base.

Dans le code copier-coller, cela consisterait à supprimer les doublons et à garantir que tous les utilisateurs utilisent désormais la copie unique (quel que soit le niveau).

Lorsque vous traitez avec différentes versions de bibliothèques, consolidez sur une seule version (si possible).

Oded
la source
Ne serait-ce pas la méthode "pull-down" si elle est dans une classe de base? J'imagine toujours les classes de base comme physiquement sous les classes dérivées.
Dave Nay
Le nom propre du livre Refactoring est "pull up".
Peter Kofler
1

Je suppose que c'est une question ouverte mais cela dépend aussi de l'état du code. Je veux dire que vous pouvez tolérer un peu le code en double en fonction du contexte. La règle de trois est bonne à cet égard.

Règle de trois La première fois que vous faites quelque chose, vous le faites simplement. La deuxième fois que vous faites quelque chose de similaire, vous grimacez devant la duplication, mais vous faites quand même la chose en double. La troisième fois que vous faites quelque chose de similaire, vous refactorisez.

Bien que cela soit à peu près discutable, ce post considère également les cas où vous toléreriez un code en double.

Will Hughes
la source
1
+1 sur la "règle des trois". Je suis toujours étonné de sa large application.
andy mango
1
Cela ne répond pas à la question du comment .
Jan Doggen