Question

Je commence tout juste mon premier refactor à grande échelle et je dois scinder une classe (malheureusement grande) en deux, qui ne communiquent ensuite que via une interface. (Mon présentateur s'est avéré être un contrôleur et doit séparer la logique de l'interface graphique de la logique de l'application). En utilisant C # dans VisualStudio 2008 et Resharper, quel est le moyen le plus simple d'y parvenir?

Ce que je vais essayer, c'est a) Rassemblez les membres pour la nouvelle classe et "extraire la nouvelle classe" b) nettoyer le gâchis résultant c) "Interface d'extraction" d) rechercher toutes les références à la classe et les convertir en références d'interface

mais je n’ai jamais fait cela auparavant, et je me demande si quelqu'un connaît des bons conseils ou des pièges avant de commencer à tout déchirer ... Merci!

Était-ce utile?

La solution

Petits pas.

Étape 1: effectuez une petite modification à l'aide de l'excellent refactoring de Resharper.
Étape 2: Testez (de préférence un test unitaire) pour vous assurer que le code fonctionne toujours.
Étape 3: Valider le contrôle de source

Répétez ces 3 étapes plusieurs fois.

Cela ne fonctionnera peut-être pas si vous faites l'une de ces actions "doit être un grand pas tout à la fois". refactorings. Dans ce cas, effectuez autant de petites modifications que possible avant de vous lancer dans la grande étape.

Autres conseils

Appelez-moi à l'ancienne, mais personnellement, j'utilise les fonctions automatisées que vous avez décrites uniquement pour des tâches techniques (telles que le changement de nom, etc.)

Pour tout autre refactoring, comme l'extraction d'interfaces et autres, je préfère le faire manuellement. Vous découvrirez que vous pouvez effectuer encore plus de refactoring et que le code en sortira plus propre.

Je n'ai qu'un seul conseil important - assurez-vous absolument que vous pouvez revenir à l'état avant de démarrer le refactor sans rien perdre. Ensuite, plongez et allez-y. Vous finirez peut-être par devoir vous arrêter et recommencer, mais ce n'est pas grave (tant que vous avez suivi mon conseil). Vous apprendrez beaucoup à le faire.

Réponse courte ici d’abord, je vais écrire un article de blog à ce sujet, merci pour une idée!

Supposons donc que nous avons ceci:

class PresenterAndController
  {
    public void Control()
    {
      Present();
    }

    public void Present()
    {
      // present something
    }
  }

Nous devons d’abord convertir tous les usages des membres directs en utilisateurs indirects, c’est-à-dire les qualifier avec un champ. Pour ce faire, utilisez extraire le refactoring de la superclasse pour extraire la partie du présentateur dans la superclasse:

  internal class Presenter
  {
    public void Present()
    {
      // present something
    }
  }

  class PresenterAndController : Presenter
  {
    public void Control()
    {
      Present();
    }
  }

Créez un champ dans PresenterAndController qui en déléguera un et utilisez Generate (Alt-Ins) pour créer des membres délégués. Il leur arrivera de cacher des méthodes de base, car ce sont les mêmes:

  internal class Presenter
  {
    public void Present()
    {
      // present something
    }
  }

  class PresenterAndController : Presenter
  {
    private Presenter myPresenter;

    public void Present() // hides base method
    {
      myPresenter.Present();
    }

    public void Control()
    {
      Present(); // it now references method from this type
    }
  }

Supprimez Presenter de la liste d'héritage et vous avez terminé avec le fractionnement des classes. Maintenant, vous pouvez extraire des interfaces, utiliser des types de base là où c'est possible et les ranger autrement.

Je n’ai jamais utilisé VisualStudio, mais j’estime que le refactoring automatique dans Eclipse est assez fiable, du moins aussi fiable que je le ferais si je faisais le même travail.

Avant de vous lancer, investissez dans le contrôle de source: découvrez Git. Refactoriser sans SCM, c'est comme conduire les yeux bandés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top