Comment migrer le code VB6 laid et sans papiers to.NET

je sais qu'il y a déjà des Questions sur la migration VB6, mais la base de code de mon projet apporte de nouvelles questions ici.

je dois dire que la qualité du Code, la structure et l'architecture sont juste un cauchemar. Il y a 2 grands projets: Nr. 1 avec 40 formulaires, 40 Modules et quelques fichiers de classe, cet EXE est en quelque sorte un "système de base". Nr. 2 avec 80 formulaires, 20 Modules et quelques fichiers de classe encore une fois, cette EXE appelle des fonctions qui forment le "système de base". Puis il y a ~10 autres Projets avec GUI (1 à 3 formulaires chacun) et 90 Autres Projets non-GUI, la plupart étant des fichiers EXE, certains DLLs. Les DLLs sont écrits en C, C++ et VB6.

le Code a évolué depuis 10 ans, et écrit principalement par 1 (Mauvais) développeur à la fois.

  • les fonctions avec 500 lignes (et plus) sont très courantes.
  • 90% des composants de L'interface graphique sont nommés text1, command2 (1),...
  • le copier-coller est partout E. G. un projet EXE (sans GUI) avec 5000 des lignes de code ont été copiées et le seul changement dans la copie était d'envoyer des fichiers par courrier au lieu de FTP (il y a aussi 2 autres copies du même projet).
  • j'ai eu une fois un petit formulaire (15 champs), où je devrais résoudre un petit problème(max. une chose d'une demi-heure normalement), chaque fois que je changeais quelque chose, il ne fonctionnait pas, ou produit de nouvelles erreurs dans la forme. Après 2 jours, j'ai décidé de réécrire la forme complètement et de ~20 énoncés SQL dans l'ancienne forme, seulement 2 ont survécu dans le nouveau un.
  • ne demandez même pas sur les commentaires dans le code ...

j'ai repris le projet il y a quelques mois et je suis la seule responsable. Il y a un flux constant (mais faible) de demandes de changement et d'erreurs et nous obtenons un budget de maintenance de la part de nos clients pour maintenir le logiciel en marche et "à jour" en termes d'exigences légales.

Mes Options

1) réécrire à partir de zéro - dans ce cas, je pourrais l'écrire en Java pour portabilité. Le problème ici est qu'en dehors de l'aide d'un (ancien) utilisateur, il n'y a pas de documentation, donc le code laid est la "documentation". Il y a une personne de haut niveau qui sait ce que le logiciel devrait faire. De plus, il est difficile de convaincre la direction de le faire, même s'il y a d'énormes économies à long terme, il y a des questions politiques. Je ne peux pas non plus faire ce projet (vb) à la fois parce que la structure de la base de données n'est pas meilleure que le code, c'est-à-dire doit être fait à partir de zéro aussi. J'Ai Donc peut seulement changer le logiciel entier à la fois.

2) migrer le code vers VB.NET / C# Migration des principaux projets d'abord, j'ai testé que déjà et a obtenu ~2000 commentaires de mise à niveau du projet n ° 1, la plupart d'entre eux choses comme L'écran.MousePointer changé, fonctions avec des valeurs de retour variables et ainsi de suite. Mon idée ici est après le convert, créer des classes pour l'abstraction DE DB, changer le code pour utiliser ces classes et faire le remaniement, migrer et changer les autres projets aussi et quand tout le code utilise les classes DB, change la structure DB.

