ルール
排除する 明らかな ファイル内の 重複を排除する。
重複する コード ブロック を増やす メンテナンス
負担 そして を増加させます。 リスク リスク 一貫性のない 更新の不整合リスク。
対応言語 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つのルールとは、コードが3回出てきたら、リファクタリングの時期であるというものです。重複がファイル全体に広がるのを待ってから対処してはいけません。
.avif)
