4

すべて C# で記述された非常に大規模な (>2M SLOC) ソフトウェア プロジェクトのメンテナンスを引き継ぎました。ドキュメントはほとんどありません。現在、パブリック インターフェイス (約 400) を持つモジュールに変更を加えたいと考えていますが、ソリューション内の他のすべてのモジュール (合計で約 50 あります) がこのパブリック インターフェイスを使用している可能性があるかどうかはわかりません。

このような状況で、インターフェースの依存関係の使用ツリーをどのように作成しますか? コードベースが大きすぎて、プロジェクト エクスプローラーをナビゲートしてソース コードを読むことができません。このタイプの依存関係分析ツリーを作成するために、どのツールまたは方法を使用しましたか?

工具は一切買いたくないです。クラス ビューなどの Visual Studio ツールは、このサイズのプロジェクトをうまく処理できないようです。ソースコードを単純にたどり、パターンマッチングを使用して独自の依存関係/インターフェース使用データベースを構築する独自の sed/awk/perl っぽいスクリプトを作成することを考えましたが、もしあれば難しい方法で何かをしたくありません。簡単な方法。

ありがとう!

4

6 に答える 6

3

おそらくNDependのようなものを購入する必要があります。

同様の価値を提供する別の無料ツールがあれば、それをお勧めします。ただし、NDepend が最善の策であると心から信じています。そのサイズのコード ベースを使用すると、400 ドルのツールが元が取れるのにそれほど時間はかかりません。

于 2009-01-28T20:30:24.147 に答える
2

これを行うための既存のツールを見つけることを真剣に提案します。すべてを手作業で整理することは決してできず、ツールを使用して節約された時間は、ツール自体のコストを確実に賄うでしょう.

一緒に働いている人がこの問題を抱えていました.彼のマネージャーはプロファイラーにお金を払わなかったので、プログラムの間違った部分を最適化するために開発者に5日を費やしました. プロファイラーを使用して、彼は半日以内に問題を見つけて修正しました。

于 2009-01-28T23:14:53.470 に答える
1

直接の依存関係に対する簡単な解決策。インターフェースを右クリックして、[すべての参照を検索]を選択します。メソッドごとにこれを行うこともできます。

変更の結果としてどの程度のコードが破損するかを確認するには、変更を計画しているインターフェイスのメソッドに[Obsolete(true、 "Testing The change")]を追加して、再構築をトリガーします。これにより、一部のパーツが構築されなくなります。これらの部分にスキップして、[Obsolete(false、 "Limited Change")]でタグ付けします。これがそのクラスへの小さな変更であり、このクラスのコンシューマーに影響を与えることなく修正できると思われる場合は、代わりにこれクラスのコンシューマーに大きな問題を引き起こし、[Obsolete(true、 "Cascade")]としてタグ付けして、そのフォールアウトに対処できます。

最終的には、ソリューションが完全に構築されるか、エラーが非常に多くなるため、変更が非常に侵襲的であることが明らかになるため、効果を実際に把握する唯一の方法は、実際に試してみることです。

このアプローチの利点は、実際にどのように処理するを処理する必要なしにカスケードを実行できることです。必要なのは、結果として生じる変更をトリガーするかどうかの大まかな評価だけです。変更をマッピングしたことに満足したら、IDEに警告の既製のリストがあり、インターフェイスを適切に変更するときに変更できます(ビルドは実際に失敗します)。

これは、警告をエラーとして扱わないことに依存しています。ビルド設定を一時的に緩める必要がある場合があります。

これらすべてを新しいソースアップデートで実行して、再試行する場合にパーツをロールバックできるようにします。

于 2009-01-28T22:32:15.477 に答える
1

ヒントとして:このようなツールの独自のバージョンを作成する場合は、リフレクションを使用してコンパイル済みアセンブリでこれを行うこともできます。

.NETは、アセンブリをロードし、System.Reflection名前空間のすべてのインターフェイス、タイプ、メソッド、およびプロパティを照会するために必要なすべてを提供します。このようにして、sed / awk / perlを使用してソースコードを自分で解析することを心配する必要はありません(名前空間と継承を解決する必要があるため、これは簡単ではありません)。

(注:リフレクションを直接使用して取得できないのは、動的にロードされたアセンブリへのアセンブリの依存関係です。たとえば、Assembly.Loadを介してロードされます。これをプロジェクトで使用する場合は、特別な処理を実装する必要があります)

于 2009-01-28T22:38:01.673 に答える
1

ツールを購入したくないとおっしゃっていたことは承知していますが、CodeRushは完全な機能を備え、1 か月間無料で利用できます (その後わずか 250 ドルで、リファクタリング プロを取得できます!これは素晴らしいことです)。Shift+F12 を、非常に気の利いたすべての参照ウィンドウの検索に置き換えます。

于 2009-01-28T20:29:58.950 に答える
0

あなたのプロジェクトがどのように設定されているかはわかりませんが、ここでは各モジュールにバージョン番号があります。モジュールを変更する必要がある場合は、新しいバージョンを作成します。新しいインターフェイスを使用したいクライアント コードは、更新されたモジュールにリンクし、古いプロジェクトへの参照を削除します。異なるバージョンでは、API の変更による意図しない副作用はありません。クライアント コードは明示的に何かを行う必要があります。

さらに、最新バージョンではないモジュールを使用している場合、すべてのプロジェクトとレポートを (どういうわけか) クロールするユーティリティがあります。どのプロジェクトが古いモジュールへの参照を持っているかを確認するのはとても簡単です (Microsoft VSS でも!)。

于 2009-01-28T20:54:15.877 に答える