web-dev-qa-db-ja.com

いくつかの巨大なC ++クラス/メソッドのリファクタリング。開始するには?

可能性のある複製:
20万行のスパゲッティコードを継承しました—今はどうなりますか?

私はレガシーコードを扱っています。いくつかのBIGクラス(行数8000+)といくつかのBIGメソッド(行数3000+)が含まれています。これらのメソッドの1つについて、少なくともいくつかのコードをカバーする単体テストを作成しました。この関数には特定の構造はありません。ネストされたループと条件の混乱です。リファクタリングをしたいのですが、どうすればよいかわかりません。

私は実際には1つの関数を抽出することから始めました。最終的には21個のパラメーターが必要でした:-/

したほうがいい ...
1。長期的には私が成功することを知って、ひどい関数を抽出し続けますか?
2。さらに大きな関数の抽出を開始しますか?そこで、このモンスターの構造を公開し、実際のリファクタリングを開始できます。
3。私がhelluvaクリーンなコーダーだからといって、小さな「良い」関数(および/またはクラス)だけを抽出するのですか
4。まったく違うことをしますか?

10
TobiMcNamobi

リファクタリングは、本全体について書かれたものです。すべての方法と落とし穴を再説明することは困難です。

  1. リファクタリングを開始する前に、リファクタリングする部分のテストを記述します。
  2. それらの大きな関数の小さくてきれいな部分からリファクタリングを始めましょう
  3. 関数として書き直すことができる部分を見つけて、それを関数にします。
  4. テストを実行して、正しいことを実行し、副作用がないことを確認します。

この後、他のすべての(ビッグワン)ピースで何を実行する必要があるかを理解します。全体が明確になったら、より高いレベルの再設計を行うことができます。

追伸簡単なスケッチです。リファクタリング自体については、いくつかの本(M. Fowler-リファクタリングなど)を読むことをお勧めします。

7
maverik

Code Completeでは、レガシーコードとそれを使用する新しいコードの間にインターフェイスまたはラッパーを作成することをお勧めします。インターフェースをクリーンに保ち、レガシーコードに変更を加える必要がある場合は、必要な部分をリファクタリングまたは書き直して、それらを前進させます。

十分な変更を加える必要がある場合は、最終的にクラスが新しいコードと同等の状態になります。

3
CLandry