レガシーコードを効果的に使用する上で重要な点は何ですか?[閉まっている]


133

レガシーコードで効果的に作業する」という本を何度か推奨しています。この本のキーポイントは何ですか?

ユニット/統合テストを追加してからリファクタリングすることよりも、レガシーコードを扱うことのほうがはるかに多いですか?



2
もちろん、ポイントはテストを追加してからリファクタリングすることです。この本の大部分はあなたがテスト中にあり得ないほど複雑なコードを取得する方法に関するものであり、その点には多くの目を見張るものがあります。Feathersは囚人を連れて行かないとだけ言ってみましょう!
キリアンフォス

9
多分あなたはただ本を読むべきです
HLGEM

ここニースレビュー:andreaangella.com/2014/03/...
rohancragg

回答:


157

レガシーコードの主な問題は、テストがないことです。そのため、いくつか追加する必要があります(さらに...)。

@mattnzが指摘したように、これ自体は多くの作業を必要とします。しかし、レガシーコードの特別な問題は、テスト可能なように設計されていないことです。そのため、通常は、複雑なスパゲッティコードが複雑に絡み合っており、ユニットテストの対象となる小さな部品を分離することは非常に困難またはまったく不可能です。そのため、単体テストの前に、コードリファクタリングして、テストしやすくする必要があります

ただし、安全にリファクタリングするには、変更で何も破損していないことを確認する単体テストが必要です。これはレガシーコードのキャッチ22です。

この本は、最初の単体テストを有効にするためだけに、コードに絶対的に最小限の、最も安全な変更を加えることにより、このキャッチを打開する方法を教えます。これらは、デザインをより良くするためのものではなく、ユニットテストを有効にするためだけのものです。実際、設計がより複雑になったり、より複雑になったりすることがあります。ただし、これらを使用するとテストを作成できます。ユニットテストを実施したら、自由に設計を改善できます。

コードをテスト可能にするための多くのトリックがあります-ある種の明白なものもあれば、まったくないものもあります。本を読まなければ、自分自身について考えたことのない方法があります。しかし、さらに重要なことは、Feathers がコードユニットを正確にテスト可能にするものを説明していることです。依存関係をカットし、コードに障壁を導入する必要がありますが、次の2つの明確な理由があります。

  • センシング -コードの実行の効果を確認および検証するため、および
  • 分離 -最初に特定のコードをテストハーネスに取り込むため。

依存関係を安全に切断するのは難しい場合があります。インターフェース、モック、依存性注入の導入は目標としてクリーンで素晴らしいものですが、この時点では必ずしも安全ではありません。そのため、通常は、たとえばDBへの直接リクエストを開始するメソッドをオーバーライドするために、テスト対象のクラスをサブクラス化する必要がある場合があります。また、テスト環境で依存クラス/ jarを偽のクラス/ jarに置き換える必要がある場合もあります...

私にとって、フェザーによってもたらされる最も重要な概念は縫い目です。シームは、コード自体を変更せずにプログラムの動作を変更できるコード内の場所です。コードに継ぎ目を構築すると、テスト対象のコードを分離できますが、直接実行することが困難または不可能な場合でも、テスト中のコードの動作を感知することもできます(たとえば、呼び出しが別のオブジェクトまたはサブシステムに変更を加えるため) 、その状態はテストメソッド内から直接クエリすることはできません)。

この知識により、最も厄介なコードヒープ内のテスト容易性の種に気づき、そこに到達するための最小限の、中断を伴わない、最も安全な変更を見つけることができます。言い換えれば、気付かないうちにコードを壊すリスクがある「明白な」リファクタリングを避けるために-それを検出するための単体テストがまだないので


5
上記の答えが「単体テスト」と言っている場合、実際には「自動テスト」を意味することに注意してください。レガシーアプリケーションのために、最初に有用な自動テストの大部分は、実際になり統合テスト(テスト・ロジックは、全体的なコードの大きなスラブを実行し、さまざまな場所での欠陥による故障を生成することができる場合)、よりもむしろ真ユニットテスト(1つのモジュールのみを分析し、それぞれのコードのはるかに小さな部分を実行することを目的とする)。
ルッツプレシェルト

99

レガシーコードを効果的に使用するための重要なポイントをすばやく取得する方法


3
そのHanselminutesページ上のMP3リンクが壊れているが、上の1 hanselminutes.com/165/...はない- s3.amazonaws.com/hanselminutes/hanselminutes_0165.mp3
ピーターモーテンセン14

PDFリンクを修正してくれたrosstonに感謝します。objectmentor.comがなくなったように見えます-「ボブおじさん」が倒産したのでしょうか?
MarkJ

オブジェクトメンターに何が起こったのかはわかりませんが、最近ではボブおじさんは7th Lightで働いています。
ジュール

40

