Aikido

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

可読性

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

コメントアウトされた コードは ノイズを 発生させ、 古くなり、 コードベースではなく 
バージョン 管理の 履歴に 属します。

はじめに

開発者が古いロジックが後で必要になるかどうかわからない場合、コメントアウトされたコードが蓄積されます。誰かが「念のため」関数をコメントアウトし、削除せずにそのままにしておくと、それが永久に残ります。このコードがまだ機能するか、なぜ無効にされたのか、削除しても安全なのかは誰にもわかりません。コードベースは過去の実装の残骸で埋め尽くされ、実際に本番環境で実行されている内容の理解を妨げます。

なぜ重要なのか

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

Security implications: コメントアウトされた認証チェック、検証ロジック、またはセキュリティ機能は、これらの保護が存在したが意図的に無効にされたことを示します。コメントアウトされたコードに認証情報、APIキー、または内部URLが含まれている場合、その機密データはプレーンテキストで出荷されています。コードベースをレビューする攻撃者は、検討し削除したセキュリティ対策を正確に把握します。

Version control confusion: 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つの中央システムでセキュアに。
脆弱性を迅速に発見し、自動的に修正。

クレジットカードは不要です | スキャン結果は32秒で表示されます。