23

VB6 の移行に関する質問が既にあることは承知していますが、私のプロジェクトのコード ベースはここでいくつかの新しい質問をもたらします。

コードの品質、構造、およびアーキテクチャは悪夢に過ぎないと言わざるを得ません。2 つの大きなプロジェクトがあります。Nr.1 には 40 のフォーム、40 のモジュール、およびいくつかのクラス ファイルがあります。この EXE は一種の「ベース システム」です。Nr.2 には 80 個のフォーム、20 個のモジュール、およびいくつかのクラス ファイルがあり、この EXE は「ベース システム」から関数を呼び出します。次に、GUI を使用する約 10 個のプロジェクト (それぞれ 1 ~ 3 個のフォーム) と、別の 90 個の非 GUI プロジェクトがあり、そのほとんどが EXE ファイルであり、いくつかの DLL です。DLL は、C、C++、および VB6 で記述されています。

コードは 10 年間進化してきており、ほとんどの場合、一度に 1 人の (悪い) 開発者によって書かれています。

  • 500 行 (およびそれ以上) の関数は非常に一般的です。
  • GUI コンポーネントの 90% は、text1、command2(1)、… という名前です。
  • たとえば、5000 行のコードを含む EXE プロジェクト (GUI なし) がコピーされ、コピーの唯一の変更点は、FTP ではなくメールごとにファイルを送信することでした (同じプロジェクトのさらに 2 つのコピーもあります)。 )。
  • 以前は小さなフォーム (15 フィールド) があり、小さな問題 (通常は最大 30 分) を解決する必要がありました。何かを変更するたびに、フォームが機能しないか、新しいエラーが発生しました。2 日後、フォームを完全に書き直すことにしました。古いフォームの 20 個までの SQL ステートメントから、新しいフォームで生き残ったのは 2 個だけでした。
  • コード内のコメントについても質問しないでください …</li>

私は数ヶ月前にプロジェクトを引き継ぎ、私は唯一のメンテナーです。変更要求とエラーの一定の (しかし低い) フローがあり、法的要件の観点から、ソフトウェアを実行し、「最新」に保つために、顧客から保守予算を受け取ります。

私のオプション

1) ゼロから書き直す - その場合、移植性のために Java で書くことができます。ここでの問題は、一部の (古い) ユーザー ヘルプ以外にドキュメントがないことです。したがって、醜いコードは「ドキュメント」です。ソフトウェアが何をすべきかを高いレベルで知っている人物が 1 人います。また、長期的には大幅なコスト削減があったとしても、経営陣にそうするよう説得するのは困難です。政治的な問題があります。また、データベース構造はコードよりも優れているわけではないため、一度に 1 つの (vb) プロジェクトを実行することもできません。つまり、最初から行う必要もあります。そのため、一度にソフトウェア全体を変更することしかできません。

2) コードを VB.NET / C# に移行する 最初にメイン プロジェクトの移行を行いました。既にテスト済みで、Project Nr.1 から約 2000 のアップグレード コメントを受け取りました。すぐ。ここでの私の考えは、変換後、DB 抽象化用のクラスを作成し、これらのクラスを使用するようにコードを変更してリファクタリングを行い、他のプロジェクトも移行および変更し、すべてのコードが DB クラスを使用するときに DB 構造を変更することです。

3)とにかく何かを変更する必要があるときはいつでもVB6のコードをリファクタリングし(すでに部分的にこれを行っています)、ある時点で残りもリファクタリングします。そうすれば、元のコードが元のコードであり、エラーがある場合、それらが移行の結果ではないことが明らかであるため、元の機能をより簡単に確認できます。コードがリファクタリングされると (さらに 50 ~ 75% 小さくなると思います)、.NET への移行が容易になります。次に、DB 構造を変更します (そして、もう一度リファクタリングを行います…)。

将来的に行うべきいくつかの大きな変更 (Win7 との互換性を持たせること、およびコードの大部分に影響を与える別の大きな CR) があるので、これらの変更を行う良い機会があるでしょう。とにかくたくさんのコード。

私の質問は、悪い、醜いコードを移行するための経験/ヒントを持っているのは誰ですか? どのオプションを提案しますか?

4

9 に答える 9

20

