2011-01-21 11 views
33

レガシーコードの操作方法に関するアドバイスが必要です。レガシーコードの使用に関するアドバイス

以前は、レポートアプリにいくつかのレポートを追加する作業が行われました。 2005年にStruts 1に書かれています。大したことはありませんが、コードはかなり乱雑です。アクションフォームの使用法はなく、基本的にコードは1つの巨大なアクションであり、内部には多くのif-elseステートメントがあります。また、ここで誰もこれに関する機能的知識を持っていません。私たちはちょうど私たちの契約でそれを持っていた。

私はこれについて非常に不満で、どのように進めるべきかわかりません。このアプリケーションは表示されません:コード、標準などを読んでいる間に目が疲れているかどうか気にする人はほとんどいません(しかし、大変重要です)。

しかし、私は技術的負債があると感じています支払われる。これをどのように進めるべきですか? if-else道路を続行するか、プロジェクトの残りの部分を無視して、この要件を正しい方法で実行しようとしますか?私の締め切りを危険にさらし、巨大なリファクタリングを始める?

+9

http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052 –

+0

@Daveはい、私の会社はそれを買っているが、1のビッグネームはそれを持っています。悲しい話:( – Tom

+0

あなた自身のコピーを購入してください。 –

答えて

44

レガシーコードは大きな問題であり、私は人々が同意しないと確信しています!

私は大きな再要因を開始することは間違いであると言います。

大きな再因子とは、これまでと同じように機能するように多くの作業を行うことを意味します。あなたがこれを自分で取ることを選択した場合、あなたがしていることの多くの可視性はありません。それがうまくいくなら、誰もあなたがそれを置く仕事の時間を知ることはありません。それがうまくいかず、整然としたコードになってしまいますが、いくつかのバグを追加すると(そしてバグを追加することなくコードを書いたことがある人は)、なぜ「この変更はどうしたのですか?

私は現在、10年前のコードベースで作業しているプロジェクトをほぼ完了しました。私たちは途中で再考することのかなりの部分を行ってきました。しかし、私たちが作り直したそれぞれの要因について、「この具体的な変化は、私たちが今やっている実際の作業をより簡単にする」と正当化することができます。むしろ、「これは今、将来の仕事のためにきれいになりました」。私たちは、コードを作成しながら、実際に発生した問題を一度に1つずつ修正することで、多くの問題を解決しました。

そして、あなたが再因子化する前に、自動化されたテストが必要だと言えるでしょう。そうすれば、一緒に戻しても大丈夫です!

「メンテナンスと将来の開発を容易にする」ために、ほとんどの再調整が行われます。あなたのプロジェクトは、将来の多くの開発が行われていないように思えます。これは、再要因が会社に与える優位性を制限します。

+0

あなたは良い点があります、このプロジェクトはほとんどの時間はフリーズしています。 – Tom

+0

"あなたが再因子化する前に、自動化されたテストが必要だと言えるでしょう。そうすれば、一緒に戻してもらうことができます。 単体テストをサポートするためにコードベースに大幅な変更が必要な場合はどうすればよいですか? – NeverEndingQueue

+0

私の意見は?あなたは、再因子が何かを破らなかったことを証明する必要があります。どうしますか?手動テストは自動化されたテストより優れている可能性があります。私は、VMwareの統合で作業するときに自動化されたテストが高価すぎることを発見しました – Jon

12

ルール#1:壊れていない場合は修正しないでください。

ルール#2:疑問がある場合は、ルール#1を再度読みます。

残念ながら、レガシーコードは、「それが壊れていない」とはまれにしか記述できません。そのため、既存のコードを微調整して、新たに見つかったバグを修正したり、既存のコードを修正して以前に受け入れられた動作を修正したり、既存のコードを微調整して新しい機能を追加したりする必要があります。

私の経験から、どのようなリファクタリングも「無限小」の小さな増分で行う必要があることが教えられました。ルール#2を破る必要がある場合は、最も内側の入れ子になったループまたはIF構造で検索を開始し、きれいな論理的な分離点が見つかるまで外側に広げて、新しい関数/メソッド/サブルーチンを作成することをお勧めしますそのループや構造の腸。これはもっと効率的なものではありませんが、基本的なロジックと構造をより明確に理解できるはずです。いくつかの新しい、より小さい関数/メソッド/サブルーチンがあれば、それらをリファクタリングして、より管理しやすいものに統合することができます。

ルール#3:前の段落を無視し、最初の2つのルールを再読み込みします。

3

私は他のコメントに同意します。あなたがする必要がなければ、それをしないでください。コードベースが多かれ少なかれ死んでいるなら、通常ははるかに多くのコストがかかります。あなたは、コードの周りにあなたの頭を得ることができないと感じた場合一方

は、その後、リファクタリングはおそらく避けられません。これが当てはまる場合、それはWebアプリケーションなので、セレンを使用して機能テストの固いスイートを作成できますか?もしそうなら、これはそのようなコードのための最も速く、最も有益なテストアプローチであり、ほとんどのバグを奪うでしょう。

第2に、抽象メソッドのリファクタリングから始めて、難しいメソッドの作成メソッドを作成します。あなたの自己に「これは何をするのか説明するコメントが必要です」と思うたびに、コメントに置き換わる名前のメソッドにそれを抽出する必要があります。この一度

は、あなたがまだ必要な機能を追加することができないならば、あなたは、より高度なリファクタリングのために行く、そしておそらくいくつかのユニットテストを追加することができ、行われてきました。しかし、私は通常、自己の文書化コードを作成するだけで、必要なものを追加したり、レガシーコードのバグを修正することができます。

+0

それは私に仕事を要します! –

3

いくつかの言葉で言えば、レガシーコードを変更する前に、自動ユニットテストから始めることをお勧めします。 これは、開発者が重要なことを理解できるようにします。このコードには依存関係、入力データ、出力結果、境界条件などがあります。

ほとんどの場合、このコードが何を行い、どのように機能するかを理解することができます。そのメイクセンス(しかし必要ではない)クリーンなコードビットがクリア人間のフレンドリ名を関数にして(反復コード、もしあれば)一部の機能を移動し、ローカル変数へのより正確な名前を与えるその後

単純なクリーンアップは、コードをより読みやすくすると同時に、単体テストの助けを借りて回帰問題から開発者を救うことができます。

リファクタリング - あなたは時間と要件と機能、コードのテストを定期的ユニットの理解を持っている場合、小さな変化、一歩一歩を踏み出します。

しかし、リファクタリングから起動しません

+0

これらの種類のリファクタリングが賢明なレベルでテスト可能であることを必要とするレガシーコードを見つけることはよくありません。 – Joe

関連する問題