Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
「割れ窓」を増やさないためのコード設計 / design not to broke addit...
Search
Kazuki Higashiguchi
October 12, 2019
Technology
16
8.5k
「割れ窓」を増やさないためのコード設計 / design not to broke additional window
PHPカンファレンス沖縄 2019で話したレガシーコード改善手法の一つについてです
Kazuki Higashiguchi
October 12, 2019
Tweet
Share
More Decks by Kazuki Higashiguchi
See All by Kazuki Higashiguchi
Practical Monitoring for Knative Serving / KubeCon + CloudNativeCon Japan 2025
hgsgtk
0
61
Cell-Based Architecture Design in AWS
hgsgtk
1
170
インフラコストとセキュリティ課題解決のためのリアーキテクチャリング / srekaigi2025
hgsgtk
3
7.2k
Design of a Stateful system for Robust Deployment and Observability
hgsgtk
0
1.4k
A guide to joining operational work in your new DevOps team
hgsgtk
1
1.5k
HTTP Tunneling in Go
hgsgtk
0
1.5k
ブラウザ自動操作技術の深層へ、直接触れて学ぶ WebDriver と Chrome DevTools Protocol
hgsgtk
3
6.8k
HTTP Server on random available port in Go
hgsgtk
0
1.1k
Agile Testingを夢見たテスト自動化 〜ATDDへの挑戦から始まる 1年間の試行錯誤〜 / dreaming agile testing at basebank
hgsgtk
13
8.2k
Other Decks in Technology
See All in Technology
dbtとAIエージェントを組み合わせて見えたデータ調査の新しい形
10xinc
7
1.8k
JAWS UG AI/ML #32 Amazon BedrockモデルのライフサイクルとEOL対応/How Amazon Bedrock Model Lifecycle Works
quiver
1
750
IBC 2025 動画技術関連レポート / IBC 2025 Report
cyberagentdevelopers
PRO
2
250
AIエージェントによる業務効率化への飽くなき挑戦-AWS上の実開発事例から学んだ効果、現実そしてギャップ-
nasuvitz
5
1.6k
今のコンピュータ、AI にも Web にも 向いていないので 作り直そう!!
piacerex
0
550
[AWS 秋のオブザーバビリティ祭り 2025 〜最新アップデートと生成 AI × オブザーバビリティ〜] Amazon Bedrock AgentCore で実現!お手軽 AI エージェントオブザーバビリティ
0nihajim
1
200
日本のソブリンAIを支えるエヌビディアの生成AIエコシステム
acceleratedmu3n
0
120
LLM APIを2年間本番運用して苦労した話
ivry_presentationmaterials
9
5.5k
NOT A HOTEL SOFTWARE DECK (2025/11/06)
notahotel
0
2.5k
어떤 개발자가 되고 싶은가?
arawn
1
420
AIとの協業で実現!レガシーコードをKotlinらしく生まれ変わらせる実践ガイド
zozotech
PRO
2
310
現場の壁を乗り越えて、 「計装注入」が拓く オブザーバビリティ / Beyond the Field Barriers: Instrumentation Injection and the Future of Observability
aoto
PRO
1
900
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1032
470k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.5k
Scaling GitHub
holman
463
140k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
Side Projects
sachag
455
43k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
Context Engineering - Making Every Token Count
addyosmani
8
330
The World Runs on Bad Software
bkeepers
PRO
72
11k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.8k
Site-Speed That Sticks
csswizardry
13
940
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
Transcript
© - BASE, Inc. 「割れ窓」を増やさないための コード設計 PHPカンファレンス沖縄 2019 . .
- @hgsgtk
© - BASE, Inc. 元のコードが悪いが、 どうにもならん時の対処法 このトークの主題
© - BASE, Inc. この資料のモチベーション 触るのが難しいコードに対して、クリーンにするアイ デアが思い当たらない‧時間がない時がある 結果、「割れ窓」を増やしてしまう この悪循環を少しでも⽌めれる資料が欲しかった
© - BASE, Inc. var_dump($hgsgtk); : @hgsgtk Kazuki Higashiguchi BASE
BANK, Inc. / Dev Division / Tech Lead Backend Engineer
© - BASE, Inc. ++ in Okinawa https://speakerdeck.com/hgsgtk/understanding-design-pattern-from-the-origin 10.11 前夜祭
Session
© - BASE, Inc. 「割れ窓」 https://www.flickr.com/photos/ @N / /in/photolist-auW Ws-oTXBp-
c VR- ax RzL- qb cr-bLPBzr- dRn Q- wFiky- iZXDo- jTAVrB- QE xJ- SEH D- CqBW- yp iy-bWXgEA-JLGb-e YKGa- C z-oZkMNQ-Lybn - TxhfW-Krsrx-KWUdC- g WJx- hgtoK- mAF -bofxKZ-dFe z - skZsb- RfayN- cCqyc - ukpyn- Rc kP- PANKB-cLLynf- QY p -cvvrw - USJLX- t StC- qG mo-dmnEPn- mHdVg- DSjt- bvcuA-G o U- AXv x-e cun- qKS S- WZ Q - XgBHn
© - BASE, Inc. 割れ窓理論 “⻑期間修理されることのない割れた窓が1枚でもあると、ビルの 住⼈に投げやりな感覚 ビルのことなど気にもかけないようにな る感覚が植えつけられていくのです。そして次の窓が割れるので す。⼈々はゴミを撒き散らかすようになります。落書きもされるよ
うになります。そして建物に対する深刻な破壊が起こり始めるので す。ビルはオーナーの修理したいという気持ちとは裏腹に、ごく短 期間で朽ちていき、投げやりな感覚が現実のものとなるのです。” AndrewHunt,DavidThomas. 新装版 達⼈プログラマー 職⼈から名匠への道
© - BASE, Inc. ソフトウェアにおける「割れ窓」 • 悪い設計 • 間違った意思決定 •
質の悪いコード • etc
© - BASE, Inc. 「割れ窓」をどうすべきか “発⾒と同時にすべて修復するのです。もし正しく修 復するだけの⼗分な時間がないのであれば、その旨を わかりやすいところに明⽰しておくのです。” AndrewHunt,DavidThomas. 新装版
達⼈プログラマー 職⼈から名匠への道
© - BASE, Inc. 正しく修復するだけの⼗分 な時間が無いときも プロジェクトの現実(主観)
© - BASE, Inc. 分かる(共感)
© - BASE, Inc. プロジェクトの現実(主観) • 「割れ窓」を治すのは、変更の要件に対して、(短 期的に)何倍ものコストがかかることがあり、それ が許されないスケジュール‧⼯数の状況はある •
(※もちろん⻑期的にはコスト安な判断ではある) • ex. ⾏を超えるController actionメソッドに機 能追加せよ
© - BASE, Inc. “⼤きなクラスに取り組む時の最初の課題は「状況を より悪化させないために、どのように作業すべきか」 ということです。” マイケル‧C‧フェザーズ. レガシーコード改善ガイド /
第20章 このクラスは⼤きすぎて、もうこれ以上⼤きくしたくありません
© - BASE, Inc. 「割れ窓」を増やさない https://www.flickr.com/photos/ @N / /in/photolist-e YKGa-
C z-oZkMNQ-Lybn - TxhfW-Krsrx-KWUdC- g WJx- hgtoK- mAF -bofxKZ- dFe z - skZsb- RfayN-cCqyc - ukpyn- Rc kP- PANKB-cLLynf- QY p -cvvrw - USJLX- t StC- qG mo-dmnEPn- mHdVg- DSjt- bvcuA-G o U- AXv x- e cun- qKS S- WZ Q - XgBHn-aj AMb-a i HK- EbT G-cXFXr-a EQN - Hyyui- sYY-aoGAV-ba y- ru cf- oimEY- ehwiA-bCds - q cTv- TnX X- bgS b
© - BASE, Inc. スプラウトクラス スプラウトメソッド 「割れ窓」を増やさないためのキーワード
© - BASE, Inc. スプラウトメソッド 追加する必要がありシステム要件を、まったく新しい コードで実現できる場合に、そのコードを新しいメ ソッドとして記述 マイケル‧C‧フェザーズ. レガシーコード改善ガイド
/ 第6章 時間がないのに変更しなければなりません
© - BASE, Inc. スプラウトクラス 変更に必要な機能を別のクラスとして切り出し、その クラスを元のクラスから利⽤する マイケル‧C‧フェザーズ. レガシーコード改善ガイド /
第6章 時間がないのに変更しなければなりません
例題: 注⽂処理のaction 注⽂を処理するcontroller action ビジネスロジック if, elseif, elseif, elseifの決 済処理
(※ このコードはフィクションです) © - BASE, Inc.
© - BASE, Inc. 例題: 注⽂処理のactionに機能追加 • 「決済バリエーションを追加してほしい」 うっ‧‧‧
© - BASE, Inc. 例題: 注⽂処理のactionに機能追加 • 「決済バリエーションを追加してほしい」 そもそも根本的に元のコードをどう にかしたほうがいいんだよな
だが、時間と⼯数‧‧‧
© - BASE, Inc. actionに同じように処理コードを追加する? 既存コードと同じ感じで えいっ!
© - BASE, Inc. 新しい「割れ窓」 https://www.flickr.com/photos/collecting__memories/ /in/photolist-cvvrw - USJLX- t
StC- qG mo-dmnEPn- mHdVg- DSjt- bvcuA-G o U- AXv x- e cun- qKS S- WZ Q - XgBHn-aj AMb-a i HK- EbT G-cXFXr-a EQN - Hyyui- sYY-aoGAV-ba y- ru cf- oimEY- ehwiA-bCds - q cTv- TnX X- bgS b-e Qyo- f QoXx- QrxXV-bsB Ev- JX - Jh Pb-bsP a- q KZy- yfgHE-psNm F- C UrY- PVM y- VbVC- eUKyG -agvdKZ-cabLqy- dSWpf-dKx s-eKMwkZ- Y Loh
© - BASE, Inc. 新しい割れ窓の発⽣ • ⼤きな責務のactionメソッドに更に責務が追加され てしまう • わかりやすい副作⽤として、このactionメソッドを
テストしたい場合、テストで保証する責務が増える
© - BASE, Inc. じゃあprivateで切っておくので..? 処理を切り出しました!
© - BASE, Inc. 新しい「割れ窓」 https://www.flickr.com/photos/ @N / /in/photolist- fXzD
- KRVq -rSWchF- WzxKJ-oJnsR - CayV - RZjJ - Q xdG-kAZGPE- awCpf- JCKuR- Bea e- pjQDa - tEqDC-U VEwC-WrkdN- sYu -dfAQTU- b v c-dGNTra- Svq r- qJWZy-e CYd -bXhZyc- rthmX- RSC k- D aoH- mvRU - Hobwx- N Az -da w-bnfYwD- NAmTt-b e nZ- fwvn -a udTe- qeNq-pcMo m- cdUDF- DWKfV- Lar m-bD qze-YueSkE-AuXQ M-ax Hp-eydWNi- pzWf-oX i- DyM Z-aAq hQ
© - BASE, Inc. 新しい割れ窓の発⽣ • privateメソッドは変数スコープが関数スコープに閉 じ込められるなど、まだマシな選択肢ではある • ただ、privateメソッドはpublicメソッドの責務を
実現する、責務は当該actionにあるまま • (割れ窓を直していく、既存コードを切り出していくには、⼀歩⽬として有効 ではある)
© - BASE, Inc. 「割れ窓」を増やさない https://www.flickr.com/photos/ @N / /in/photolist-e YKGa-
C z-oZkMNQ-Lybn - TxhfW-Krsrx-KWUdC- g WJx- hgtoK- mAF -bofxKZ- dFe z - skZsb- RfayN-cCqyc - ukpyn- Rc kP- PANKB-cLLynf- QY p -cvvrw - USJLX- t StC- qG mo-dmnEPn- mHdVg- DSjt- bvcuA-G o U- AXv x- e cun- qKS S- WZ Q - XgBHn-aj AMb-a i HK- EbT G-cXFXr-a EQN - Hyyui- sYY-aoGAV-ba y- ru cf- oimEY- ehwiA-bCds - q cTv- TnX X- bgS b
© - BASE, Inc. 例: スプラウトクラスを活⽤する 新しい機能は新しいクラスで表現し、
© - BASE, Inc. 例: スプラウトクラスを活⽤する 元コードはクラスで作成したメソッドを呼ぶ
© - BASE, Inc. Pros スプラウトメソッド‧クラス • 古いコードと新しいコードを明確に区別できる • ⇒
既存コードの枠内にとらわれずコード設計が可能 • 追加する機能はテスト容易に設計可能 • ⇒ テスト済みのコードを追加できる
© - BASE, Inc. Cons スプラウトメソッド‧クラス • 元のメソッドは保護しても改善してもいない • ⇒
割れ窓は直っていないので、追ってリファクタリ ングは必要
© - BASE, Inc. ⽤法⽤量にご注意 • 最初で使うべきベストプラクティスではない • 以下を検討した上で⼼が折れそうになったら使いま しょう
• テストがあるか? • テストがないならテストが書けるか? • リファクタリングできるか?
© - BASE, Inc. The Boy Scout Rule “Always check
a module in cleaner than when you checked it out” by ROBERT C. MARTIN (UNCLE BOB) https://learning.oreilly.com/library/view/ -things-every/ /ch .html “ Things Every Programmer Should Know” Chapter . The Boy Scout Rule
© - BASE, Inc. おまとめ • 割れ窓理論 • スプラウトメソッド/クラスで、古いコード‧新しい コードを区別する
© - BASE, Inc. <?php