Speaker Deck
Speaker Deck Pro
Sign in
Sign up
for free
「割れ窓」を増やさないためのコード設計 / design not to broke additional window
Kazuki Higashiguchi
October 12, 2019
Technology
13
6.8k
「割れ窓」を増やさないためのコード設計 / 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
hgsgtk
0
930
hgsgtk
2
440
hgsgtk
1
1.4k
hgsgtk
0
420
hgsgtk
2
7.4k
hgsgtk
0
2.1k
hgsgtk
2
4k
hgsgtk
10
5k
hgsgtk
0
850
Other Decks in Technology
See All in Technology
ytaka23
0
430
cygames
1
330
line_developers
PRO
3
2.6k
layerx
1
710
sasakendayo
2
270
minamizaki
0
530
yuhta28
1
200
ocise
0
100
asaju7142501
0
250
ishiayaya
PRO
0
320
yuuturn
1
130
y0hgi
1
370
Featured
See All Featured
geoffreycrofte
18
770
smashingmag
283
47k
jakevdp
774
200k
sferik
609
54k
hursman
106
9.2k
lara
590
61k
hannesfritz
27
930
dougneiner
119
7.8k
pedronauck
652
110k
reverentgeek
168
7.1k
ammeep
656
54k
michaelherold
225
8.4k
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