Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
© - BASE, Inc. 「割れ窓」を増やさないための コード設計 PHPカンファレンス沖縄 2019 . . - @hgsgtk
Slide 2
Slide 2 text
© - BASE, Inc. 元のコードが悪いが、 どうにもならん時の対処法 このトークの主題
Slide 3
Slide 3 text
© - BASE, Inc. この資料のモチベーション 触るのが難しいコードに対して、クリーンにするアイ デアが思い当たらない‧時間がない時がある 結果、「割れ窓」を増やしてしまう この悪循環を少しでも⽌めれる資料が欲しかった
Slide 4
Slide 4 text
© - BASE, Inc. var_dump($hgsgtk); : @hgsgtk Kazuki Higashiguchi BASE BANK, Inc. / Dev Division / Tech Lead Backend Engineer
Slide 5
Slide 5 text
© - BASE, Inc. ++ in Okinawa https://speakerdeck.com/hgsgtk/understanding-design-pattern-from-the-origin 10.11 前夜祭 Session
Slide 6
Slide 6 text
© - 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
Slide 7
Slide 7 text
© - BASE, Inc. 割れ窓理論 “⻑期間修理されることのない割れた窓が1枚でもあると、ビルの 住⼈に投げやりな感覚 ビルのことなど気にもかけないようにな る感覚が植えつけられていくのです。そして次の窓が割れるので す。⼈々はゴミを撒き散らかすようになります。落書きもされるよ うになります。そして建物に対する深刻な破壊が起こり始めるので す。ビルはオーナーの修理したいという気持ちとは裏腹に、ごく短 期間で朽ちていき、投げやりな感覚が現実のものとなるのです。” AndrewHunt,DavidThomas. 新装版 達⼈プログラマー 職⼈から名匠への道
Slide 8
Slide 8 text
© - BASE, Inc. ソフトウェアにおける「割れ窓」 • 悪い設計 • 間違った意思決定 • 質の悪いコード • etc
Slide 9
Slide 9 text
© - BASE, Inc. 「割れ窓」をどうすべきか “発⾒と同時にすべて修復するのです。もし正しく修 復するだけの⼗分な時間がないのであれば、その旨を わかりやすいところに明⽰しておくのです。” AndrewHunt,DavidThomas. 新装版 達⼈プログラマー 職⼈から名匠への道
Slide 10
Slide 10 text
© - BASE, Inc. 正しく修復するだけの⼗分 な時間が無いときも プロジェクトの現実(主観)
Slide 11
Slide 11 text
© - BASE, Inc. 分かる(共感)
Slide 12
Slide 12 text
© - BASE, Inc. プロジェクトの現実(主観) • 「割れ窓」を治すのは、変更の要件に対して、(短 期的に)何倍ものコストがかかることがあり、それ が許されないスケジュール‧⼯数の状況はある • (※もちろん⻑期的にはコスト安な判断ではある) • ex. ⾏を超えるController actionメソッドに機 能追加せよ
Slide 13
Slide 13 text
© - BASE, Inc. “⼤きなクラスに取り組む時の最初の課題は「状況を より悪化させないために、どのように作業すべきか」 ということです。” マイケル‧C‧フェザーズ. レガシーコード改善ガイド / 第20章 このクラスは⼤きすぎて、もうこれ以上⼤きくしたくありません
Slide 14
Slide 14 text
© - 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
Slide 15
Slide 15 text
© - BASE, Inc. スプラウトクラス スプラウトメソッド 「割れ窓」を増やさないためのキーワード
Slide 16
Slide 16 text
© - BASE, Inc. スプラウトメソッド 追加する必要がありシステム要件を、まったく新しい コードで実現できる場合に、そのコードを新しいメ ソッドとして記述 マイケル‧C‧フェザーズ. レガシーコード改善ガイド / 第6章 時間がないのに変更しなければなりません
Slide 17
Slide 17 text
© - BASE, Inc. スプラウトクラス 変更に必要な機能を別のクラスとして切り出し、その クラスを元のクラスから利⽤する マイケル‧C‧フェザーズ. レガシーコード改善ガイド / 第6章 時間がないのに変更しなければなりません
Slide 18
Slide 18 text
例題: 注⽂処理のaction 注⽂を処理するcontroller action ビジネスロジック if, elseif, elseif, elseifの決 済処理 (※ このコードはフィクションです) © - BASE, Inc.
Slide 19
Slide 19 text
© - BASE, Inc. 例題: 注⽂処理のactionに機能追加 • 「決済バリエーションを追加してほしい」 うっ‧‧‧
Slide 20
Slide 20 text
© - BASE, Inc. 例題: 注⽂処理のactionに機能追加 • 「決済バリエーションを追加してほしい」 そもそも根本的に元のコードをどう にかしたほうがいいんだよな だが、時間と⼯数‧‧‧
Slide 21
Slide 21 text
© - BASE, Inc. actionに同じように処理コードを追加する? 既存コードと同じ感じで えいっ!
Slide 22
Slide 22 text
© - 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
Slide 23
Slide 23 text
© - BASE, Inc. 新しい割れ窓の発⽣ • ⼤きな責務のactionメソッドに更に責務が追加され てしまう • わかりやすい副作⽤として、このactionメソッドを テストしたい場合、テストで保証する責務が増える
Slide 24
Slide 24 text
© - BASE, Inc. じゃあprivateで切っておくので..? 処理を切り出しました!
Slide 25
Slide 25 text
© - 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
Slide 26
Slide 26 text
© - BASE, Inc. 新しい割れ窓の発⽣ • privateメソッドは変数スコープが関数スコープに閉 じ込められるなど、まだマシな選択肢ではある • ただ、privateメソッドはpublicメソッドの責務を 実現する、責務は当該actionにあるまま • (割れ窓を直していく、既存コードを切り出していくには、⼀歩⽬として有効 ではある)
Slide 27
Slide 27 text
© - 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
Slide 28
Slide 28 text
© - BASE, Inc. 例: スプラウトクラスを活⽤する 新しい機能は新しいクラスで表現し、
Slide 29
Slide 29 text
© - BASE, Inc. 例: スプラウトクラスを活⽤する 元コードはクラスで作成したメソッドを呼ぶ
Slide 30
Slide 30 text
© - BASE, Inc. Pros スプラウトメソッド‧クラス • 古いコードと新しいコードを明確に区別できる • ⇒ 既存コードの枠内にとらわれずコード設計が可能 • 追加する機能はテスト容易に設計可能 • ⇒ テスト済みのコードを追加できる
Slide 31
Slide 31 text
© - BASE, Inc. Cons スプラウトメソッド‧クラス • 元のメソッドは保護しても改善してもいない • ⇒ 割れ窓は直っていないので、追ってリファクタリ ングは必要
Slide 32
Slide 32 text
© - BASE, Inc. ⽤法⽤量にご注意 • 最初で使うべきベストプラクティスではない • 以下を検討した上で⼼が折れそうになったら使いま しょう • テストがあるか? • テストがないならテストが書けるか? • リファクタリングできるか?
Slide 33
Slide 33 text
© - 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
Slide 34
Slide 34 text
© - BASE, Inc. おまとめ • 割れ窓理論 • スプラウトメソッド/クラスで、古いコード‧新しい コードを区別する
Slide 35
Slide 35 text
© - BASE, Inc.