品質の向上に最大の影響を与えるレガシーコードベースに対して何ができますか?

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

  •  02-07-2019
  •  | 
  •  

質問

レガシーコードベースで作業しているときに、コードベースの品質を向上させるために、時間の経過とともに最大の影響を与えるものは何ですか?

  • 未使用のコードを削除する
  • 重複したコードを削除する
  • ユニットテストを追加して、カバレッジが低い場合のテストカバレッジを改善します
  • ファイル全体で一貫したフォーマットを作成する
  • サードパーティソフトウェアの更新
  • 静的解析ツール(Findbugs)によって生成された警告を減らす

コードベースは、長年にわたってさまざまなレベルの専門知識を持つ多くの開発者によって作成されてきました。

役に立ちましたか?

解決

これは素晴らしい本です。

その答えが気に入らない場合、私ができる最善のアドバイスは次のとおりです。

  • まず、新しいレガシーコードの作成を停止します[1]

[1]:レガシーコード=ユニットテストのないコード、したがって不明

自動テストスイートを配置せずにレガシーコードを変更することは危険であり、無責任です。優れた単体テストのカバレッジがなければ、これらの変更がどのような影響を与えるかを知ることはできません。フェザーズは「絞首台」を推奨しています変更する必要があるコードの領域を分離し、基本的な仮定を検証するためのいくつかの基本的なテストを作成し、単体テストに裏付けられた小さな変更を行い、そこから解決するアプローチ。

注:すべてを停止し、すべてのテストを書くのに何週間も費やす必要があると言っているわけではありません。それどころか、テストする必要がある領域をテストして、そこから解決するだけです。

ジミーボガードとレイヒューストンは、これに非常によく似たテーマで興味深いスクリーンキャストを行いました。 http:// www .lostechies.com / blogs / jimmy_bogard / archive / 2008/05/06 / pablotv-eliminating-static-dependencies-screencast.aspx

他のヒント

約50人のプログラマーによって作成および変更されたレガシー1M LOCアプリケーションを使用しています。

* Remove unused code

ほとんど役に立たない...無視してください。その投資から大きな投資収益率(ROI)は得られません。

* Remove duplicated code

実際、何かを修正するときは常に重複を検索します。いくつか見つかった場合は、ジェネリック関数を配置するか、重複するすべてのコードの発生をコメントします(ジェネリック関数を配置する努力は価値がありません)。主なアイデアは、同じアクションを複数回実行するのは嫌だということです。別の理由は、他の発生を確認するのを忘れる誰か(私かもしれません)が常にいるからです...

* Add unit tests to improve test coverage where coverage is low

自動化された単体テストは素晴らしい...ですが、大きなバックログがある場合、安定性の問題がない限り、タスク自体を促進するのは困難です。あなたが取り組んでいる部分に行き、数年であなたがまともな報道をすることを願っています。

* Create consistent formatting across files

IMOのフォーマットの違いは、レガシーの一部です。コードが誰またはいつ作成されたかについてのヒントを提供します。これにより、コードのその部分での動作方法に関する手がかりが得られます。再フォーマットの仕事をするのは面白くなく、顧客に何の価値も与えません。

* Update 3rd party software

本当に素晴らしい機能が新しく追加された場合、または使用しているバージョンが新しいオペレーティングシステムでサポートされていない場合にのみ実行してください。

* Reduce warnings generated by static analysis tools

それは価値があります。警告は潜在的なバグを隠す可能性があります。

単体テストを追加して、テスト範囲を改善します。テストカバレッジが適切であれば、恐れることなく機能をリファクタリングおよび改善できます。

これについては、CPPUnitの著者レガシーコードを効果的に使用する

レガシーコードにテストを追加することは、ゼロから作成するよりもはるかに困難です。私が本から取り上げた最も有用な概念は、Feathersが

と定義している「縫い目」の概念です。
  

"その場所で編集せずにプログラムの動作を変更できる場所"

将来のテストを容易にする(またはそもそも可能にする)継ぎ目を作成するためにリファクタリングする価値がある場合があります。 googleテストブログには、このテーマに関する興味深い投稿がいくつかあります。そのほとんどは、依存性インジェクションのプロセスを中心に展開しています

「重複コードを削除する」とは、コードを引き出して抽象化し、複数の場所で使用できるようにすることを意味します。多くのコードとは対照的に、コードの一部を修正して、バグを修正します。

私は現在、私の膝に「あの」古い学校のコードベースの1つを持っているので、この質問に関連することができます。それは本当にレガシーではありませんが、確かに何年ものトレンドに沿っていません。