私は1980年代に遡る数百万行のコードのコードベースに取り組んでいます。それは単なるソフトウェアですので、いくつかの単体テストを書くだけの問題なので、あなたはそれをリファクタリングして、より良くすることができます。

ここでのキーワードはただです-それは、どのようなプログラマーの語彙にも属さない4文字の言葉であり、レガシーシステムで作業している人は言うまでもありません。

単体テストを作成し、1時間分の開発作業をテストするのにどれくらい時間がかかると思いますか?議論のために、もう一時間言ってみましょう。

20万年前の100万行のレガシーシステムにどれだけの時間を投資していますか?たとえば、20年の開発者20人が2000時間/年(彼らはかなり一生懸命働いた)としましょう。数を選んでみましょう-新しいコンピューターと新しいツールがあり、あなたはそもそもこの$%^^の部分を書いた人たちよりもはるかに賢いです-あなたはそれらの10の価値があるとしましょう。あなたは40人年も持っていますか?

したがって、あなたの質問に対する答えはもっとたくさんあります。たとえば、1000行(5000行を超える行がいくつかあります)のルーチンは、非常に複雑で、スパゲッティの一部です。(さらに4文字の単語で)数日で数百行のルーチンと数20行のヘルパーにリファクタリングできますよね?違う。これらの1000行には、100のバグ修正が隠されています。各バグ修正は、文書化されていないユーザーの要件または不明瞭なケースです。元の100行のルーチンではジョブが実行されなかったため、1000行です。

あなたそれが壊れていないなら、それを修正しないでください」という考え方で作業する必要があります。破損した場合は、修正するときに非常に注意する必要があります-改善するにつれて、誤って何かを変更しないようにします。「壊れた」には、システムとその使用法に依存する、保守できないが正常に動作するコードが含まれる場合があることに注意してください。「私がこれを台無しにして悪化させたらどうなるか」と尋ねてください。なぜなら、いつかあなたはそうするでしょうし、なぜあなたがそれをすることを選んだのかを上司に伝える必要があるからです。

これらのシステムはいつでも改善できます。仕事の予算、タイムラインなどがあります。そうでない場合-行って作ります。お金/時間がなくなったら、それを改善するのを止めてください。機能を追加し、それを少し良くする時間を与えてください。バグを修正します-もう一度、少し余分な時間を費やして改善します。開始時よりも悪い状態で配信しないでください。


2
ヒントをありがとう!これらはあなたのものですか、それとも本からですか?
アルマン

3
おそらく両方とも少し-私はこの仕事を数年行った後、この本を読んだ。他の優れた本と同様に、それはあなたが現在していることの一部を挑戦させ、あなたのしていることのほとんどを強化しますが、あなたの特定の問題のセットに対するすべての答えを持ちません。
mattnz

7
「元の100lineルーチンが仕事をしなかったので、それは1000linesです。」そのため、実際にそうなることはめったにありません。多くの場合、元の開発者が袖をまくり、コーディングを開始したのは、計画や設計のために少しでも時間を割かないためです。
スティーブンTouset

3
いいえ。私はほとんどの場合(個人的に遭遇しました)、1,000行のルーチンは、適切な抽象化の書き方を考える前に人々がコードを書き始めたことを明確に示していると言っています。数千行のルーチンは、定義上、事実上複雑すぎます。何百もの隠された、コメント化されていないバグ修正を含む千行のルーチンは、責任ある開発者の特徴であると言っていますか?
スティーブンTouset

16
このサイトのすべての投稿を信じている場合、誰もが1000行のスパゲッティコードを処理する必要がありますが、誰もそれを書いたことはありません。私の経験では、1000(および10000)ラインルーチンは、賃金を支払う上司が必要とするものを提供するために、彼らが持っているもので最善を尽くしている開発者の特徴です。私は多くの開発者が状況を知らずに傍観者から自由にコメントするのをin辱し、慢であると感じていますが、批評のためにコミュニティに自分の仕事を公開する必要はありません。
mattnz

19

本から取り上げる2つの重要なポイントがあります。

  1. レガシーコードは、テストカバレッジのないコードです。
  2. レガシコードを変更する必要がある場合は、必ずカバレッジがあることを確認する必要があります。

他のレスポンダーが指摘しているように、既存のレガシーコードを先制的に更新しようとするのはばかです。代わりに、(新しい機能またはバグ修正のために)レガシーコードに変更を加える必要があるときはいつでも、レガシーステータスを削除するために時間をかけてください。


6
+1優れた点:「レガシーコードに変更を加える必要があるときはいつでも、レガシーステータスを削除する時間を取ってください。」
ジョン

3
レガシーステータスの削除、私の投票を取得:)
レイチェル

7

実を言うと、テストの追加とリファクタリングがすべてです。

しかし、この本は、安全にテストおよびリファクタリングするのが非常に難しいコードを使用して行うためのさまざまなテクニックを提供します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.