PHPカンファレンス沖縄 2019で話したレガシーコード改善手法の一つについてです
© - BASE, Inc.「割れ窓」を増やさないためのコード設計PHPカンファレンス沖縄 2019. . - @hgsgtk
View Slide
© - BASE, Inc.元のコードが悪いが、どうにもならん時の対処法このトークの主題
© - BASE, Inc.この資料のモチベーション触るのが難しいコードに対して、クリーンにするアイデアが思い当たらない‧時間がない時がある結果、「割れ窓」を増やしてしまうこの悪循環を少しでも⽌めれる資料が欲しかった
© - BASE, Inc.var_dump($hgsgtk);: @hgsgtkKazuki HigashiguchiBASE BANK, Inc. / Dev Division / Tech LeadBackend Engineer
© - BASE, Inc.++ in Okinawahttps://speakerdeck.com/hgsgtk/understanding-design-pattern-from-the-origin10.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注⽂を処理するcontrolleractionビジネスロジック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.例: スプラウトクラスを活⽤する新しい機能は新しいクラスで表現し、
© - BASE, Inc.例: スプラウトクラスを活⽤する元コードはクラスで作成したメソッドを呼ぶ
© - BASE, Inc.Pros スプラウトメソッド‧クラス• 古いコードと新しいコードを明確に区別できる• ⇒ 既存コードの枠内にとらわれずコード設計が可能• 追加する機能はテスト容易に設計可能• ⇒ テスト済みのコードを追加できる
© - BASE, Inc.Cons スプラウトメソッド‧クラス• 元のメソッドは保護しても改善してもいない• ⇒ 割れ窓は直っていないので、追ってリファクタリングは必要
© - BASE, Inc.⽤法⽤量にご注意• 最初で使うべきベストプラクティスではない• 以下を検討した上で⼼が折れそうになったら使いましょう• テストがあるか?• テストがないならテストが書けるか?• リファクタリングできるか?
© - BASE, Inc.The Boy Scout Rule“Always check a module in cleaner than whenyou 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.