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

なぜ「共通化」を考え、失敗を繰り返すのか

 なぜ「共通化」を考え、失敗を繰り返すのか

PHP Conference 2025 6/28 Track5

Avatar for Rinchoku

Rinchoku

June 28, 2025
Tweet

More Decks by Rinchoku

Other Decks in Programming

Transcript

  1. 自己紹介 名前:Rinchoku 所属:7月に転職 X:@stupid_owl 趣味:宝石鑑賞、ハンドメイド、ジョギング(new) その他 • スタッフ活動 ◦ SRE

    NEXT 2025 7/11, 12 ◦ オブザーバビリティカンファレンス TOKYO 10/27 ◦ SRE Kaigi 2026コアスタッフ 1/31 • 登壇 ◦ PHP Conference 2024 ◦ PHPer Kaigi 2025 4
  2. 「共通化」とは Google検索での「共通化」での検索上位(2025/6/16) 1. 共通化とは? わかりやすく解説 - Weblio辞書 2. 共通化(きょうつうか) とは?

    意味・読み方・使い方 - goo辞書 3. 共通化と標準化を混同せずに使い分けること - IT is my life 4. 標準化と共通化 5. 令和6年度 共通化の対象候補案について 6. コードの共通化による弊害を実感した話 7. 部品共通化 | ビジネス用語集 8. どうしてあなたの共通化は間違っているのか:第1章「単一責任 ... 9. 【第5回】 組織やルールの改革(標準化、共通化) | コラム 10. 共通化(キョウツウカ)とは? 意味や使い方 9
  3. 「共通化」とは Google検索での「共通化」での検索上位(2025/6/16) 1. 共通化とは? わかりやすく解説 - Weblio辞書 2. 共通化(きょうつうか) とは?

    意味・読み方・使い方 - goo辞書 3. 共通化と標準化を混同せずに使い分けること - IT is my life 4. 標準化と共通化 5. 令和6年度 共通化の対象候補案について 6. コードの共通化による弊害を実感した話 7. 部品共通化 | ビジネス用語集 8. どうしてあなたの共通化は間違っているのか:第 1章「単一責任 ... 9. 【第5回】 組織やルールの改革(標準化、共通化) | コラム 10. 共通化(キョウツウカ)とは? 意味や使い方 10
  4. 「共通化」とは Google検索での「共通化 プログラミング」での検索上位(2025/6/16) 1. コードの共通化について語るときに僕の語ること 2. コードの共通化について数名に聞いてみた #プログラミング 3. 共通化すれば良いとは限らない

    - Object.create(null) 4. コードを共通化するな 5. 共通化について.md 6. 共通化と標準化を混同せずに使い分けること - IT is my life 7. コードの抽象化および共通化の重要性と実践|under_the_sky 8. 9年開発を牽引して見えてきた、共通化すべきものと個別で ... 9. コピペコードと共通化とどちらがましか? 10. 【ソースコードの達人】共通化すればいいというものじゃない!な ... 11
  5. 「共通化」とは Google検索での「共通化 プログラミング」での検索上位(2025/6/16) 1. コードの共通化について語るときに僕の語ること 2. コードの共通化について数名に聞いてみた #プログラミング 3. 共通化すれば良いとは限らない

    - Object.create(null) 4. コードを共通化するな 5. 共通化について.md 6. 共通化と標準化を混同せずに使い分けること - IT is my life 7. コードの抽象化および共通化の重要性と実践|under_the_sky 8. 9年開発を牽引して見えてきた、共通化すべきものと個別で ... 9. コピペコードと共通化とどちらがましか ? 10. 【ソースコードの達人】共通化すればいいというものじゃない!な ... 12
  6. 共通化の失敗例 • ここからは失敗例 ◦ 似たコード部分をまとめただけ ◦ 既存のクラスに集約 ◦ 引数のArray /

    Object ◦ やって終わり • 実際に遭遇した、やってしまったものです ※画面サイズの関係で、コードの改行等を調整しています 15
  7. 共通化の失敗例:似たコード部分をまとめただけ import { InputHTMLAttributes } from 'react'; interface Props extends

    InputHTMLAttributes<HTMLInputElement> {label: string;} const Input = ({ label, ...inputHTMLAttributes }: Props) => { return (<label> {['checkbox', 'radio'].includes(inputHTMLAttributes.type ?? 'text') ? ( <><input {...inputHTMLAttributes} /><span>{label}</span></> ) : ( <><span>{label}</span><input {...inputHTMLAttributes} /></> )} </label>);}; export default Input; 16
  8. 共通化の失敗例:似たコード部分をまとめただけ import { InputHTMLAttributes } from 'react'; interface Props extends

    InputHTMLAttributes<HTMLInputElement> {label: string;} const Input = ({ label, ...inputHTMLAttributes }: Props) => { return (<label> {['checkbox', 'radio'].includes(inputHTMLAttributes.type ?? 'text') ? ( <><input {...inputHTMLAttributes} /><span>{label}</span></> ) : ( <><span>{label}</span><input {...inputHTMLAttributes} /></> )} </label>);}; export default Input; 17
  9. 共通化の失敗例:引数の Array / Object public function getSummary(array $rawData) { $formatted

    = $this->formatted($rawData); $aggregated = $this->aggregate($formatted); return $aggregated; } 20
  10. 共通化の失敗例:引数の Array / Object public function formatted(array $raw): array {

    $formatted = []; foreach ($raw as $item) { $formatted[$item['userId']][$item['time']][] = [ 'speed' => $item['speed'] / 10, 'calorie' => $item['colorie'], 'time' => $item['time'], ]; } return $formatted; } 21
  11. 共通化の失敗例:引数の Array / Object public function aggregate(array $raw): array {

    $aggregated = []; foreach ($raw as $userItems) { foreach ($userItems as $timeItems) { foreach ($timeItems as $item) { $aggregated['speed'] += $item['speed']; $aggregated['calorie'] += $item['calorie']; } } } return $aggregated; } 22
  12. 共通化の失敗例:引数の Array / Object public function formatted(array $raw): array {

    $formatted = []; foreach ($raw as $item) { $formatted[$item['userId']][$item['time']][] = [ 'speed' => $item['speed'] / 10, 'calorie' => $item['colorie'], 'time' => $item['time'], ]; } return $formatted; } 23
  13. 共通化の失敗例:引数の Array / Object 発生理由 • primitiveな型で表現することに慣れている環境 • とりあえず動くコードを書いてみたときに起きやすい •

    「色んなデータを扱う=Array/Objectで柔軟に対応」という考え • Entity/ValueObjectの概念が浸透していない 25
  14. どの程度の影響があるか見ているか? 個人 チーム グループ 会社全体 下に行くほど • 抽象度の増加 • 複雑性の増加

    • 関係者の増加 • 求められる機能の増加 • 変更難度の増加 • 求められるリーダーシップ能力の増加 • etc…
  15. トレードオフを考慮しているか? • 方法はなるべく3つ以上考えるのがベスト ◦ メリット、デメリット、期待効果、難易度などをリストアップ ◦ 最初の方法に頭が凝り固まって、よりより方法に気づかないのを防ぐ ▪ 一つぐらいは一風変わった方法を考えるのもよい •

    最低限「工数」と「期待効果」で考える ◦ 5人日かかって、年10分程度の削減工数だと割に合わない ◦ 場合によっては、少し泥臭いことを許容する方がメリットが大きくなることもあ る • 「共通化」によって、「変更容易性が下がる」こともある 46