毎日バグが発生するので、修正したいことを説明します:

  • 入力変数と出力変数を文書化する
  • 変数名をリファクタリングして、実際には他の意味とハンガリー語表記のプレフィックスを意味し、その後にいくつかのあいまいな意味を持つ3文字の頭字語が続くようにします。 CammelCaseがその方法です。
  • コードを変更すると、ソフトウェアを使用する数百のクライアントに影響を与え、最も曖昧な副作用にさえ気付くので、コードを変更することを恐れています。現在ゼロがあるので、反復可能な回帰テストは祝福になります。

残りは本当にピーナッツです。これらはレガシコードベースの主な問題であり、非常に時間がかかります。

レガシーコードで何をしたいのかに大きく依存すると思います...

メンテナンスモードが無期限に残り、正常に動作する場合は、何もしないことが最善の策です。 "破損していない場合は、修正しないでください。"

うまく動作しない場合は、未使用のコードを削除して重複コードをリファクタリングすると、デバッグがはるかに簡単になります。ただし、これらの変更はエラーコードに対してのみ行います。

バージョン2.0を計画している場合、単体テストを追加し、転送するコードをクリーンアップします

優れたドキュメント。レガシーコードを保守および拡張する必要がある人として、それが一番の問題です。理解できないコードを変更するのは実に危険ではないにしても、難しいです。幸運にもドキュメント化されたコードを渡すことができたとしても、ドキュメントが正しいことをどの程度確信していますか?元の著者の暗黙の知識のすべてを網羅しているのですか?すべての「トリック」と話すこととエッジケース?

優れたドキュメントは、元の作者以外の人が悪いコードであっても理解、修正、拡張できるようにするものです。完璧でありながら不可解なコードよりも理解しやすい、ハッキングされたが十分に文書化されたコードをいつでも受け取ります。

私が作業しなければならないレガシコードに対して行った最大のことは、その周りに実際のAPIを構築することです。私は.NETオブジェクトモデルを構築した1970年代スタイルのCOBOL APIであるため、安全でないコードはすべて1か所にあり、APIのネイティブデータ型と.NETデータ型の間の変換はすべて1か所にあります。プライマリメソッドはDataSetを返し、受け入れます。

これを正しく行うのは非常に困難でしたが、私が知っているいくつかの欠陥がまだあります。マーシャリングがすべて行われているため、非常に効率的でもありません。しかし他方では、データを15年前のアプリケーションにラウンドトリップするDataGridViewを構築できます。このアプリケーションは、データを約30分でBtrieve(!)に保持し、機能します。顧客がプロジェクトで私のところに来たとき、私の見積もりは月と年ではなく日と週でした。

Josh Segallが言ったことと並行して、私はそれから地獄をコメントしたと言うでしょう。私はひざに捨てられたいくつかの非常に大きなレガシーシステムに取り組んできましたが、最大の問題はコードの特定のセクションについて既に学んだことを追跡することでした。 「やること」など、メモを書き始めると、ノート、私はすでに私が理解したものを再構成することを止めた。次に、これらのコードセグメントの流れと相互作用に集中できます。

ほとんどの場合はそのままにしておきます。壊れていない場合は、修正しないでください。破損している場合は、先に進み、破損しているコードの部分とそのすぐ周囲のコードを修正して改善します。バグの痛みやひどく欠けている機能を使用して、その部分を改善する労力と費用を正当化できます。

実際のビジネスまたはエンドユーザーのニーズに左右されない、単体テストの全面的な書き換え、リファクタリング、再フォーマット、または配置はお勧めしません。

何かを修正する機会を得た場合、それを正しく行います(最初に正しく行う可能性は既に過ぎているかもしれませんが、その部分に再び触れているので、すぐにそれを行うかもしれません)これには、あなたが言及したすべてのアイテムが含まれます。

つまり、要約すると、やるべきことは1つだけではありません。あなたはそれをすべて少しずつと日和見的に行うべきです。

パーティーに遅れていますが、関数/メソッドが頻繁に使用または参照される場所では、次のことを行う価値があります。

  • ローカル変数は、多くの場合、レガシーコードで名前が不適切になる傾向があります(多くの場合、メソッドが変更されるとスコープが拡張され、これを反映するように更新されないため)。これらの名前を実際の目的に合わせて変更すると、レガシーコードを明確にするのに役立ちます。
  • メソッドをわずかに異なるようにレイアウトするだけでも、驚くべきことになります。たとえば、 if のすべての句を1行に配置します。
  • すでに古い/混乱しているコードコメントがあるかもしれません。不要な場合は削除し、絶対に必要な場合は修正します。 (もちろん、有用なコメントの削除を推奨するのではなく、妨害となるコメントのみを削除することを推奨しません。)

これらは、あなたが探している見出しに大きな影響を与えることはないかもしれませんが、特にコードを単体テストできない場合、低リスクです。

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