急速に進化するコードをリファクタリングするにはどうすればよいでしょうか?

StackOverflow https://stackoverflow.com/questions/589175

質問

私の研究用コードはまさにネズミの巣のようで、いたるところにコードが重複しており、明らかにリファクタリングが必要です。ただし、テーマの新しいバリエーションを考え出し、それをコードベースに適合させるにつれて、コード ベースは進化しています。私がリファクタリングを長い間先延ばしにしてきた理由は、良い抽象化を思いつき、どのデザイン パターンがどこに適合するかなどを確認するのに数日費やした瞬間に、予期せぬ新しいアイデアを試してみたくなるような気がするからです。私の抽象化は完全に不十分になります。言い換えれば、コードの進化の速度のせいで、(おおよその) 重複が不足しておらず、コード全体が乱雑であるため、コードに何かを追加するのが現実的であるにもかかわらず、抽象化行がどこに属しているのかまったくわかりません。痛み。この種の状況に対処するための一般的なベスト プラクティスは何ですか?

役に立ちましたか?

解決

限りリファクタリングを費やしてはいけません!

あなたは、コードの一部の変更を加えることは変更を容易にするためにリファクタリングを検討しているときについて。

変更を行った後、その変更によるダメージをクリーンアップするために、再度リファクタリングます。

両方のケースでは、リファクタリングを小さくし、それらを迅速に行うには、上に移動します。

あなたはすべての回で自然のままのあなたのコードを維持する必要がありますが、それはあなたが仕事をするだけでなく、因数分解のコードを持っている場合(そしてあなたが良いユニットテストを持っている場合の の高速移動が容易だということを覚えていません、もちろん)。

他のヒント

テスト駆動開発ます:

赤、緑、リファクタリング。繰り返し、すすぎます。

それはすべての単一サイクルのステップの一つですので、

、あなたはそれが行われて、通常はマイナーなリファクタリングのロトのに気づくでしょう。それはそれがあるべき方法です。

あなたの状況は私にとってよく知られています。調査用のコーディングを行っていると、「正しい」抽象化がどのようなものになるのか全く分からないことがよくあります。おっしゃるように、新しいアイデアが生まれるたびに抽象化は変化する可能性があります。
他の投稿者は次のように提案しています。

  • 継続的な小規模なリファクタリング。ネズミの巣状態に陥るのを避けるのに役立ちます。
  • テスト駆動開発。再利用可能な優れた抽象化を見つけるのに役立ちます。TDD はテストではなく、優れた設計を行うことに重点を置いていることに注意することが重要です。

ただし、調査研究コードには別の戦略があります。プロトタイプ。これはあなたが現在やっていることのようです:コンセプトを証明するためにできるだけ早くコーディングします。それは何も悪いことではありませんが、プロトタイプはそうすべきです いつも 使い捨てになる。必要な入力と知識がすべて得られるまで調整してから、 投げる 離れて コードを削除し、TDD や継続的リファクタリング、その他すべての「物事を正しく行う」戦略をやり直してください。

コードは一切残さないでください。何もコピー&ペーストしないでください。二度と参照しないでください。新しい知識をもとにやり直してください。

一度コードを少しクリーンアップ。あなたがクラスに触れるときは、必ず、あなたが(それに触れ前にそれがあったことをクラスクリーナー<のhref =「http://www.informit.com/articles/article.aspx?p=1235624&seqNum=6」のrel =を残すようにしてみてください"nofollowをnoreferrer"> "ボーイスカウトのルール" を)。リファクタリングは最高の非常に多くの場合、非常に小さなステップで行われますが、されます。

など、いくつかの変数の名前を変更する方法を分割するようなものはわずか数秒または数分を要します。そのような分割やクラスに参加するなど、大きなリファクタリングが、1,2時間かかる場合があります(と、すべてのテストは、少なくとも5分ごとに渡すようにしますが、小さなステップでそれを作る - そう、あなたが入力した<のhref = "のhttp:// C2。 COM / CGI /ウィキ?RefactoringHell」のrel = "nofollowをnoreferrer">リファクタリング地獄と、あなたは最後の既知の作業状態に戻す必要があります)。あなたが何かをリファクタリングするのは数日から数週間かかる場合、それはもはや「リファクタリング」ではない - それはより多くの書き換えのようなものです。

このトピックに関する記事: http://blog.objectmentor.com/記事/ 2007/07/20 /いただきまし-あなたのユニット・オブ・測定する

Gitのような分散型SCMの中に入れて、少なくとも、そのようにあなたがリファクタリング何かを壊したときに干渉することなく、変更前にコミット見つけることdivisibly時間を逆に、だけでなく、変化に取り組み、支店でそれらをコミットすることができるということができます他の人と協力ます。

GITS支店マージは、このようなもののために素晴らしいですし、2人がコードの残りを気にすることなく並列に互換性のない変更を行った場合は、簡単に知っていますよ。

上記の理由から、私はまた、リポジトリとのちょうどのための再ファクタリングコード内の別々のブランチを作成し、定期的に日付アップそれを続けるだろう。このように、他の人があなたの進歩の妨げにならないだけでなく、彼らはそれに目を維持し、彼らはそれらの変更の周りのコードemptivelyを事前ことができますので、最終的にメインブランチをヒットすることで変更を確認することができます。

重複がある場合、あなたが既に知っている場合は、

、あなたはそれを離れてリファクタリングに数日必要はありません。

時々書き換えが唯一の選択肢です。これはケースのようです。

CloneDR には、大きなソース間、正確なコピーとニアミスの両方、重複コードを見つけlangauge構文によってパラメータシステム、。これは、Java、C#、COBOL、C ++、PHPおよび他の多くの言語をサポートしています。

それが見つかったクローンのセットのパラメータ化抽象化を示した場合、

、基本的には、メソッド、関数、クラスとして(実装されている抽象化してコードをリファクタリングすることを提案しています... )。

(やや)だから、CloneDRがあなたのコードに追加される可能性抽象化のリストを取得し実行している、と抽象化リファクタリング、コードの呼び出しによってクローンインスタンスを交換してもこのようにそれを掃除ます。

それは抽象化を呼び出すために必要な各クローンのサイトで使用されるパラメータのバインドを示していたときに、

さらに著しく、それは多くの場合、バインド偶然には概念的に矛盾しているときに容易に認識、不手際クローンインスタンスを示しています。 parameerが壊れたY2Kの修正があります。この場合に違反し、この中でYYYY-MM-DDという名前の変数にバインドし、そのうちの一つは、YY-MM-DDで、「その4桁の年」パラメータの型が見えている場合。だから、クローンバインディングを調べると、多くの場合、バグを見つけます。

これは、科学技術計算では非常に共通の問題です。コードのサイズと複雑さを削減するための最も効果的なアイデアのいくつかは、あなたは常にそれらの仮定を変更する仮定、および科学の需要を活用する必要があります。

あなたがすることができるすべては、あなたが行くようにあなたのコードをリファクタリングしようとすると、任意のコーナーに自分自身を記述しないようにしてくださいです。また、混乱をしていないの価値を理解して良い人と協力ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top