3) Refactor le code dans VB6 chaque fois que je dois changer quelque chose là de toute façon (je le fais déjà en partie) et à un certain point refactor aussi le reste. De cette façon, il est plus facile de voir la fonctionnalité originale, parce que c'est le code original et quand il y a des erreurs, il est évident qu'elles ne peuvent pas être le résultat de la migration. Quand le code est remanié (je suppose qu'il sera de 50-75% plus petit alors aussi) il est plus facile de le migrer vers .NET. Puis changer la structure de la base de données (et ensuite faire une autre ronde de remaniement...).

il y a des changements plus importants à faire dans le futur (le rendre compatible avec Win7, et un autre grand CR qui affecte de grandes parties du code), donc il y aurait une bonne occasion de faire ces changements, comme je vais devoir passer en revue beaucoup de code de toute façon.

ma Question Est qui a de l'expérience / des conseils pour migrer le mauvais, le code laid? Quelles options suggérez-vous?

23
demandé sur Makoto 2010-01-20 17:20:39

9 réponses

j'ai dû passer par la même chose (application Massive VB6 sans documentation et code horrible.). Le seul chemin sûr et raisonnable que vous pouvez prendre est le numéro 3. Pour améliorer quelque chose, vous devez d'abord comprendre. Si vous prenez la route 1 ou 2, Vous êtes sûr d'être laissé avec un gâchis horrible.

rappelez-vous de toujours garder l'idée au fond de votre esprit que votre objectif final est une migration complète vers .NET. Pendant que vous refactorisez pensez à comment vb6s terrible soutien OO ressemblera en VB.NET ou C#. Si possible, changez votre code pour faciliter la migration.

vous pouvez envisager de changer une grande partie de vos fonctionnalités de base en une DLL.net et de l'exposer à VB6 via COM. Cela supprimera une quantité ridicule de code de votre VB6 et laissera, espérons-le, la plupart de la logique d'affaires.

la chose La plus importante que vous devez retenir est de ne pas être un cow-boy.

  1. Ecrire Des tests pour un module.
  2. Refactoriser un module.
  3. tester le module.
  4. relâchez votre application.
  5. GOTO 1
19
répondu ChaosPandion 2010-01-20 18:26:42

le code est absolument à migrer? Si ce n'est pas le cas, il sert toujours son but, et est à moitié maintenable, juste laisser seul et passer sur.

votre motivation à déplacer le code vers un nouveau langage va bientôt s'estomper après d'innombrables heures, semaines, et mois de migration de code -- surtout sur l'échelle que vous avez mentionnée.

l'idée de la migration de code est une idée fantastique, conceptuellement. Selon toute probabilité, c'est un terrible gâchis et vous haïr la vie en le faisant.

Pensez à ce sujet, détestez-vous votre vie maintenant tout en réparant un défaut? Escaller que de 100x pour le projet de migration.

la plupart des entreprises se soucient moins de ce qui est sous le capot tant que ça marche. Rappelez-vous, ils ne sont pas des développeurs, ne se soucient pas de combien d'une douleur il est de le réparer (car ils ne sont pas ceux qui le font) et de motiver l'entreprise à dépenser des dizaines de milliers de dollars pour mettre le code à jour, simplement ne pas faire de sens des affaires.

11
répondu George Johnston 2010-01-20 14:46:49

a vécu la migration similaire de code de 14 ans à VS2008

Voici quelques conseils:

  1. supprimer les dépendances sur les composants tiers.
  2. envisager la migration par étapes, p. ex. en utilisant l'interop inversé.
  3. les couleurs et les polices doivent être traitées à la main.
  4. attention aux objets non initialisés dans les tableaux après la migration vers .NET
  5. modifier l'erreur pour essayer de saisir
  6. Faire usage de Microsoft.VisualBasic.Compatibilité.Namespace VB6 si nécessaire.
  7. Conserver refactoring au minimum jusqu'à ce que tout le code converti .NET
  8. attention aux tableaux à base non nulle dans votre code VB6.
  9. Refactor (minimal) votre code dans VB6 pour qu'il puisse passer par l'assistant de conversion de code.
  10. attention aux contrôles VB6 basés sur 1, par exemple ListView
  11. utilisez synclock pour éviter les problèmes de threading.
  12. si vous faites un refactor manuel d'un sub, alors faites attention aux changements de taille des types de données, surtout si vous travaillez avec file IO.

il y a une entreprise qui peut vous aider avec l'ensemble du processus (bien que nous ne les avons pas utilisés) http://www.vbmigration.com/

10
répondu PeanutPower 2010-01-20 16:40:38

découvrez M. Plumes""Travailler Efficacement avec les Legacy Code" -- il aborde les pièges de l'améliorer, de refactoring et de la migration et du code non testé.

6
répondu Michael Paulukonis 2010-01-20 14:41:46

vous avez fait un excellent travail de formulation de cette question. Merci pour le demander! Et merci à la communauté stackoverflow d'avoir affiché des réponses réfléchies (comme d'habitude).

S'il s'agit d'un codebase assez grand, et qu'il semble que ce soit le cas (50-100 vbps inter reliés, 200-500K LOC), alors vous devriez envisager d'investir dans les outils de migration. Considérez cette analogie: si vous aviez une grande quantité de données à convertir, même si les données source étaient sales et très différent du format désiré, vous auriez utiliser des outils. Si quelqu'un a suggéré que vous devriez simplement entrer de nouveau les données, ou même faire une conversion grossière et puis réparer à la main, vous penseriez qu'ils sont fous. Aussi avec 120 formulaires, l'application semble fournir une quantité assez importante de fonctionnalité d'affaires. Cette fonctionnalité est apparue au fil de nombreuses années d'utilisation, et, qu'on le veuille ou non, le code VB6 représente une spécification complète, formelle et testée par la production de cette fonctionnalité, ainsi qu'une myriade de faits techniques. sur le fonctionnement de l'application dans les coulisses. La refonte, le recodage et le ré-essai de toutes ces exigences fonctionnelles/techniques "à partir de zéro" sont très coûteux et difficiles. Afin de gérer le coût et le risque du projet, vous devez "encaisser" le code d'héritage. La question Est de savoir comment y parvenir et comment garantir un coût de possession moins élevé après la migration.

