Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
「割れ窓」を増やさないためのコード設計 / design not to broke addit...
Search
Kazuki Higashiguchi
October 12, 2019
Technology
8.7k
16
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
「割れ窓」を増やさないためのコード設計 / design not to broke additional window
PHPカンファレンス沖縄 2019で話したレガシーコード改善手法の一つについてです
Kazuki Higashiguchi
October 12, 2019
More Decks by Kazuki Higashiguchi
See All by Kazuki Higashiguchi
Practical Monitoring for Knative Serving / KubeCon + CloudNativeCon Japan 2025
hgsgtk
0
160
Cell-Based Architecture Design in AWS
hgsgtk
1
270
インフラコストとセキュリティ課題解決のためのリアーキテクチャリング / srekaigi2025
hgsgtk
3
8.8k
Design of a Stateful system for Robust Deployment and Observability
hgsgtk
0
1.6k
A guide to joining operational work in your new DevOps team
hgsgtk
1
1.7k
HTTP Tunneling in Go
hgsgtk
0
1.7k
ブラウザ自動操作技術の深層へ、直接触れて学ぶ WebDriver と Chrome DevTools Protocol
hgsgtk
3
7.1k
HTTP Server on random available port in Go
hgsgtk
0
1.2k
Agile Testingを夢見たテスト自動化 〜ATDDへの挑戦から始まる 1年間の試行錯誤〜 / dreaming agile testing at basebank
hgsgtk
13
8.6k
Other Decks in Technology
See All in Technology
AIアプリを使い分けるための共通ツール基盤を考えてみる#devio2026
osawa
0
260
オブザーバビリティを高める AI エージェント体験を考える / Designing AI Agent Experiences That Enhance Observability
aoto
PRO
2
310
FactoryBotアンチパターン / factory_bot anti-patterns
toshimaru
0
140
FinTech 1-2 : Overview of FinTech
ks91
PRO
0
150
AI 時代の Azure エンジニアリング ~ 私たちは何を磨き、何を任せるのか ~
chack411
1
470
インバスケット試験対策アプリを 作って見えたAIエージェント構築 ナレッジ2選
shichijoyuhi
1
130
Google Cloud Next Tokyo 26登壇時のスクリプト
recruitengineers
PRO
0
200
1万名の社員が使う認証基盤で どう信頼性を担保するか?
kairim0
0
210
データ品質を壊しながらSnowflakeのAIに分析させてみた
kawanago
0
510
20260930_Gemma4_Hands-on
tsho
0
230
[2026 Oracle Technical Deep Dive] AI時代のアプリケーションを支えるCloud NativeとJava EEモダナイゼーション (2026年9月17日開催)
oracle4engineer
PRO
0
120
並行性の問題を防げ!実践トランザクション入門
occhi
0
270
Featured
See All Featured
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
320
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
460
Claude Code のすすめ
schroneko
67
230k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Designing Powerful Visuals for Engaging Learning
tmiket
1
590
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
350
Mind Mapping
helmedeiros
1
390
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
560
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