5

大きな密結合アプリケーションをリファクタリングし、より保守しやすく柔軟にしようとしています。

単体テストがたくさんあるので、段階的にリファクタリングしたいと思っています。

このタスクを達成するために、どの設計およびリファクタリング パターンを実装または適用することを検討する必要がありますか?

私はいくつか考えることができます:

また、この種のリファクタリング ジョブに関するご自身の経験とベスト プラクティスを自由に共有してください。

アップデート

この質問で説明されている理由により、このリファクタリングを実行しています。基本的に、いくつかのインターフェイスを抽出せずにプラグイン システムを実装することはできません。これらのインターフェイスは高度に結合されているため、アプリケーションを 40 以上の DLL に分離して、循環参照の問題なしにコンパイルする必要があります。

4

6 に答える 6

9

真剣に言えば、リファクタリングは、特に密結合システムでは軽々しく行われる仕事ではありません。実行する前はやりがいのあるタスクのように思えることがよくありますが、私の経験から、既存の問題を解決するよりも新しいバグを導入する可能性が高いため、開始するとすぐに負担になる可能性があります.

大規模なリファクタリングに着手する前に、どのような利益が得られるか、どのような代替手段があるかを検討する必要があります (新しい製品をゼロから作成する、すぐに必要な部分だけをリファクタリングするなど)。開始する前に、アーキテクチャ、役割、および責任について十分に理解している必要があります。また、何かが壊れたときに確実にわかるように、予想される動作と既存の動作についても十分に理解しておく必要があります。

また、リファクタリング後にどのようになるか、およびそれが現在の実装にどのようにマッピングされるかについての設計を作成して、ポイントを維持できるようにすることも有益です。また、できるだけ頻繁に回帰テストを行う必要があります。

完璧主義者にとっては、明らかにリファクタリングが必要なデザインのときはイライラするかもしれません。変更を加える必要がある場合は、慎重に行い、一度に多くのことをしようとしないでください。

于 2009-04-27T17:37:04.020 に答える
9

これは大きな問題であり、それに答えるために本全体を書くことができます. 幸いなことに、誰かがすでに持っています。Michael Feathers 著のWorking Effectively with Legacy Codeのコピーを入手してください。それはあなたの質問に答えることに専念しているほぼ完全な本です.

こちらも本当にいい本です。Code CompleteDesign Patterns、およびPragmatic Programmerと一緒に、すべての開発者のライブラリにあるはずの書籍のリストに間違いなく掲載します。

于 2009-04-27T17:56:46.673 に答える
5

インターフェイスのリファクタリングと依存関係の注入は、結合を減らすための鍵となります。依存オブジェクトの作成にファクトリの使用を検討することもできます。

于 2009-04-27T17:37:43.333 に答える
2

上記のすべてといくつか。 しかし、それを始める前に、全体像について考えてみたいと思います。プログラムのセクション (パッケージ、プロジェクトなど) を定義してから、適切なパッケージに機能を移動するための計画を立てます。次に、抽出インターフェイス、依存性注入、およびファクトリ メソッドを使用して、パッケージの分離を開始することを論理的に開始する必要がある場所にすべてが揃ったら、パッケージの分離を開始します。

于 2009-04-27T17:59:33.000 に答える
1

Phlip からの素晴らしい アドバイス

より多くの情報がなければ、特定のケースでどの特定のリファクタリングが適切であるかを言うのは非常に難しいと思います。

于 2009-04-27T18:03:11.620 に答える
0

すべての回答に感謝します。さまざまな方法で苦労した後、最善の方法はすべてのインターフェイスを作成することであることがわかりました。これにより、デザインを自由に変更することができ、ビルドを中断するのは 1 日だけです (プロジェクトが大きく、非常に多くの参照と単体テストとリファクタリングを修正する必要があるため、1 日)。

すべてのインターフェイスを抽出して修正した後は、個別のソリューションを作成して、自由にデザインを試すことができます。

基本的には、最初にすべてをインターフェイスに移動してから、内部の依存関係を取り除こうとする必要があると思います。

于 2009-04-29T20:24:28.953 に答える