Upgrade to Pro — share decks privately, control downloads, hide ads and more …

仕様変更に耐えるための"今の"DRY原則を考える / Rethinking the "Don'...

Maki Hayashi
February 21, 2025

仕様変更に耐えるための"今の"DRY原則を考える / Rethinking the "Don't repeat yourself" for resilience to specification changes

2025/02/22に行われたPHPカンファレンス名古屋2025の発表資料です。

---

DRY(Don't Repeat Yourself)原則はコードの重複を減らし、保守性を高める効果的な手法ですが、適用の仕方によっては仕様変更に対応できなくなることがあります。
私が直面したのは、二つの似た処理を一つのメソッドに統合し、フラグで細かい違いを切り替えるコードでした。しかし、片方の処理を変更すると、もう片方にも影響が出てメソッドが複雑化する…これ本当にDRYなん?と思いました。

このトークでは、当時はDRYだったものが、時間とともに保守性を損ない、結果的にDRYではなくなったケースについて紹介します。
何を共通化し、何を分離すべきかを考え直し、どのようにリファクタリングを行ったかについて具体的な事例を交えてお話します!

「当時はこうでよかったが、今ここに大変更を加えたい」と感じている方や、似たような体験をした方にとって、私の対処方法が参考になれば嬉しいです!

Maki Hayashi

February 21, 2025
Tweet

More Decks by Maki Hayashi

Other Decks in Programming

Transcript

  1. 自社データをもとに外部サービス用のデータを作る 7 入稿データ ユニークコード ‘submission0222’ … 配信 サービスA データ 配信

    サービスB データ サービスA内 ユニークコード ‘phone0222’ サービスB内 ユニークコード ‘tv0222’
  2. [やりたいこと] 配信サービスデータを削除する 8 入稿データ ユニークコード ‘submission0222’ … 配信 サービスA データ

    配信 サービスB データ サービスA内 ユニークコード ‘phone0222’ サービスB内 ユニークコード ‘tv0222’
  3. 10 入稿データ一覧画面  ぺちなご占い   2/24〜3/2 おひつじ座 入稿データ一覧   2/24〜3/2 おうし座 ☑ ☑   2/24〜3/2 ふたご座 □

    配信データ削除   2/24〜3/2 おうし座 □ 削除対象の配信サービス ✕   サービスA   サービスB ☑ □ 削除 外部サービスを選択する ことで入稿データに紐づく 配信データが削除できる 配信サービスデータを削除できる画面は2つ
  4. Aサービスが2つのコードでユニークになった 18 入稿データ ユニークコード ‘submission0222’ … 配信 サービスA データ 配信

    サービスB データ Aサービス内 ユニークコード ‘phone’ ‘0222’ Bサービス内 ユニークコード ‘tv0222’ 2つ掛け合わせて ユニーク
  5. 19 配信サービスデータ一覧画面  ぺちなご占い   2/24〜3/2 ♈おひつじ座 配信サービスAデータ一覧   2/24〜3/2 ♉おうし座 ☑ ☑   2/24〜3/2 ♊ふたご座 □

    削除   2/24〜3/2 ♉おうし座 □ 今回修正したい画面の処理 配信サービスデータ一覧 画面からの削除処理の 修正が必要になった
  6. 32 前処理 削除リスト(配列) を作る 削除処理 (たぶん)当時はDRYだと思っていた ▼ 配信サービスデータ一覧画面 ▼ 入稿データ一覧画面

    削除リスト(配列) を作る 削除処理 同じようなコードだし 共通化するとよさそう 当時の開発者
  7. 50 ユニークコードとする カラム名が プロパティで定義 Factoryパターンを用いたガチガチ継承クラス → 対応サービスの拡充を楽にするため ▼ 入稿データ ▼

    配信サービスAデータ 実際に何年かは変更に強かった “今の”変わらない部分と変わる部分を明確にする
  8. ユーザーフローが異なる場合はメソッドも分ける 55 改修前の実装はたまたま同じであっただけ 入稿データ一覧画面 画 面 挙 動 配信サービスデータ 一覧画面

    ユーザーが選択した情報を もとに紐づく情報を検索 して削除 ユーザーが選択した情報を 削除 概念は異なる