冗長ファイルをVCSからすぐに削除せず、代わりにコメントで「削除対象」としてマークするのは悪い習慣ですか?


53

バージョン管理から削除する必要があるソースファイルの処理方法が悪い習慣と見なされるかどうかを知りたかったのです。

その例に基づいて説明します。

基本的にデッドコードであるプログラムのJavaクラスを退屈に整理しなければならなかったので、最近非常に怒った。もちろん、それらは削除する必要がありましたが、私はそのような冗長なものを削除する前に-奇妙なことを言うかもしれません-習慣があります:

私はSVN-> Deleteを介してそのような冗長ファイルをすぐに削除しません(選択したバージョン管理システムの削除コマンドに置き換えます)代わりにそれらのファイルにコメントを入れます(私は頭とフッターの両方を参照します)削除されます+私の名前+日付-さらに重要なこと- それらが削除された理由 次に、保存してバージョン管理にコミットします。次回プロジェクト内の何かをバージョン管理にコミット/チェックインする必要があるとき、SVN-> Deleteを押すと、最終的にバージョン管理で削除されます-もちろん、修正によって復元できます。そのため、この習慣を採用しました。

すぐに削除するのではなく、なぜこれを行うのですか?

私の理由は、少なくともそれらの冗長ファイルが存在した最後のリビジョンに明示的なマーカーを持ちたい、なぜ削除するに値するのかということです。それらをすぐに削除すると、それらは削除されますが、削除された理由はどこにも文書化されていません。私はこのような典型的なシナリオを避けたい:

「うーん...なぜそれらのファイルが削除されたのですか?私は以前はうまく動いていました。」(「元に戻す」を押す->元に戻す人は永遠になくなるか、次の週に利用できなくなり、次の担当者は私のような退屈なファイルの内容を知る必要があります)

しかし、コミットメッセージでそれらのファイルが削除された理由に注意しませんか?

もちろんやりますが、コミットメッセージが同僚によって読まれない場合があります。(私の場合は死んでいる)コードを理解しようとするときに、最初にバージョン管理ログと関連するすべてのコミットメッセージを確認するのは、典型的な状況ではありません。同僚はログをクロールする代わりに、このファイルが役に立たないことをすぐに確認できます。時間を節約でき、このファイルはおそらく復元された可能性が高いことを知っています(または、少なくとも問題が発生します)。


120
基本的に、バージョン管理システムのジョブをファイルに直接複製しようとしています。そのようなことをすることは、間違いなく私の頭の中でフラグを立てるでしょう。あなたの同僚がコミットメッセージを読んでいない場合、彼らが合法的に削除されたファイルを復活させる、それは、コードの見直しを渡し、そこには間違いなくあなたのチームの中で何かが間違っている、それはよりよいそれらを教えるための素晴らしい機会です。
ビンセントサバード

6
@GregBurghardtこれは悪い考えについての良い質問のようです。おそらく、人々はその2番目の部分に基づいてダウン投票しています(IMOでは、最初の部分にアップ投票する必要があります)?
ベンアーロンソン

13
「次回、プロジェクト内の何かをバージョン管理にコミット/チェックインする必要がある場合、SVN-> Deleteを押します」(潜在的に)完全に無関係なコミットでそれらを削除すると言っていますか?
ケビン

21
もちろん、私はやりますが、コミットメッセージが同僚によって読まれない場合があります。-コミットメッセージをチェックしていない場合、ファイルが削除された理由に関心がないと想定しても安全です。そうでない場合は、コミットメッセージをチェックする必要があります。
Ant P

9
VCSチェックアウトからファイルが消えた理由を知りたい場合は、最初に変更履歴を調べ、それが問題を説明しない場合は、削除がレビューされたときに起こった議論を読みます。(あなたはすべての変更が通過するコードレビューのプロセスを持っていない場合、あなたは大きな問題を抱えている。)そして場合、それはまだ私は、ファイルを削除した誰に話をしますunenlighteningされます。ファイルの以前の内容を調べて、以前は何をしていたのかを発見しようとするかもしれませんが、削除の説明のためではありません。
-zwol