le défi a moins à voir avec la taille de la base de données qu'avec les détails de la refonte nécessaire pour s'adapter et prendre avantage de .NET. Vous devez identifier les choses spécifiques qui rendent le code VB6 "laid", pourquoi il est" laid", et comment vous devez/devriez/voulez faire ces choses différemment .NET. Une fois que vous avez commencé à formuler ces exigences de Refonte, vous pouvez commencer à les mettre en œuvre dans votre processus de conversion afin qu'elles apparaissent dans votre code.net. L'approche générale que nous préconisons est appelé le "outil assistée de réécriture" et il est fait de la façon suivante:

  1. exécuter l' traduction
  2. construire/examiner/tester le code généré pour identifier/affiner les améliorations nécessaires du code
  3. si le code généré est "assez bon", goto terminer le travail .NET
  4. reconfigurer le traducteur pour mettre en œuvre les améliorations nécessaires (le cas échéant)
  5. goto 1

La sortie de l'outil n'a pas besoin d'être "parfait" (logiciel est jamais...) il suffit que ce soit"assez bon". Ce qui est "assez bon" mentionné à l'étape 3 est une question cruciale. Essentiellement, cela signifie que la qualité du code – en termes d'être vérifié comme fonctionnellement correct et conforme à vos normes – est telle que l'équipe de développement sait ce qu'il faudra pour terminer la migration et ensuite continuer à exploiter/maintenir l'application-et ils sont confiants qu'ils peuvent le faire dans le temps et les ressources donnés contraintes. Pour un très grand codebase "assez bon" est "très bon" parce qu'il est tout simplement trop cher et risqué d'essayer de terminer et par la suite maintenir une migration de mauvaise qualité. En général, plus le code est grand et plus le budget est petit, plus votre processus de migration doit être efficace.

aussi quelques réflexions sur "finir le travail dans .NET": avoir un code bien formé dans .NET est un jalon important. Il existe de bons outils de remaniement, d'analyse et de test d'unités de la communauté.net qui peuvent vous aider à accélérer vos efforts pour terminer la migration. Vous utiliserez Visual Studio très tôt dans le processus pour expérimenter et affiner la refonte, et déboguer/tester l'application. Être capable de travailler avec l'ensemble de votre base de données en .NET et avec Visual Studio tôt dans l'effort de migration est un avantage clé (et une partie critique) de l'approche assistée par outil.

bien sûr, pour que cela soit possible, vous devez être en mesure d'investir dans un ensemble d'outils de migration qui est spécifiquement conçu pour soutenir l'outil assistée de réécriture. L'outil de Grandes Migrations est le seul outil que je connaisse dans cette catégorie.

Disclaimer: je travaille pour des Grandes Migrations. Il y a beaucoup plus d'informations sur notre site – y compris des études de cas sur la façon dont l'outil a été utilisé pour aider à migrer plus de 1m LOC de VB6 vers C#, et le manuel de l'utilisateur gmStudio qui décrit le produit et la méthodologie en détail.

6
répondu mark 2010-01-22 14:30:44

D'après votre description de ce projet, il semble qu'il soit possible pour vous de vous reformuler et de migrer en même temps. Vous êtes clairement de la grande quantité de code redondant et le consolider, il est probable que, dans le cadre de la consolidation, vous pouvez également réécrire (le code redondant, qui est).NET.

cela ne fonctionnera pas pour les trucs D'UI. Mais ça le sera pour les bases de données et la logique des affaires. Par exemple, je n'ai pas vu votre code, mais je vais parier pliage l'argent que la plupart des boîtes combo dans votre application qui sont peuplées par des méthodes dans leur forme (probablement copié et collé dans Form_Load) qui créent ADO recordsets et boucle à travers eux. C'est quelque chose qui peut être refactorisé dans une classe d'accès aux données.net et intégré facilement dans les formulaires existants. Il vous permettra également probablement d'introduire le monde magique de la mise en cache dans cette application, qui sera agréable parce que cela entraînera probablement des performances visibles amélioration.

et les améliorations visibles sont importantes. À moins que votre direction ne croie totalement à la nécessité de faire cela, il s'agit d'une entreprise à très haut risque. C'est très mauvais si vous vous retrouvez à dire à votre direction qu'une RC donnée va prendre plus de temps à mettre en œuvre qu'ils ne s'y attendent en raison de problèmes dans votre remaniement. Même si vous avez un soutien complet, vous ne voulez pas que cette situation se produise, mais c'est bien pire si votre soutien est partiel. Améliorations visibles va faire beaucoup pour atténuer ce.

