Aikido

コードベースからコメントアウトされたコードを削除すべき理由

読みやすさ

ルール
削除 コメントアウトされた コード ブロック

コメントアウトされた コード ノイズを生成する ノイズを 陳腐化し 時代遅れになり、 
そして 属する  バージョン 管理 履歴に ではない コードベース コードベースではない。

はじめに

開発者が古いロジックを後で必要とするか確信が持てない場合、コメントアウトされたコードが蓄積される。誰かが関数を削除せずに「万一に備えて」コメントアウトすると、それが永久に残存する。このコードがまだ動作するか、なぜ無効化されたか、削除しても安全か――誰も把握していない。コードベースは過去の実装の亡霊で埋め尽くされ、本番環境で実際に動作しているものを理解する妨げとなる。

なぜそれが重要なのか

コードの保守性:コメントアウトされたコードは、読者に「実際に動作している部分」と「休止状態の部分」を頭の中で選別することを強いる。コードレビュー時には、これらのブロックが一時的な実験なのか、重要なロールバックオプションなのか、あるいは何年も前に忘れ去られた残骸なのか判断できない。このノイズにより、実際のロジックの理解、関連するコードセクションの発見、そして意味のある変更レビューが困難になる。

セキュリティ上の影響:コメントアウトされた認証チェック、検証ロジック、またはセキュリティ機能は、これらの保護機能が存在していたが意図的に無効化されていたことを示しています。コメントアウトされたコードに認証情報、APIキー、内部URLが含まれている場合、その機密データを平文で公開していることになります。攻撃者がコードベースを調査すれば、あなたが検討した上で削除したセキュリティ対策の内容を正確に把握できます。

バージョン管理の混乱:Gitの差分表示は、実際には変更されていないコメントアウトされたブロックで乱雑になる。ロジックがいつ変更されたか、あるいは機能が特定の動作をする理由を追跡する必要がある場合、コメントアウトされた代替案が実際の履歴を覆い隠してしまう。コードベースを検索すると、実行されないデッドコード内のマッチが返され、実行されないパスを調査する時間が無駄になる。

コード例

非準拠:

async function createUser(userData) {
    // const hashedPassword = await bcrypt.hash(userData.password, 10);

    const user = await db.users.create({
        email: userData.email,
        password: userData.password,
        // password: hashedPassword,
        role: userData.role || 'user'
    });

    // await sendWelcomeEmail(user.email);
    // await notifyAdmins(user);

    // Old validation approach
    // if (!isValidEmail(user.email)) {
    //     throw new Error('Invalid email');
    // }

    return user;
}

問題点:コメントアウトされたパスワードハッシュ処理から、パスワードが平文で保存されていることが判明しており、重大なセキュリティ上の脆弱性です。ウェルカムメールと管理者通知の有効化要件が不明確であり、古い検証処理からメール検証が欠落している可能性があります。

✅ 準拠:

async function createUser(userData) {
    if (!isValidEmail(userData.email)) {
        throw new Error('Invalid email');
    }

    const hashedPassword = await bcrypt.hash(userData.password, 10);

    const user = await db.users.create({
        email: userData.email,
        password: hashedPassword,
        role: userData.role || 'user'
    });

    await sendWelcomeEmail(user.email);
    await notifyAdmins(user);

    return user;
}

重要性:この関数は明確かつ完全であり、本番環境で正確に実行される内容を示しています。メール検証が最初に実行され、パスワードは適切にハッシュ化され、有効化されている機能に曖昧さなくすべての通知が送信されます。

結論

コードをコメントアウトする代わりに削除してください。バージョン管理システムは過去に記述されたすべての行を保存しており、以下を通じてアクセス可能です。 git log そして git blame 必要な時に。コメント付きのコードをリポジトリに残すのは、実際のロジックを覆い隠すノイズを生み、コードベースの理解を難しくするだけです。

よくある質問

ご質問は?

ロールバックのために古い実装が必要になった場合はどうすればよいですか?

コメントではなく、機能フラグやバージョン管理ブランチを使用してください。古いロジックに戻す可能性がある場合は、切り替え可能な機能フラグの背後で実装してください。恒久的な変更の場合は、古いコードを削除し、Gitの履歴に依存してください。削除したコードは、必要に応じて`git log -p`や`git show`でいつでも復元できます。

開発中に実験的なコードをどのように扱うべきですか?

実験は別々のブランチで実施するか、機能フラグで制御してください。2つのアプローチをテストする場合は、それぞれにブランチを作成するか、設定フラグで切り替えてください。メインブランチにコメントアウトされたコードが残っている場合、本番環境に何を含めるべきか確信が持てないことを示しており、これはバージョン管理の問題ではなく計画の問題です。

デバッグ中にコードを一時的に無効化するのはどうでしょうか?

ローカルでのデバッグ作業には問題ありませんが、決してコミットしないでください。コミット前にgit add -pを使用して、コメントアウトされたデバッグコードを確認し除外してください。チーム全体で一時的にコードを無効化する必要がある場合は、コメントではなく機能フラグや設定を使用してください。

コメントアウトされた説明文も削除すべきでしょうか?

いいえ、このルールはドキュメントコメントではなく、コメントアウトされたコードブロックを対象としています。動作の理由や方法を説明する解説コメントは価値があります。問題なのは、もはや関連性があるかもしれないし、ないかもしれない、実行可能なコードのコメントアウトされたブロックです。

コメントアウトされたコードが古い実装手法を文書化している場合はどうでしょうか?

アプローチはコメントで説明し、死んだコードを残すことで記録しないこと。「以前はXアプローチを使用していたが、ZのためYに変更した」と記述し、両方の実装をコメントアウトしたままにしない。歴史的背景はコミットメッセージや設計文書に記載すべきであり、休眠状態のコードブロックに属するものではない。

今すぐ安全を確保しましょう

コード、クラウド、ランタイムを1つの中央システムでセキュアに。
脆弱性を迅速に発見し、自動的に修正。

クレジットカードは不要。