私は同じことを経験しなければなりませんでした(ドキュメントと恐ろしいコードのない大規模なVB6アプリ)。安全で合理的​​な唯一の方法は 3 です。何かを改善するには、まずそれを理解する必要があります。ルート 1 または 2 を使用すると、ひどい混乱が生じることは間違いありません。

最終目標は .NET への完全な移行であるという考えを常に心に留めておいてください。リファクタリングを行うとき、VB6 のひどい OO サポートが VB.NET や C# でどのようになるかを考えてみてください。可能であれば、移行を容易にするためにコードを移動してください。

多くのコア機能を .NET DLL に移行し、それを COM を介して VB6 に公開することを検討することをお勧めします。これにより、VB6 からとんでもない量のコードが削除され、ビジネス ロジックのほとんどが残されることが期待されます。

覚えておく必要がある最も重要なことは、カウボーイにならないことです。

  1. モジュールのテストを書きます。
  2. モジュールをリファクタリングします。
  3. モジュールをテストします。
  4. アプリをリリースします。
  5. 後藤1
于 2010-01-20T14:25:51.667 に答える
11

コードは絶対に移行する必要がありますか? そうでない場合でも、その目的を果たし、途中で保守可能である場合は、そのままにして次に進みます。

コードを新しい言語に移行する動機は、数時間、数週間、数か月のコード移行 (特にあなたが言及した規模で) を経ると、すぐに薄れてしまいます。

コード移行のアイデアは、概念的には素晴らしいアイデアです。おそらく、それはひどい混乱であり、あなたはそれをしている人生を嫌うでしょう.

考えてみてください、欠陥を修正しながら今の生活を嫌っていますか? 移行プロジェクトでは、それを 100 倍エスカレーションします。

ほとんどの企業は、機能している限り、ボンネットの下にあるものをあまり気にしません。彼らは開発者ではないことを忘れないでください。それを修正するのがどれほどの苦痛であるかは気にしません (彼らはそれを行っているわけではないため)。コードを最新の状態に更新しても、ビジネス上の意味がありません。

于 2010-01-20T14:27:27.860 に答える
10

同様に、14 年前のコードを VS2008 に移行した経験がある

いくつかのヒントを次に示します。

  1. サード パーティ コンポーネントへの依存関係を削除します。
  2. 逆相互運用などの段階的な移行を検討してください。
  3. 色とフォントは手作業で処理する必要があります。
  4. .NET への移行後、配列内の初期化されていないオブジェクトに注意する
  5. On error を Try Catch に変更
  6. 必要に応じて Microsoft.VisualBasic.Compatibility.VB6 名前空間を使用します。
  7. すべてのコードが .NET に変換されるまで、リファクタリングを最小限に抑える
  8. VB6 コード内のゼロベースでない配列に注意してください。
  9. VB6 でコードをリファクタリング (最小限) して、コード変換ウィザードを通過できるようにします。
  10. ListView などの 1 ベースの VB6 コントロールに注意してください
  11. スレッド化の問題を回避するには、synclock を使用します。
  12. サブの手動リファクタリングを行っている場合、特にファイル IO を使用している場合は、データ型のサイズの変更に注意してください。

プロセス全体を支援できる会社があります (私たちは使用しませんでしたが) http://www.vbmigration.com/

于 2010-01-20T14:29:38.277 に答える
6

あなたはこの質問を作成する素晴らしい仕事をしました。質問してくれてありがとう!そして、(いつものように) 思慮深い回答を投稿してくれた stackoverflow コミュニティに感謝します。

これがかなり大きなコードベースであり、(相互に関連する VBP が 50 ~ 100、LOC が 200 ~ 500K) あると思われる場合は、移行ツールへの投資を検討する必要があります。この類推を考えてみてください。変換するデータが大量にある場合、ソース データが汚れていて目的の形式とは大きく異なっていても、ツールを使用します。データを再入力するか、大まかな変換を行ってから手動で修正する必要があると誰かが提案した場合、それらは気が狂ったと思うでしょう。また、120 のフォームを使用すると、アプリケーションはかなりの量のビジネス機能を提供するように思えます。そのビジネス機能は長年の使用の中で出現し、好むと好まざるとにかかわらず、VB6 コードは、その機能の完全で正式な、本番環境でテストされた仕様と、アプリが舞台裏でどのように機能するかに関する無数の技術的事実を表しています。これらすべての機能的/技術的要件を「ゼロから」再収集、再コーディング、および再テストすることは、非常に費用がかかり、困難です。プロジェクトのコストとリスクを管理するには、レガシー コードを「現金化」する必要があります。問題は、これをどのように実行し、移行後の所有コストを削減するかです。

