Java : 不要になったコードはコメントアウトで残さずに削除しよう
みなさんは不要になったコードはどうしていますでしょうか?
ばっさり削除する、あとで使うかも…とコメントアウトして残す、などなど。
本記事では、ばっさり削除することをおすすめしつつ、その理由などをご紹介します。
概要
できあがったソースコードを、なんらかの理由で修正することは多いでしょう。
- 仕様が変わった
- 不具合の対応
- リファクタリング
- などなど
理由はさまざまだと思います。
コードを修正すると、不要になるコードも当然でてきます。
- せっかく作ったのに削除するのはもったいない
- また後で使うかもしれないし残しておこう
なんて気持ちが生まれるかもしれません。
しかし、不要になったコードをコメントアウトで残すことはおすすめしません。
代わりに、バージョン管理システム の履歴として残しましょう。
具体例
それでは実際にコードをまじえて見ていきましょう。
果物のリストがあり、それをコンソールに出力します。
ただし、"青りんご" は "りんご" として出力します。
final var fruits = new ArrayList<String>();
fruits.add("りんご");
fruits.add("青りんご");
fruits.add("巨峰");
fruits.add("ぶどう");
for (final var fruit : fruits) {
if (fruit.equals("青りんご")) {
System.out.println("りんご");
} else {
System.out.println(fruit);
}
}
// 結果
// ↓
//りんご
//りんご
//巨峰
//ぶどう
問題なく動作していますね。
よさそうなのでこの対応でリリースしました。
さて、しばらくして仕様に変更が入りました。
- 変更前 : "青りんご" は "りんご" として出力。
- 変更後 : "青りんご" もそのまま出力。
この仕様変更に対応してみましょう。
final var fruits = new ArrayList<String>();
fruits.add("りんご");
fruits.add("青りんご");
fruits.add("巨峰");
fruits.add("ぶどう");
for (final var fruit : fruits) {
System.out.println(fruit);
}
// 結果
// ↓
//りんご
//青りんご
//巨峰
//ぶどう
前のコードよりシンプルになりました。
よさそうですね。
しかし、ここで次のような考えが浮かぶかもしれません。
- もしかしたら、似たような仕様の変更があるかもしれない。
例えば、"巨峰" は "ぶどう" として出力する、など。 - そのときに、修正前のコードがあったほうが対応しやすいのではないか?
確かに一理あります。
修正前のコードをコメントアウトして残してみましょう。
final var fruits = new ArrayList<String>();
fruits.add("りんご");
fruits.add("青りんご");
fruits.add("巨峰");
fruits.add("ぶどう");
for (final var fruit : fruits) {
// 仕様変更によりコメントアウト
/*
if (fruit.equals("青りんご")) {
System.out.println("りんご");
} else {
System.out.println(fruit);
}
*/
System.out.println(fruit);
}
// 結果
// ↓
//りんご
//青りんご
//巨峰
//ぶどう
もし、"巨峰" は "ぶどう" として出力するという仕様変更があれば、確かに対応しやすいかもしれません。
コメントアウトを外して、ちょっと修正すればいけそうです。
for (final var fruit : fruits) {
if (fruit.equals("巨峰")) {
System.out.println("ぶどう");
} else {
System.out.println(fruit);
}
}
しかし、コメントアウトで不要となったコードを残すのはおすすめしません。
そのような もし を許してしまうと、そこら中にコメントアウトのコードが増殖していってしまいます。
不要なコードが残っていると、コードの可読性が悪くなります。
実際に動いているコードだけを理解したい人にとっては、不要なコードは雑音(ノイズ) です。
あとは、単純に邪魔だったりします。
不要なコードを読み飛ばすために、画面をスクロールする手間も増えます。
それは 生産性の低下 につながります。
それではどうすればよいのか…
コメントアウトで残す代わりに、バージョン管理システムの 履歴 として残しましょう。
そして、もし が発生したときは、バージョン管理システムの履歴から必要となる情報を探しましょう。
バージョン管理システムを活用しよう
大前提として、ソースコードはバージョン管理システムで管理するものとします。
もしバージョン管理システムを使っていない場合は、使うことを強くおすすめします。
2024年2月現在では、もっとも広く使われているのは Git です。
Git は、他のバージョン管理システム(Subversion など) に比べて難しいといわれることもあります。
とはいえ、プログラマなら避けてはとおれないので、慣れていったほうがよいでしょう。
修正内容を履歴として管理
バージョン管理システムを使うと、修正した内容を コミット という単位で、履歴として管理できます。
先ほどの例では、
- 変更前 : "青りんご" は "りんご" として出力。
- 変更後 : "青りんご" もそのまま出力。
という仕様の変更が入り、次のようにコードを修正しました。
for (final var fruit : fruits) {
if (fruit.equals("青りんご")) {
System.out.println("りんご");
} else {
System.out.println(fruit);
}
}
↓ 修正
for (final var fruit : fruits) {
System.out.println(fruit);
}
この修正の内容は、バージョン管理システムを使えば、いつでも参照できます。
(履歴から必要なコミットを探す、という手間は少しかかりますが…)
不要になったコードを、もしのためにコメントアウトで残さなくても心配ありません。
すべての修正は、バージョン管理システムの履歴に保存されているからです。
コミットコメントは大事
コミットにつけるコメントは大事です。
必要な履歴を探すときの重要な手掛かりとなります。
1日にいくつもコミットしていると、コメントを考えるのが面倒になる … プログラマあるあるだと思います。
しかし、そこはぐっとこらえて、後から見ても分かりやすいコメントをつけることを心がけましょう。
あのコミットってどれだっけ? あれ、おかしいな見つからない、ということが起こらないように…
まとめ
- 不要になったコードは削除しましょう。
- コメントアウトで残すと、コードの可読性が悪くなります。
- バージョン管理システムを活用しましょう。
- コミットコメントは大事です。
後から見ても分かりやすい内容にしましょう。
- コミットコメントは大事です。
関連記事
- 標準APIにならう命名規則
- コメントが少なくて済むコードを目指そう
- シングルトン・パターンの乱用はやめよう
- メソッドのパラメータ(引数)は使う側でチェックしよう
- 不変オブジェクト(イミュータブル) とは
- 依存性の注入(DI)をもっと気軽に
- 簡易的な Builder パターン
- 読み取り専用(const) のインタフェースを作る
- 図解/デザインパターン一覧 (GoF)
- Abstract Factory パターン
- Adapter パターン
- Bridge パターン
- Builder パターン
- Chain of Responsibility パターン
- Command パターン
- Composite パターン
- Decorator パターン
- Facade パターン
- Factory Method パターン
- Flyweight パターン
- Interpreter パターン
- Iterator パターン
- Mediator パターン
- Memento パターン
- Observer パターン
- Prototype パターン
- Proxy パターン
- Singleton パターン
- State パターン
- Strategy パターン
- Template Method パターン
- Visitor パターン