ルール
排除する 明らかな ファイル内の 重複を排除する。
重複する コード ブロック を増やす メンテナンス
負担 そして を増加させます。 リスク リスク 一貫性のない 更新の不整合リスク。
対応言語 45+はじめに
単一ファイル内のコピー&ペーストされたコードは、時間の経過とともに増大するメンテナンスの悪夢を生み出します。同じロジックが複数の場所に現れる場合、バグ修正や機能更新はすべての出現箇所に適用されなければなりません。開発者は必然的に重複箇所の一つを見落とし、実行されるコードパスによって同じ操作が異なる結果を生み出すという一貫性のない動作につながります。この一貫性のなさは、重複したロジックが一見すると同じに見え、注意深く比較して初めて違いが明らかになるため、デバッグが困難です。
なぜ重要なのか
バグの伝播: 重複したコードにバグが存在する場合、1箇所で修正してもすべてが修正されるわけではありません。開発者は、他の場所にコピーが存在することに気づかずに最初の発生箇所を修正し、異なる条件下でバグが活動したままになります。
メンテナンス負担: 重複するブロックごとにメンテナンスコストが倍増します。ロジックを変更するには、すべてのコピーを見つけて更新する必要があり、ファイルが増えるにつれて重複の追跡が困難になります。
コード例
❌ 非準拠:
class OrderProcessor {
async processStandardOrder(order) {
if (!order.items || order.items.length === 0) {
throw new Error('Order must have items');
}
const total = order.items.reduce((sum, item) =>
sum + (item.price * item.quantity), 0);
const tax = total * 0.08;
const finalAmount = total + tax;
return { total: finalAmount, tax };
}
async processExpressOrder(order) {
if (!order.items || order.items.length === 0) {
throw new Error('Order must have items');
}
const total = order.items.reduce((sum, item) =>
sum + (item.price * item.quantity), 0);
const tax = total * 0.08;
const expressfee = 15.99;
const finalAmount = total + tax + expressFee;
return { total: finalAmount, tax, expressFee };
}
}誤っている理由: 検証ロジックと合計計算が重複しています。税率が変更されたり、検証の強化が必要になったりした場合、両方のメソッドを更新する必要があります。開発者が一方のメソッドで税計算を更新しても、もう一方を忘れる可能性があり、価格設定の不整合を引き起こします。
✅ 準拠済み:
class OrderProcessor {
validateOrder(order) {
if (!order.items || order.items.length === 0) {
throw new Error('Order must have items');
}
}
calculateSubtotal(items) {
return items.reduce((sum, item) =>
sum + (item.price * item.quantity), 0);
}
calculateTax(amount) {
return amount * 0.08;
}
async processStandardOrder(order) {
this.validateOrder(order);
const subtotal = this.calculateSubtotal(order.items);
const tax = this.calculateTax(subtotal);
return { total: subtotal + tax, tax };
}
async processExpressOrder(order) {
this.validateOrder(order);
const subtotal = this.calculateSubtotal(order.items);
const tax = this.calculateTax(subtotal);
const expressFee = 15.99;
return { total: subtotal + tax + expressFee, tax, expressFee };
}
}これが重要な理由:検証、計算、および税ロジックは単一のメソッドに一元化されています。税率を変更するには、ファイルを検索して重複を探すのではなく、1つのメソッドを変更するだけで済みます。各ヘルパーメソッドは独立してテストでき、両方の注文タイプは、改善やバグ修正を自動的に継承します。
まとめ
ファイル内の重複は、修正が最も容易で、即座にメリットをもたらします。パターンに気づいたらすぐに、重複したロジックをヘルパー関数やメソッドに抽出してください。スリー・オブ・スリーの法則は、コードが3回現れたらリファクタリングの時期であることを示唆しています。重複がファイル全体に広がるのを待たずに、対処しましょう。