de plus, il y a un nombre croissant de publications sur le problème du remaniement du code d'héritage. Vous devez être sur le dessus de cela. Plus vous en saurez avant de vous lancer dans cette aventure, mieux votre expérience sera. Je N'ai pas lu le livre de Michael Feathers moi-même, mais si j'étais à ta place, c'est la première chose que je ferais.

2
répondu Robert Rossney 2010-01-20 17:07:50

Ayant travaillé sur plusieurs projets de migration, la première chose à faire est d'être clair sur ce que votre migration objectifs. Celles-ci peuvent varier considérablement d'une organisation à l'autre, mais elles aident à établir les priorités pendant le projet de migration proprement dit. Elle permet également de mieux évaluer les avantages par rapport aux risques et aux coûts.

comme d'autres l'ont mentionné, il est important de comprendre que le processus de migration n'améliorera pas automatiquement la qualité du code. Donc, si votre objectif principal est pour reformuler (et rien d'autre), vous devez être conscient que cela peut prendre des semaines ou des mois avant d'avoir du code fonctionnellement équivalent (selon la taille du code et la complexité de la migration).

cela étant dit, .NET dispose de très bons outils pour le remaniement et l'analyse de code, en plus des suites de tests unitaires. Outils de conversion automatisés comme ArtinSoft Mise À Niveau Visual Basic Compagnon peut être adapté pour appliquer les normes de codage ou améliorer considérablement le code pendant la conversion. Ceci mélangé avec d'autres outils de modification de code comme ReSharper va grandement accélérer votre transition vers .NET.

d'après mon expérience, un projet de migration est un projet gérable à condition que vous sachiez qu'un effort manuel est nécessaire. Les outils commerciaux ont des modes d'évaluation qui peuvent aider à quantifier l'effort de migration, et vous donner une idée des défis que vous pourriez rencontrer dans une migration.

Si vous préférez un faible risque et le coût solution, je m'en tiendrais au remaniement du code avec un oeil sur une éventuelle migration. J'ai eu des clients pour lesquels cette approche a fonctionné. Alors quand est venu le temps de migrer leur code plusieurs choses avaient été résolu.

fondamentalement, tout nouveau contrôle personnalisé doit être écrit dans .NET et exposé comme contrôle ActiveX à utiliser par L'application VB6. De même, de nouvelles fonctions DLL doivent être placées dans les assemblages.net qui peuvent être utilisés par COM. De cette façon, quand vient le temps de vous migrer n'aurez pas à vous soucier de ces contrôles ou les bibliothèques.

2
répondu Migration Specialist 2010-02-02 22:58:59

comparé à certains des trucs sur lesquels j'ai travaillé, ça semble assez petit. Néanmoins, il y a une autre approche qui fonctionnera en conjonction avec celle montrée par PeanutPower ci-dessus.

la réponse est de construire un cadre qui vous permettra de découper des sections du programme à la fois et de les convertir une par une.

par exemple insérez un adaptateur de base de données 'layer' qui gère tous les appels à la base de données, puis un par un, supprimez chaque mais de SQL et remplacez-le par un appel à la couche db. Les anciens appels seront toujours directs tandis que les nouveaux appels passeront à travers la couche. Finalement, tous les appels passent par la couche et vous pouvez changer la base de données.

vous pouvez faire la même chose avec n'importe quelle autre section du code en étendant la couche framework pour couvrir cette fonctionnalité.

la clé pour passer de VB6 à VB.NET (par exemple) est D'utiliser la bibliothèque Interop - voici un article: http://support.microsoft.com/kb/817248

un autre, beaucoup plus tard pensé: obtenir MZ-outils et utiliser leur outil d'analyse pour trouver le code redondant et se débarrasser de celui-ci. J'ai réussi à éliminer quelque chose comme 5 à 10% du code dans un ancien produit de ma société.

2
répondu Robin 2013-09-17 11:00:05

ne le réécrivez pas à partir de zéro. Il semble que cela vous prendra des années et que vous introduirez probablement de nouveaux(anciens) bogues dans le code.

j'envisagerais de remanier le code lentement mais simplement. Commencer petit. C'est surprenant la rapidité avec laquelle vous pouvez reformuler le code en quelque chose qui est beaucoup plus facile à gérer. Et vous devriez être en mesure de garder le code "actif" à la fin de chaque bloc de réfractage que vous faites.

mise à jour: Il est intéressant de noter que automatisée la migration ne fera que déplacer vos problèmes vers une autre langue.

1
répondu Matt 2010-01-20 15:45:51