1

Je travaille sur une application C++ héritée de client lourd qui a beaucoup de logique métier mélangée à la présentation. Je veux nettoyer les choses et refactoriser le code complètement, donc il y a une séparation claire des préoccupations. Je regarde MVC ou un autre modèle de conception approprié afin d'y parvenir.Refactoring d'une application héritée de client lourd

Je voudrais obtenir des recommandations de personnes qui ont foulé cette route avant -

Dois-je utiliser MVP ou MVC (ou un autre motif)?

Quelles sont/sont les meilleures pratiques pour entreprendre quelque chose comme ceci (c'est-à-dire des étapes/vérifications utiles)?

+0

La terminologie est-elle passée de "client lourd" à "client lourd"? Ou est-ce que FAT a d'autres significations au-delà de l'épaisseur? – Ants

+0

@Ants: il a toujours été "gros" dans le contexte d'applications comme celle-ci. Vous pensez que les terminaux je pense? – Thorarin

+0

Avec quel framework ou boîte à outils l'interface graphique est-elle implémentée? –

Répondre

1

L'étape la plus utile consiste à créer un ensemble de tests de régression très robuste et complet, quel que soit le motif choisi.

Pour choisir entre MVP et MVC, s'il vous plaît examiner leurs différences dans cette question SO:

What are MVP and MVC and what is the difference?

1

Si MVP vs MVC est votre principal problème, vous pouvez probablement choisir librement.

Il y a trois facteurs qui influencent cette décision: votre expérience précédente, la prise en charge de votre infrastructure/bibliothèques et qui correspond mieux à la base de code existante. Dans mon expérience, les deux modèles s'inscrivent dans des applications C++ héritées comme le chat puke sur un gâteau de mariage. Vos principaux défis seront les suivants:

  • Ne rien casser. Heck, il est probablement pas tout casser
  • Remarquant que vous êtes réellement aller de l'avant
  • Faire que de petits changements qui ne nécessitent pas une ré-écriture de trois mois de certains composants

Le reste est très générique pour traiter des applications héritées, non liées aux spécificités de votre question. Je vais le laisser ici puisque vous avez aussi une partie générique.

Rewrite vs Refactor Vous avez déjà déclaré votre décision, donc je viens de mettre en avant les arguments de réécriture pro à considérer: si vous avez une spécification claire et comprendre comment les utilisateurs actuels utilisent cette application, une ré-écriture peut être plus rapide et moins cher lorsque 30% ou plus du code nécessite des modifications. (Cela ne signifie pas « tout réécrire », cela peut vouloir dire aussi réduisant l'application à la logique seule, puis la plantation d'une nouvelle couche de présentation sur le dessus de celui-ci)

En supposant que vous allez pour refactor:

Définissez vos objectifs Pourquoi avez-vous besoin de refactoriser l'application? Les bonnes raisons pourraient être de nombreuses nouvelles fonctionnalités à mettre en œuvre, la couche de présentation doit être remplacée, ou à boguer pour rester sain d'esprit. À partir de là, décidez ce qui doit changer et ce qui peut rester tel qu'il est.

Vous avez déjà choisi votre objectif: MV *. Je veux juste que vous pensiez aux avantages pour le client et le propriétaire du code à long terme.

Lecture du code. Non, vraiment, prenez votre temps pour vous habituer à la base de code. Parcourez-le avec le débogueur. Essayez de comprendre les choses impliquées. Prenez des notes sur les améliorations que vous pensez que vous devriez apporter.

Créer des tests - principalement des tests de régression pour le comportement actuellement souhaité. Avec les bases de code héritées, elles sont le plus souvent manuelles, alors créez des protocoles de test qu'un crétin peut suivre, et essayez de trouver un non-crétin qui peut exécuter ces tests de temps en temps. Essayez d'obtenir des cas d'utilisation d'utilisateurs existants.

S'en tenir à de petits changements réversibles Si une étape de refactorisation se passe mal, elle doit être suffisamment petite pour être jetée sans hésitation. Parfois, ce n'est pas facile, mes étapes les plus défavorables typiques sont:
- décider quelle fonctionnalité remplacer. Faire des plans comment le nouveau code devrait ressembler. - déplacer le code existant derrière une interface qui fonctionne aussi pour le nouveau code - Test - remplacer la fonctionnalité avec votre nouveau code - Test - parfois, l'interface est « finale », vous Somethimes pouvez supprimer/réduire

Toujours améliorer Ne pas accepter les retraits de fonctionnalité qui "peuvent être corrigés plus tard".

0

Vous devriez jeter un oeil à "Travailler efficacement avec Legacy Code" par Michael Feathers. Le livre décrit comment obtenir votre code existant dans un harnais de test, ainsi que comment briser en toute sécurité les dépendances dans le code.