回答:


110

ファイルにコメントを追加する際の問題は、ソース管理で削除して説明を付けるのではなく、削除する必要があるため、開発者がコミットメッセージを読んでいない場合、ソースコードのコメントを必ず読むという前提です。

部外者の観点から見ると、この方法論はソース管理の非常に保守的な見方に根ざしているようです。

「この未使用のファイルを削除して、誰かがそれを必要としたらどうなるでしょうか?」誰かが尋ねるかもしれません。

ソース管理を使用しています。変更を元に戻すか、ファイルを削除した人に連絡してください(通信)。

「私が死んでファイルを削除した場合は、その後、誰かがそれを再び使用を開始し、彼らは変更を加えます?」他の誰かが尋ねるかもしれません。

繰り返しますが、ソース管理を使用しています。人が解決しなければならないマージ競合が発生します。ここでの答えは、最後の質問と同様に、チームメイトとコミュニケーションを取ることです。

ファイルを削除する必要があると本当に疑う場合は、ソース管理から削除するに通信してください。たぶん最近使用されなくなっただけかもしれませんが、今後の機能で必要になるかもしれません。あなたはそれを知りませんが、他の開発者の一人はそうかもしれません。

削除する必要がある場合は、削除します。コードベースから脂肪を取り除きます。

「おっと」を作成し、実際にファイルが必要な場合は、ファイルを回復できるようにソース管理を使用していることに注意してください。

質問に対するコメントで、Vincent Savardは次のように述べています。

...同僚がコミットメッセージを読んでいないのに、正当に削除されたファイルを復活させ、コードレビューに合格した場合、チームに間違いがあるのは間違いありません。

これは適切なアドバイスです。コードレビューはこの種のものをキャッチする必要があります。開発者は、ファイルに予期しない変更が加えられたとき、またはファイルが削除または名前変更されたときに、コミットメッセージを参照する必要があります。

コミットメッセージがストーリーを伝えていない場合、開発者はより良いコミットメッセージを記述する必要もあります。

コードの削除やファイルの削除を恐れることは、プロセスに関するより深い体系的な問題を示しています。

  • 正確なコードレビューの欠如
  • ソース管理の仕組みに関する理解不足
  • チームコミュニケーションの欠如
  • 開発者側の不十分なコミットメッセージ

これらは対処すべき問題であるため、コードやファイルを削除するときにガラスの家に岩を投げているような気がしません。


3
「開発者がコミットメッセージを読まなければ、ソースコード内のコメントを必ず読めると仮定します。」これはかなり良い仮定だと思います。ファイルを変更する開発者は、タスクを完了するために実際にファイルを見る必要がありますが、ソース管理履歴を見るように強制するものは何もありません。
AShelly

7
@AShelly:開発者のタスクがコメントを変更することはめったにありません。タスクにはコードの変更が含まれ、これは開発者が注力するものであり、コメントではありません。
グレッグブルクハート

21
@AShellyファイルを開く必要があるからといって、上部の特定のコメントを読むわけではありません。この変更のターゲットオーディエンスは、最も気づかない開発者であり、ニーズが唯一のニーズであり、すべてがそれらを中心に展開する必要があると考える種類です。これらはあなたの丁寧なコメントを読む可能性は低いです。さらに悪いことに、彼らはそれを読んでから、次の最も古いバージョンに戻るだけです。
コートアンモン

5
@AShelly-例として、私は一般的にファイルをある場所に開きます。VSでは、上部のドロップダウンまたは「定義に移動」コンテキストメニューを使用して、メソッドを直接開くことができます。ファイルの先頭が表示されることはありません。また、Sublime Textでは、頻繁に行を開きます。opendialog users.rb:123は、users.rbを行123に直接開きます。多くのコードエディターには、非常によく似たオプションがあります。
-coteyr

