web-dev-qa-db-ja.com

未使用のコードを削除する必要があるのはなぜですか?

未使用のコードはプロジェクトから削除する必要があると何度も聞いています。しかし、私にとって「なぜ?」.

削除しないための私のポイント:

  • コードはすでに書かれており、努力が費やされています
  • コードは、合成環境および実際の環境でテストできます
  • うまく整理されていれば(グループ化された、個別のパッケージ、疎結合など)、全体的なコード分析やリファクタリングを妨げません。
  • コードは将来使用される可能性があります
  • 削除すると、著者は不快に感じるかもしれません

誰かが未使用のコードを削除(または保持)することの長所を説明してもらえますか?

前もって感謝します!

86
Alex Stamper

未使用のコードを削除する理由は次のとおりです。

  • プロジェクトで新規に作業する人は、作業コードを理解するだけでなく、未使用のマテリアルも理解する必要があります。これは無駄な時間であり、混乱を招きます。

  • いつか誰かが不注意に「休眠」コードを巻き込み、バグを導入する可能性がある変更を加える危険があります。私が取り組んできたプロジェクトで起こったことを知っています。

  • コードのメンテナンスは管理上の負担です。古い冗長コードを保存することにより、負担が増加します。たとえば、メインブランチでの変更のマージは、処理するコードが多くなり、ミスを犯す可能性が増えるため、難しくなります。

  • 時間の経過とともに起こることは、古い未使用コードがコードベースに追加されることです。これにより、混乱、潜在的な誤解、および管理オーバーヘッドが増加します。

  • 未使用のコードが再び使用される可能性はほとんどありません。時間とともに、再利用の可能性は減少します。コードを削除する必要があり、十分に重要であると考えられる場合は、コードを分岐して文書化することができます。

  • コーダーが一生懸命取り組んだコードについて持っている個人的な感情は理解できます。しかし、専門家であるということの一部は、より良い利益のためにそれらの考えを片側に寄せる必要があります。時間は誰も意味せず、作業中のコードベースで履歴コードを保存する場所はありません。

153
suspectus

@suspectusは、コードを削除する理由を提示する素晴らしい仕事をしました。コードを維持するために、個々の箇条書きに対処したいと思います。

  • コードはすでに書かれており、努力が費やされています

ただし、すでに記述されたコードが使用されていない場合、これは(将来の)価値なしでのみコストがかかります。それは無駄に費やされた努力であり、それらの努力の未使用の製品を保存することはそれらの努力を検証しません。コードは、著者の努力に対する何らかの記念としてではなく、今では有用だからです。

  • コードは、合成環境および実際の環境でテストできます

すみません、これがどういう意味かわかりません。

  • うまく編成されていれば(グループ化された、個別のパッケージ、疎結合など)、全体的なコード分析やリファクタリングの邪魔になりません

コードベースに存在する場合、どれだけうまく構成されていても、メンテナンスと理解の負担になります。確かに、lessのように整理することができますが、無くなってもまったく負担になりません。

  • コードは将来使用される可能性があります

