2009-05-06 16 views
4

現時点では、Visual C++で記述されたレガシープロセスが基本的に単一の5000行関数で構成されています。本質的には、プログラムは大文字小文字のステートメントの1つにすぎず、同様のカットアンドペーストコードでも大文字と小文字の両方のロジックを処理できます。明らかに、これらのケースを別々の関数(またはオブジェクト)に抽出し、カットアンドペーストされたコードを削除するために、このコードをリファクタリングしたいと思います。大きなC++関数のリファクタリング

私の質問です - このサイズのリファクタリング作業を進めるための提案はありますか?プロセスを合理化する自動ツールはありますか?

答えて

6

私の最初のステップは、より大きなケースのいくつかを取り、まずそれらを別々の機能にプッシュすることです。これにより、視覚的な混乱が減り、次のフェーズをより簡単に行うことができます。

第2に、異なるケースの共通性を特定し、代わりに呼び出す一般化された関数を作成します。ある程度まで。あまりにも遠くに行くと、あなたの現在のswitch文と同じくらい悪い一般化された機能を持っています:-)

あなたの中にスポンジの仕事の半分でもできるツールは見たことがありません頭蓋骨。私はちょうどそれを使用してお勧めします。

+0

多くのIDEが、これを手助けするツールを提供しています。自分でパラメータをコピー/貼り付けしてしまうことはありません。 –

+0

@Andrei Krotkov、そうだが、彼らは何を機能に変えるかについて賢明な決定をしたい。しかし、良い候補であるブロックが見つかると、そのようなツールはそのようなリファクタリングを容易にするために非常に普及しています。 – BobbyShaftoe

+0

ああ、もちろん。あなたのためにそれを魔法のようにするツールはありませんが、助けになるツールがあります。私はその質問について考えています。 –

0

Eclipseは、リファクタリングを機能として強調しています。 IBM's websiteにすべての便利な機能のリストがありますが、特にあなたのケースでは「選択から新しい方法」ツールが該当するようです。

0

これは広範な質問の一種です。いくつかの自動化されたツールがありますが、実際にはコードを勉強していくつかの決定を下すだけです。コードに冗長性はありますか?その場合は、冗長なものを自分の機能に入れてください。

3

いくつかの提案:

あなたはDuploのようなツールを使って貼り付けコピーしてコードを見つけることができます。スクリプト(任意のスクリプト言語)または複数行の検索と置換を行うエディタを使用すると、そのコードを関数呼び出しで置き換えることができます。

リファクタリングツールは、関数の一部を新しい関数に抽出するなどの操作を自動的に行うことができます(これは手動で行うこともできますが、スクリプトを使用するか、検索と置換を行うとエラーの可能性が排除されます)。たとえば、Eclipse CDTはこれを行うことができ、フリーであり、他のIDEで管理されているコードを編集することができます。これはいつもうまくいくわけではありませんが、うまくいきますが、IDEが何千ものメソッドを分割し、必要なものだけを抽出し、新しいパラメータとして渡す必要があるすべての変数を正しく識別しているので、あなたの新しいメソッドに... Refactor! Pro(無料版が利用可能)などの他のリファクタリングツールが利用できますが、私はそれらを使用していません。

マイケルフェザーの書籍Working Effectively with Legacy Codeは、この種のことを行う際の標準的な作業です。基本的には、単体テストと同様に特性評価テストを設定したいと考えていますが、可能な限り小さな単位をテストするのではなく、現在の関数の動作を可能な限りカバー(特性化)してからリファクタリングを適用する一度に。 (Feathersには、リファクタリングのカタログやレガシーコードに特に役立つその他のテクニックが含まれています)。

3

非常に最初のステップは、まだ自動化されていない回帰テストを開発することです。次に、関数に各ケースを引き出すと、何も壊れていないことを素早くチェックできます。

+0

これは私の最初の考えであり、終わりの機能が元のものと同じであることを確認するための単体テストを持っています。 –

+0

ここで、「良い」とは、機能のほとんどまたは理想的なすべてのパスを意味します。カバレッジツールは、このテストの品質を評価するのに役立ちます。申し訳ありませんが、私はCのための1つを知らないが、私は彼らが利用可能であると確信しています。 –

+0

gcovはC言語ではうまく動作しますが、カバレッジはコードが動作することを確認するには不十分です。コードをテストするだけでなく、何かに触れる前に*理解しておくべきです。 1行に1行。 – Tom

0
  1. 一度にすべてを実行しないでください。
  2. 可能性の高いリファクタリング対象を特定します。可能な限り狭くする。
  3. そのコードの正しい機能を確認するテストを作成します。
  4. 元の関数に実際にそのバグがあるため、すべてのテストが合格するか失敗すると、そのビットをリファクタリングします。
  5. テストがすべて終了していることを確認してください。
  6. GOTO 2.
2

www.wholetomato.comでビジュアルAssistXを試してみてください。それは、VS6以降のVisual Studioの任意のバージョンと直接統合します。これには多くの優れた開発機能が含まれていますが、探しているのはリファクタリング機能です。その機能はhereです。それはコストがかかりますが、Visual Studioを使って開発するときは、私の「秘密の武器」と考えています。

0

Steve Fallowsが書いたことに続いて、単体テストを行った後、機能が変更されたことを確認して、新しい機能を作成し、元の作業と同じ単位テストを行います。

現時点ではすべてが失敗します。

それぞれのcase文を抜き出してそれ自身の関数に入れて、新しい関数から呼び出すようにしてください。そうすれば、スイッチだけの関数になり、それぞれの関数が関数を呼び出すだけです。

すべての機能を移動したら、他の機能をリファクタリングする必要があるかどうかを調べることができますが、機能が失われていないことを確認するために単体テストから始めます。

新しい機能にはそれぞれ独自のユニットテストbtwも必要です。

0

私たちのCloneDRは、クローンコードを正確に識別し、個々のクローンを置き換えるためのパラメータ化されたコードを作成する方法を示しています。

C++のクローンレポート、つまり提案されているパラメータ化されたクローンブロックの外観をリンクで確認できます。

関連する問題