2
上記に加えて、このようなクリーンアップタスクの実行が複雑になるほど、人々が定期的に実行する可能性は低くなります。あなたがそれをより簡単にすることで逃げることができるなら、それはあなたと他の皆のための「活性化エネルギー」を下げます。これは、他のチームメンバーのプラクティスの変更を奨励しようとしている場合に特に重要です。手順が複雑になるほど、賛同を得るのが難しくなります。
-xdhmoore

105

はい、それは悪い習慣です。

ファイルの削除をコミットするときは、コミットメッセージに削除の説明を入れる必要があります。

ソースファイルのコメントは、現在のコード説明する必要があります。コミットメッセージは、コミットの変更が行われた理由を説明する必要があるため、ファイルのコミット履歴はその履歴を説明します。

ソース自体に直接変更を説明するコメントを書くと、コードを追跡するのが非常に難しくなります。考えてみてください。コードを変更または削除するたびにファイルにコメントを追加すると、すぐにファイルに変更履歴に関するコメントが押し寄せます。


6
おそらく質問への答えを追加します。それは悪い習慣ですか?はい、....理由
フアン・カルロス・コト

1
元に戻すよりもコメントを解除する方が簡単なため、(OPとして)同じことを行うことがあります。まれに、コードがコンパイルされて自動テストに合格したとしても、そのコードが存在する理由があり、私は手動テスターが見つけることを見落としていました。このまれなシナリオでは、代わりにいくつかのコミット後に、私はコメントを解除コードの背中(と、それを向上させることができる方法を再訪)主要な痛みを通過するか、物事を元に戻すの
アンドリューSavinykh

2
@AndrewSavinykhそれは違います、あなたはまだあなたがあなたが削除したいかどうかわからないコードをコメントしています。
五葉

6
@AndrewSavinykh「いくつかのコミットの後で大きな痛みや元に戻す」–どのバージョン管理を使用しているのだろうか。これは大きな痛みではありません。それは確かにあなたがそれを数回行われ、ために外を見るために何を学んできた、少なくともではないの後、Gitのではない... 自分の歴史を提供はあなたを与える不必要な前後のコミットと上書きされていません他のすべてのマージと競合します。そして、単に何かをコメントアウトするだけのコミットは、これを行う傾向があります
...-leftaroundabout

4
そのメンテナ本当に働いたことはないプロジェクト- @AndrewSavinykhはい、それは私がこれらの問題経験していないているようではありません、バージョン管理と、本当にされている必要がありますコメントでの情報の多くを置くではなく、代わりに新しいマニュアル・アンドゥ・コミットを追加、コミットメッセージリポジトリの結果の状態は、すべてのより大きなリベースで多くの競合の楽しさをもたらしました...しかし、それは私のポイントであり、これらの問題は、多くの場合、ここで防御するような回避策によって引き起こされます。
leftaroundabout

15

私の意見で、あなたのオプションは両方ともベストプラクティスはなく、悪いプラクティスではありません

  1. コメントを追加しても、誰かがそのコメントを読んだ場合にのみ、値が追加されます。
  2. (変更の説明に理由がある)VCSから単純に削除すると、重要な成果物に影響を与える可能性があり、多くの人々は、特に圧力がかかっている場合に、変更の説明を読みません。