アジャイルスクールでは、 [〜#〜] yagni [〜#〜] :あなたはそれを必要としません。はい、あなたはmight将来的に使用する可能性がありますが、それを予測できる明日のニーズについて今日は十分に知ることができませんあらゆる種類の信頼性。そうでないと考えることは、hub慢に向かう慢です。明日についてcan知っているのは、コードベースを簡単に変更できるようにして、未使用のコードがその特性を損なうようにすることです。

  • 削除すると、著者は不快に感じるかもしれません

著者はそれを乗り越えなければなりません。役に立たないことが判明したものをすべて書いた-あなたが言うことができるコードの本体よりも、すべて使用されているコードの本体を指すことができる方がはるかに良い(未使用の残骸が削除されたため)いくつかの方法、「そしてそれは実際に使用中です!」

23
Carl Manaster

いくつかのコードを取り上げてその意図を理解するのは十分に難しいのではありませんが、今はどの部分が使用されていないかを把握する必要がありますか?

15
kenny

コードはすでに書かれており、努力が費やされています

それも不要です。何にも使用しないと、何をするか、どれだけの労力を費やしたかに関係なく、(定義により)役に立たなくなります。

コードは、合成環境および実際の環境でテストできます

役に立たない場合は、テストを行ってもまだ役に立たない。コードが役に立たない場合、そのテストも役に立たないはずです(そのため、コメント付きコードをそこに保持するとあいまいさが生じます-テストを保持しますか?コメント付きコードのクライアントコードがある場合、クライアントコードもコメントしますか? )

うまく編成されていれば(グループ化された、個別のパッケージ、疎結合など)、全体的なコード分析やリファクタリングの邪魔になりません

そうではありません。すべてのツール(ソース管理、静的分析、ドキュメント抽出、コンパイラなど)は、より多くのデータを処理する必要があるため、実行速度が遅くなります(データの大部分または小部分はノイズです)。

一方、コードがnotで構成されている場合、静的分析、リファクタリング、その他のコードが台無しになります。

ツール入力にノイズを導入し、それらがツールに正しく対処することを望んでいます。

静的分析ツールがコメント/コード比を計算するとどうなりますか?昨日まで(またはコードがコメントされたときまで)関連する何かで、あなたはそれを台無しにしました。

最も重要なのは、コメント化されたコードブロックにより、メンテナンスやさらなる開発のためにコードを理解するのに遅れが生じ、そのような遅れはほとんど常にコストがかかることです。これを自問してください:関数の実装を理解する必要がある場合、何を見る必要がありますか? 2行の明確なコード、または2行のコードと、もはや実際ではない26のコメント?

コードは将来使用される可能性があります

存在する場合は、チームの選択したSCMで見つけることができます。

有能なSCMを使用し、(ソースを乱雑にするのではなく)デッドコードを保持するためにそれを使用している場合、そのコードを削除した人(作者をコミットする)だけでなく、その理由(メッセージをコミットする)、その他それとともに変更が行われました(そのコミットの残りの差分)。

削除すると、著者は不快に感じるかもしれません

そう?

あなたは(私が思うに)「Xの感情を傷つけることなく、方法を知っている最高のソフトウェア」ではなく、方法を知っている最高のソフトウェアを作るために報酬を得る開発者チーム全体です。

プログラミングの一部であり、書き込まれたコードのほとんどは最終的に破棄されます。たとえば、Joel Spolskyはある時点で、彼の会社では、書かれたコードの約2%が生産されていると言いました。

コードベースの品質よりも開発者のエゴを優先すると、製品の品質が犠牲になります。仲間の開発者の未熟さを維持しますか?同僚の非現実的な期待を保護しますか?

編集:ソースにコメントアウトされたコードを残す正当な理由が1つありますが、それは非常に特殊なケースです:コードが奇妙な/直感的でない形式で書かれており、書き換えは、本当に微妙な理由で機能しません。これは、問題を修正するために繰り返し試行が行われた後および試行が同じ欠陥を再導入するたびにのみ適用されるべきです。そのような場合、コメント付きの直感的なコードをコメントとして追加し、なぜ機能しないのかを説明する必要があります(したがって、将来の開発者は同じ変更を再度試みません)。

// note by <author>: the X parameter here should normally
// be a reference:
// void teleport(dinosaur& X);
// but that would require that we raise another dinosaur and
// kill it every twelve hours
// as such, the parameter is passed by value
void teleport(dinosaur X);
13
utnapistim
  • 恐怖。これにより、チームの心配が増え、生産量が少なくなります。デッドコードがさらに導入されると、恐怖の量は指数関数的に増加します。 「そのビットが使用されているかどうかはわからないので、削除したり触ったりすることはありません。」
  • スイープの変更。システムのいたる所で変更する必要があるものがデッドコードにも存在する場合、それを変更しますか?どこかで使用されていないかどうかを知るのは非常に難しいので、常に危険です。そして、それが何も破壊しないとしても、この変更後に使用に戻されると、デッドコードはまったく機能しますか?

    抜本的な変更に対処する場合、開発者はコードを含むすべての場所をチェックする必要があります。デッドコードの場合、これは冗長です。また、コードが使用されていないことを確認するのは難しいため、コードが無効になっている場合、それらのチェックには時間がかかります。

  • 精神負荷。何かが使用されているかどうか、またはデッドコードに対して何かを行う必要があるかどうかを考える必要があるたびに、ある程度の頭脳力が必要になります。
  • 野生のガチョウの追跡。 「Foobarの使用方法の例が必要です。コードベースのこれらの場所にあります。最初のヒットを確認し、UIのどこにあるかを確認します。うーん...どこにも見つかりません。」
  • 膨張したレポート(例:コード、クラス、ルーチン、変更の行数)。プロジェクトの可視性と、コードベースのどの部分で作業するかに関する決定および将来のプロジェクトの推定を歪めます。
  • コードベースに対する信頼の低下。これにより、冗長なタスクにより多くの時間が費やされる可能性があり、コードベースを使用するフローが中断されます。開発者は、使用するすべてのものが本来あるべき方法で機能することを非常に注意深く確認する必要があります。

コードベースの一部が使用されないことを知っている場合、それは削除できるため、非常に貴重です。そのままにしておくと、将来的には実際に使用されていないことを確認するのが困難になるか、ほとんど不可能になります。たとえば、驚くべき方法でコードを使用するもののいくつか:反射、文字列から連結されたルーチンを動的に呼び出す、eval、フレームワークのマジック

ただし、将来コードが使用される可能性が高い場合は、バージョン管理システムではなく他のコードに沿ってコードを追加する方が簡単です。しばらくするとコードにあった言葉を覚えていないかもしれないので、VCSの腸からコードを見つけるのは非常に困難です。しかし、デッドコードが存在することはまれであり、その場合でもコードをコメントアウトします。

9
Heikki Naski

デッドコードがコードを汚染している

デッドコードは理解性と可読性を低下させます。

最良のコードは常に再利用されます。また、デッドコードがある場合は再利用性が低下します

私たちは、機械ではなく、仲間のプログラマーとやり取りするためのコードを設計する、コーディングのモジュラーアプローチによって推進されています。コードを理解しやすくするために、最大限のエネルギーを注ぐ必要があります。とにかくマシンは問題ありません。

デッドコードまたはコメント化されたコードは、人を混乱させるだけの偽証跡のようなものです。

8
Jimmy
  • 未使用のコードは、読み通すだけでなく、一般的にコードをスキャンする他のものすべてにとって、より大きな検索スペースです。たとえば、コンパイラ、IDE、ファイル内検索、デバッグ、静的分析、その他のレビュー、ファイルのインクルード、VCSからのチェックアウトなど。これらのプロセスが遅くなり、大きなノイズが追加されます。
  • 未使用のコードが常にデッドコードであるとは限りません。特定の状況で実行される場合があります。これは、バグやパフォーマンスの問題のベクトルを提供するだけでなく、セキュリティ上の問題にもなります。パフォーマンスに関しては、これは大きなダウンロードなどの予期しない方法でそれ自体を表現できます。
  • 未使用のコードは、未使用のコードを生成します。関数呼び出しを削除し、その関数の使用を検索して、まだ必要かどうかを確認する場合、以前の未使用コードと一致する可能性があり、それを保持できると仮定します。未使用のコードが多いほど、コードが未使用かどうかを判断するホップが増えます。
  • 未使用のコードは、多くの場合、最終的に維持する必要があります。 AとBがCに依存しているとしましょう。これらのうち、Bは使用されません。 Cを変更すると、Bが必要とするCの構造体からメンバーを削除したため、Bはコンパイルできません。Bを修正するか、コンパイルからアクティブに削除する必要があります。単に削除する必要があります。

このリストは単純に見えるかもしれませんが、これらのそれぞれは、開発プロセス全体を通して相乗効果をもたらすドラッグを追加する何百もの異なる方法で現れます。非効率性は、多くの場合、簡単かつ数学的な方法で証明または実証できます。

あなたのポイントに応えて...

  • コードはすでに書かれており、努力が費やされています

しかし、それはしばしば維持されなければなりません。また、ファイル内の検索などにも表示されます。

  • コードは、合成環境および実際の環境でテストできます

これが何を意味するのか分かりません。前回と同じだと思います。コードは既にテストされており、クリーンアップすると再テストが必要になる可能性があります。これは、通常は価値があります。これは、時間の90%を回収し、本番環境に移行する前にクリーニングする必要があることを回避するためです。ほとんどすべてのコードには2つの反復があり、動作させる、きれいにする。理由は、誰かが最後のステップをスキップしたためです。コードがdiff、テスト(多くの未使用のコードで乱雑な場合)などを証明するには高価すぎる場合、それは別の全体的な問題です。

  • うまく編成されていれば(グループ化された、個別のパッケージ、疎結合など)、全体的なコード分析やリファクタリングの邪魔になりません

とにかくあなたのコードはこのようになるはずですが、それは問題を中程度に緩和するだけです。何かが整理されているが汚れているべきだと聞くのは、最も奇妙な議論です。コードをモジュール化して依存関係を減らしようとするのは普通のことですが、再利用可能なコードも必要であり、すべてのモジュールがアイランドチャンスである場合は、DRYになっていません。また、未使用の乱雑なコードの問題を緩和するだけで、過度のデカップリングを行っていることに気付くかもしれません。

  • コードは将来使用される可能性があります

価値のあるコードを書く人はたくさんいます。現在使用されていない場合、それは重荷であり、実際には、このパスをたどると実際には未使用コードのごく一部だけが使用済みコードになります。おそらく、未使用のコードは使用可能または使用済みのコードではない可能性があります。再利用される可能性が最も高いコードは、既に何かを実行しているコードです。

さらに悪いことに、未使用のコードには目的がありません。誰かがやって来て、未使用のコードに影響を与える何かを変更しなければならないとき、彼らはそこに座って、目的のないこの未使用のコードが何をする必要があるかを理解しようとして困惑するでしょう.

コードは多くの労力を必要とするため、開始時にこのように感じるのは簡単です。ただし、一度流に慣れると、コードは自転車に乗るようなコードになります。このようなコードを記述するコストが急落すると、それを維持するコストがcostい上がります。

  • 削除すると、著者は不快に感じるかもしれません

これは著者の問題です。一方で、他の人が対処しなければならない未使用のコードを大量に残しておくのは利己的です。一方、作者がコードの品質を重視している場合、おそらくコーディングするべきではありません。あなたはこれで道を行く。あなたの感情を傷つけるので、それが壊れているとき、あなたは彼らのコードを修正できない。誰かがコードに愛着を持っているのは、それが良いからというよりも、単に自分のものであるというだけでは、良い兆候ではありません。作者は、コードがきれいになったことに満足しているはずです。これは、誰かがあなたのためにごみを取り出して、それをごみ箱に放り込むようなものです。

誰かが私のためにそれをしたならば、私は月の上にいるでしょう。それらの感情を乗り越えるのを簡単にするのは、他の誰かがそれをするのを待つのではなく、自分でやってみることです。実行したコードの一部を繰り返し書き換えて、パフォーマンスを向上させ、簡潔にすることで、そのたびに余分なコードを減らして柔軟性を高めます。コードの量については気にせず、わずかなコードでどれだけ達成できるか試してください。これはレベルアップするために研ぎ澄まされており、それを行うとすべてのコードが次のレベルで出てきますので、同じくらい頻繁にレベリングする必要はありません。

3
jgmjgm

コードは未使用ですか?

コードがまだコンパイルされていることを確認するだけでは不十分です。 C++では、「未使用」を削除した場合 暗黙的に定義されたメソッドoperator=のように、コンパイラエラーは発生しません。クラスは(潜在的に正しくない)を黙って使用し始めますデフォルトの実装。 JavaまたはC#では、コードはリフレクションを介して使用される場合があります。オブジェクト指向言語では、継承が役割を果たします(基本クラスが呼び出される場合があります)。ほとんどの言語で、別のオーバーロード関数引き継いだ可能性があります。

コードが使用されていないだけでなく、バ​​ージョン管理でコードの年齢を確認してください。使用されていないように見えたがコミットされたばかりのコードを見たことがあり、実際には別の開発者プロジェクトの最初のステップでした。

未使用のコードを積極的に削除する

あなたはコードを維持するために支払います:

  • 壊れたビルドの修正(エンジニアリング時間)。最近、#includeの変更の複雑なチェーンがあり、未使用のコードに新しいオーバーロードが導入され、何十人もの開発者のチームのすべてのエンジニアがかなりの頭痛の種になりました。
  • テストのマシンリソース(自己テストの連続ビルドがあると仮定)。私のチームは最近、最も遅いテストすべてを調べましたが、それらの多くは、それ以外の場合は未使用のコードを超えていました。ローカルで、または継続的インテグレーションの一部としてテストを実行しているエンジニアは、未使用のコードに対するテストを待っています。
  • 読みやすさの観点から(再びエンジニアリング時間)。ヘッダーファイルはAPIを表します。誰も使用したくない関数が含まれていても、誰もが読まなければならない場合、コードの学習曲線ははるかに難しくなります。
  • コード検索で(再度エンジニアリング時間)。家、ハードドライブ、またはGoogleドライブをクリーンアップしますか?ドメインを検索するほど、関連するコンテンツを使用して誤検知を回避することが重要になります(または、Web検索エンジンのようなより高度な検索を使用します)。

基本的に、平均的な開発者が記述するすべてのコードは5年間で未使用になるため、このアクティビティneverは停止します。これをあなたにさせないでください。高品質で絶対に必要なコードのみを記述してください。

2
davidvandebunte

この議論は数年前ですが、私はちょうどそれに遭遇しました...

言及されていないことの1つは、未使用のコードを削除するために必要な作業です。多くの場合、未使用のコードを削除する時間と労力は本質的に些細なことではありません。また、通常、リファクタリングされたシステムをテストおよび文書化するための追加コストがあります。決定プロセスで考慮すべきもう1つのこと。

2
RonE

まず、常にソース管理ツールを使用してプロジェクトを管理する必要があります。したがって、未使用のコードを削除することは、ソース管理を使用していつでも戻って削除されたコードを取得できるため、良い習慣です。私にとって、未使用のコードを削除する理由は、コードが未使用であることを知っている人だけがそれについて知っているからです。コードがまったく使用されないほどの努力の後に失望するでしょう:)

2
Ankur

次の2つのケースがあると思います。-アプリケーションコード:未使用の場合、時間の経過とともにテストも管理もされていない場合は、「内部コードリポジトリ」に移行できます-APIコード:ライブラリを作成している場合は、IMHOアクティブな開発プロセスの中でそれを維持するためのより良い選択

2