この課題は、コードベースのサイズよりも、.NET に適応してそれを活用するために必要な再設計の詳細に関係しています。VB6コードを「醜い」コードにする特定の事柄、それが「醜い」理由、および.NETでそれらのことをどのように行う必要があるか/すべきか/したいかを特定する必要があります。これらの再設計要件の定式化を開始したら、それらを変換プロセスに実装して、.NET コードに反映させることができます。私たちが提唱する一般的なアプローチは「ツール支援型書き換え」と呼ばれ、次のように行われます。

  1. 翻訳を実行する
  2. 生成されたコードをビルド/レビュー/テストして、必要なコードの改善を特定/改良する
  3. 生成されたコードが「十分」である場合は、.NET でジョブを終了します。
  4. 必要な改善を実装するためにトランスレータを再構成します (適切な場合)。
  5. 1に行く

ツールの出力は「完璧」である必要はありません (ソフトウェアは完璧ではありません...)。ステップ 3 で述べた「十分に良い」とは何かは重要な問題です。本質的には、機能的に正しく、標準に準拠していることが検証されているという点で、コードの品質が、移行を完了してアプリケーションの運用/保守を継続するために何が必要かを開発チームが理解しているようなものであることを意味します。与えられた時間とリソースの制約内でこれを行うことができると確信しています。非常に大きなコードベースの場合、「十分に良い」は「非常に良い」です。なぜなら、低品質の移行を完了してその後維持しようとすると、コストがかかりすぎてリスクが高くなるからです。一般に、コードが大きく、予算が小さいほど、

また、「.NET で仕事を終える」ことについてのいくつかの考え: .NET で整形式のコードを持つことは、主要なマイルストーンです。.NET コミュニティには、移行を完了するための作業を加速するのに役立つ、優れたリファクタリング、分析、および単体テスト ツールがあります。プロセスの非常に早い段階で Visual Studio を使用して、再設計を試したり改良したり、アプリをデバッグ/テストしたりします。移行作業の早い段階で .NET のコードベース全体と Visual Studio を使用できることは、ツール支援アプローチの主な利点 (および重要な部分) です。

もちろん、これを実現するには、ツール支援による書き換えをサポートするように特別に設計された移行ツールセットに投資できる必要があります。Great Migrationsのツールは、このカテゴリで私が知っている唯一のツールです。

免責事項: 私は Great Migrations で働いています。VB6 の 1M 以上の LOC を再設計された C# に移行するためにツールがどのように使用されたかについてのケース スタディや、製品と方法論を詳細に説明する gmStudio ユーザー マニュアルなど、当社のサイトにはさらに多くの情報があります。

于 2010-01-21T18:03:34.993 に答える
6

M. Feathers の"Working Effectsly with Legacy Code" をチェックしてください。この記事では、テストされていないコードの強化、リファクタリング、移行の落とし穴について説明しています。

于 2010-01-20T14:41:46.143 に答える
2

私が取り組んできたいくつかのものと比較すると、それはかなり小さいように聞こえます。それにもかかわらず、上記の PeanutPower で示したものと組み合わせて機能する別のアプローチがあります。

答えは、一度にプログラムのセクションを切り取り、それらを 1 つずつ変換できるフレームワークを構築することです。

たとえば、データベースへのすべての呼び出しを処理するデータベース アダプター「レイヤー」を挿入し、1 つずつ SQL 以外を削除して、db レイヤーへの呼び出しに置き換えます。新しい呼び出しがレイヤーを通過する間、古い呼び出しは引き続き直接送信されます。最終的にはすべての呼び出しがレイヤーを通過し、バックエンド DB を変更できます。

フレームワークの「レイヤー」を拡張してその機能をカバーすることにより、コードの他のセクションで同じことを行うことができます。

たとえば、VB6 から VB.NET に移行するための鍵は、Interop ライブラリを使用することです

MZ-Tools を入手し、その分析ツールを使用して冗長なコードを見つけて削除することも考えられました。会社の古いレガシー製品のコードの 5 ~ 10% 程度を削除することができました。