私の好ま練習- 、年間で数回かまれたことに主に起因するか、誰によって、あなたのコードが使用されている場合、あなたが常に知っていないことを念頭に置いては -にあります:

  1. それは削除候補とある旨のコメントの追加、非推奨 #warning または類似を、(ほとんどの言語は、このような仕組み、例えば中のいくつかの並べ替えていたJavaを、最悪の場合、print文または類似の意志で十分)、理想的な時間スケールのいくつかの並べ替えを持つと連絡先の詳細。これにより、まだ実際にコードを使用しているユーザーに警告が表示されます。こうした警告が存在する場合、これらの警告は通常、各関数またはクラス内にあります。
  2. しばらくして、警告を標準のファイルスコープにアップグレードします#warning(一部の人々は非推奨の警告を無視し、一部のツールチェーンはデフォルトでそのような警告を表示しません)。
  3. 後でファイルスコープ#warningをa #errorまたは同等のものに置き換えます-これによりビルド時にコードが破損しますが、絶対に必要な場合は削除できますが、削除する人は無視できません。(一部の開発者は、警告を読んだり対処したり、重要な警告を区別できないほど多くの警告を持っています)。
  4. 最後に、ファイルをVCSで削除済みとして(期日以降に)マークします。
  5. 警告段階で全体のパッケージ/ライブラリ/などを削除した場合、私はあるREADME.txtまたはREADME.htmlファイルまたは類似追加しますなぜパッケージを取り除くために計画されているときとの情報と、ちょうどそのファイル、去るAとし残りのコンテンツを削除した後のしばらくのパッケージの唯一のコンテンツとして、それが削除されたときに言うように変更します

このアプローチの利点の1つは、一部のバージョン管理システム(CVS、PVCSなど)がVCSで削除された場合、チェックアウト時に既存のファイルを削除しないことです。また、良心的な開発者、すべての警告を修正する開発、問題に対処するため、または削除に異議を申し立てるための多くの時間を与えます。また、残りの開発者に、少なくとも削除通知見て、多くの苦情を言わせます

なお、#warning/ #errorで提供されたテキストが続く警告/エラーが発生するC / C ++のメカニズム時にコード、Javaが/ javaの-docのは、持っていることをコンパイラの出会い@Deprecated使用上&警告を発行するために注釈を@deprecatedなどがあり、いくつかの情報を提供しますPythonで同様のことを行うレシピ&私は、現実の世界でassert同様の情報を提供するために使用されるのを見てき#errorました。


7
特に、この質問ではJavaに言及しているため、@deprecatedJavaDocコメントと@Deprecated注釈を使用します。
-200_success

8
これは、まだ使用中の何かを取り除きたい場合に、より適切と思われます。この警告は、すべての使用がなくなるまで続く可能性がありますが、コードが無効になったらすぐに削除する必要があります。
アンディ

6
@Andyライブラリタイプのコード、特にオープンソースや大規模な組織の問題の1つは、コードは死んでいると思うかもしれませんが、個人的には想像もしなかった1つ以上の場所でアクティブに使用されていることですコードが本当に悪いか、セキュリティリスクが含まれているため、コードを削除する必要がある場合がありますが、コードが使用されているかどうか、どこで使用されているかはわかりません。
スティーブバーンズ

1
@ 200_successありがとう-C / C ++表示の私の背景-答えに追加されました。
スティーブバーンズ

1
@SteveBarnesたぶん、しかしそれはOPが求めていることではありません。彼はコードが死んでいることを確認しました。
アンディ

3

はい、それは悪い習慣であると言いますが、それはファイルとコミットメッセージにあるからではありません。問題は、チームと通信せずに変更しようとしていることです。

トランクに変更(ファイルの追加、削除、または変更)を行うたびに、トランクにコミットする前に、チームのメンバー(またはメンバー)と直接話し合う必要があります。それらについて知識がある(基本的に、チームメートと直接これらのヘッダーに入れる内容について話し合う)。これにより、(1)削除するコードを本当に削除する必要があり、(2)コードが削除されたことをチームが知っている可能性が高くなり、削除を元に戻そうとしないようになります。言うまでもなく、追加したコードのバグ検出なども得られます。

もちろん、大きなものを変更するときは、コミットメッセージにも含める必要がありますが、すでに説明しているので、重要なアナウンスのソースである必要はありません。Steve Barnesの答えは、コードの潜在的なユーザープールが大きすぎる場合に使用するいくつかの優れた戦略にも対応しています(たとえば、最初にファイルを削除する代わりに、言語の非推奨マーカーを使用します)。

