メインコンテンツまでスキップ

重複する処理

説明(どんな問題か)

どんな状態か?

  • 同じような処理が複数の場所でコピペされている
  • 「ちょっとだけ違う処理」が、ベースから複製されて手動で書き換えられている
  • 読みやすく見えても、保守性・一貫性が失われている

なぜ問題か?

  • 修正があったとき、すべてのコピーを見つけて直す必要がある
  • 一部に修正漏れが発生し、不具合の原因になる
  • テスト・レビューの手間が増え、コードの信頼性が低下

アンチパターンのコード例

class PdfExporter {
export(data: string) {
console.log("開始ログ");
console.log(`PDF出力: ${data}`);
console.log("完了ログ");
}
}

class CsvExporter {
export(data: string) {
console.log("開始ログ");
console.log(`CSV出力: ${data}`);
console.log("完了ログ");
}
}

class XmlExporter {
export(data: string) {
console.log("開始ログ");
console.log(`XML出力: ${data}`);
console.log("完了ログ");
}
}

問題点:

  • 各 Exporter が開始・終了ログを共通して持っている
  • 出力部分だけが違うのに、同じ処理が何度も書かれている
  • ログの変更やフォーマット修正などがすべての Exporter に波及

パターン別のリファクタリング

対応可能なデザインパターン例

パターン概要主な解決アプローチ
Template Method処理の流れを共通化し、差分だけをサブクラスで定義「処理の型」を 1 ヶ所にまとめて再利用
Strategy差分処理を外から注入動的に処理を切り替え可能な構造に
Decorator機能をラップして追加・差し替えコア機能に装飾的な処理を重ねて再利用
Visitor処理とデータ構造を分離処理ごとに振る舞いを外に出して複数形式に対応
Prototypeインスタンスをテンプレートから複製毎回ベタ書きする代わりに、複製して差分だけ編集