于 2010-01-20T16:07:44.303 に答える
2

このプロジェクトの説明からすると、リファクタリングと移行を同時に行うことができるように思えます。大量の冗長コードを取得して統合することは明らかです。統合の一環として、それ (冗長コード) を .NET で書き直すこともできます。

これはUIのものには機能しません。ただし、データベースとビジネスロジックのものには当てはまります。たとえば、私はあなたのコードを見たことがありませんが、Form_LoadADO レコードセットを作成してそれらをループするフォーム (おそらくコピーして に貼り付けた) のメソッドによって入力されるアプリケーション内のほとんどのコンボ ボックスにお金を賭けることに賭けます。これは、.NET データ アクセス クラスにリファクタリングして、既存のフォームに簡単に統合できるものです。また、このアプリケーションにキャッシングの魔法の世界を導入できるようになる可能性もあります。これは、目に見えるパフォーマンスの向上につながる可能性があるため、素晴らしいことです。

そして、目に見える改善が重要です。あなたの経営陣がこれを行う必要性を完全に受け入れない限り、これは非常にリスクの高い試みです. リファクタリングの問題が原因で、特定の CR の実装に予想よりも時間がかかることを経営陣に伝えていることに気付いたら、それは非常に悪いことです。完全なサポートがあっても、このような状況が発生することは望ましくありませんが、サポートが部分的である場合はさらに悪化します. 目に見える改善は、これを軽減するために大いに役立ちます。

また、レガシー コードのリファクタリングの問題に関する文献も増えています。あなたはそれの上にいる必要があります。これに飛び込む前に知っていればいるほど、より良い体験ができます。私自身、マイケル・フェザーズの本を読んだことはありませんが、もし私があなたの立場だったら、真っ先に読みたいと思います.

于 2010-01-20T17:07:50.363 に答える
2

いくつかの移行プロジェクトに取り組んだ後、最初にすべきことは、移行の目標を明確にすることです。これらは組織によって大きく異なる場合がありますが、実際の移行プロジェクト中に優先順位を設定するのに役立ちます。また、リスクとコストに対する利点をより適切に評価するのにも役立ちます。

他の人が述べたように、移行プロセスによってコードの品質が自動的に向上するわけではないことを認識することが重要です。そのため、主な目標がリファクタリング (およびそれ以外の目的) である場合は、機能的に同等のコードが得られるまでに数週間または数か月かかる可能性があることに注意する必要があります (コードのサイズと移行の複雑さによって異なります)。

そうは言っても、.NET には、単体テスト スイートに加えて、リファクタリングとコード分析のための非常に優れたツールがいくつかあります。ArtinSoft のVisual Basic Upgrade Companionなどの自動変換ツールをカスタマイズして、コーディング標準を適用したり、変換中にコードを大幅に改善したりできます。これをReSharperなどの他のコード変更ツールと組み合わせると、.NET への移行が大幅にスピードアップします。

私の経験では、移行プロジェクトは、手作業が含まれていることを認識している限り、管理可能なプロジェクトです。商用ツールには、移行作業を定量化するのに役立つ評価モードがあり、移行で直面する可能性のある課題を把握できます。

リスクとコストの低いソリューションを好む場合は、最終的な移行に向けてコードをリファクタリングすることに固執します. このアプローチが功を奏した顧客がいます。そのため、コードを移行するときが来たとき、いくつかの問題はすでに解決されていました。

基本的に、新しいカスタム コントロールは .NET で記述し、VB6 アプリで使用される ActiveX コントロールとして公開する必要があります。同様に、新しい DLL 関数は、COM を通じて使用できる .NET アセンブリに配置する必要があります。そうすれば、移行するときに、これらのコントロールやライブラリについて心配する必要がなくなります。

于 2010-02-02T22:58:59.210 に答える
1

最初から書き直さないでください。それには何年もかかるように思えますし、コードに新しい (古い) バグを導入する可能性が最も高いでしょう。

コードをゆっくりと、しかし簡単にリファクタリングすることを検討します。小さく始めましょう。コードをはるかに扱いやすいものにリファクタリングできるのは驚くべきことです。そして、実行する屈折の各ブロックの最後でコードを「機能」させ続けることができるはずです。

更新: 自動化された移行は、問題を別の言語に移動するだけであることに注意してください。

于 2010-01-20T14:28:49.210 に答える