コミットせずにそれほど長くしたくない場合(つまり、変更が複数のリビジョンとして最も意味がある場合)、トランクからブランチを作成し、ブランチにコミットしてから、ブランチをマージしてトランクに戻すことをお勧めします変更の準備ができています。そうすれば、VCSはまだファイルをバックアップしていますが、変更はトランクに影響を与えません。


1

複数のプラットフォームと構成でビルドされるプロジェクトに関連する問題。死んだ判断したからといって、それが正しい判断だとは限りません。使用中の死者は、まだ除草する必要がある残留依存を意味する場合があり、一部は見落とされている可能性があることに注意してください。

だから(C ++プロジェクトで)私は追加しました

#error this is not as dead as I thought it was

そして、それをチェックインしました。すべての通常のプラットフォームの再構築が完了するのを待ち、誰もそれについて文句を言うことはありません。誰かがそれを見つけた場合、行方不明のファイルに戸惑うのではなく、1行を削除するのは簡単です。

あなたが言及したコメントはバージョン管理システムで行われるべき機能を複製していることに原則的に同意します。しかし、それを補う特定の理由があるかもしれません。VCSツールを知らないことはそれらの1つではありません。


-1

悪い習慣の連続で、これは非常にマイナーです。ブランチをチェックアウトして古いコードを確認できるようにしたいときに、これを実行します。これにより、置換コードとの比較が容易になります。通常、コードレビューコメント「cruft」を受け取ります。ちょっとした説明で、コードレビューに合格しました。

しかし、このコードは長く続くべきではありません。私は通常、次のスプリントの開始時に削除します。

コミットメッセージを読んでいない同僚や、プロジェクトにコードを残した理由を尋ねない同僚がいる場合、問題はコーディングスタイルの問題ではありません。別の問題があります。


これは、以前の6つの回答で作成され説明されたポイントに対して実質的なものを提供していないようです
-gnat

-3

スタントをプルする前に、クラスをリファクタリングし、UNUSED_Classnameにプレフィックスを付けて名前を変更することもできます。次に、削除操作も直接コミットする必要があります

  • ステップ1:クラスの名前変更、コメントの追加、コミット
  • ステップ2:ファイルを削除してコミットする

デッドコードの場合は、削除します。誰でもそれを必要とします、彼らは戻ることができます、しかし、名前を変更するステップは、彼らが考えることなくそれを直接使用するのを防ぎます。

また、ファイルのすべてのコミットメッセージを表示する方法を人々に教えます。一部の人々はそれが可能であることすら知らないのです。


6
「リファクタリング」は、あなたがそれが何をするかを本当に意味するものではありません
ニックキリアキデス

6
使用されていないことを確認するためにクラス/メソッドの名前を変更する必要はなく、削除しても同様に機能します。代わりに、手順は他の変更と同じです:1)デッドコードを削除する、2)テストを実行する、3)合格した場合、commentaryでコミットする
シュヴェルン

1
@ user275398また、ファイルの名前を変更するのは本当に多すぎると思います。また、技術的な観点からも、SVNはファイルが削除されて新しい名前で作成されるように名前の変更を処理するため、履歴が中断されます。名前を変更したファイルを復元してそのSVNログを調べると、名前変更前の履歴は利用できません。そのためには、古い名前のファイルを元に戻す必要があります。リファクタリングは他の方法で行われ、リファクタリングは既存のコードを新しい構造に編成することです。
ブルーダーLustig

@BruderLustig:良いソフトウェアは確かにそれをしません。Gitにはgit mv、履歴を追跡するがあります。Mercurialも同様hg mvです。SVNでも動作するように見えsvn moveますか?
wchargin

@wcharginいいえ、git mvファイルを移動し、ファイルの削除とファイルの作成をステージングするだけです。すべての移動追跡は、実行時に行われますgit log --followgit名前の変更を追跡する方法はなく、実際には変更をまったく追跡しません。代わりに、コミット時に状態を追跡し、履歴を調べたときに何が変更されたかを見つけます。
-maaartinus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.