Upgrade to Pro — share decks privately, control downloads, hide ads and more …

「割れ窓」を増やさないためのコード設計 / design not to broke additional window

「割れ窓」を増やさないためのコード設計 / design not to broke additional window

PHPカンファレンス沖縄 2019で話したレガシーコード改善手法の一つについてです

Kazuki Higashiguchi
PRO

October 12, 2019
Tweet

More Decks by Kazuki Higashiguchi

Other Decks in Technology

Transcript

  1. © - BASE, Inc.
    「割れ窓」を増やさないための
    コード設計
    PHPカンファレンス沖縄 2019
    . . - @hgsgtk

    View Slide

  2. © - BASE, Inc.
    元のコードが悪いが、
    どうにもならん時の対処法
    このトークの主題

    View Slide

  3. © - BASE, Inc.
    この資料のモチベーション
    触るのが難しいコードに対して、クリーンにするアイ
    デアが思い当たらない‧時間がない時がある
    結果、「割れ窓」を増やしてしまう
    この悪循環を少しでも⽌めれる資料が欲しかった

    View Slide

  4. © - BASE, Inc.
    var_dump($hgsgtk);
    : @hgsgtk
    Kazuki Higashiguchi
    BASE BANK, Inc. / Dev Division / Tech Lead
    Backend Engineer

    View Slide

  5. © - BASE, Inc.
    ++ in Okinawa
    https://speakerdeck.com/hgsgtk/understanding-design-pattern-from-the-origin
    10.11 前夜祭 Session

    View Slide

  6. © - 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

    View Slide

  7. © - BASE, Inc.
    割れ窓理論
    “⻑期間修理されることのない割れた窓が1枚でもあると、ビルの
    住⼈に投げやりな感覚 ビルのことなど気にもかけないようにな
    る感覚が植えつけられていくのです。そして次の窓が割れるので
    す。⼈々はゴミを撒き散らかすようになります。落書きもされるよ
    うになります。そして建物に対する深刻な破壊が起こり始めるので
    す。ビルはオーナーの修理したいという気持ちとは裏腹に、ごく短
    期間で朽ちていき、投げやりな感覚が現実のものとなるのです。”
    AndrewHunt,DavidThomas. 新装版 達⼈プログラマー 職⼈から名匠への道

    View Slide

  8. © - BASE, Inc.
    ソフトウェアにおける「割れ窓」
    • 悪い設計
    • 間違った意思決定
    • 質の悪いコード
    • etc

    View Slide

  9. © - BASE, Inc.
    「割れ窓」をどうすべきか
    “発⾒と同時にすべて修復するのです。もし正しく修
    復するだけの⼗分な時間がないのであれば、その旨を
    わかりやすいところに明⽰しておくのです。”
    AndrewHunt,DavidThomas. 新装版 達⼈プログラマー 職⼈から名匠への道

    View Slide

  10. © - BASE, Inc.
    正しく修復するだけの⼗分
    な時間が無いときも
    プロジェクトの現実(主観)

    View Slide

  11. © - BASE, Inc.
    分かる(共感)

    View Slide

  12. © - BASE, Inc.
    プロジェクトの現実(主観)
    • 「割れ窓」を治すのは、変更の要件に対して、(短
    期的に)何倍ものコストがかかることがあり、それ
    が許されないスケジュール‧⼯数の状況はある
    • (※もちろん⻑期的にはコスト安な判断ではある)
    • ex. ⾏を超えるController actionメソッドに機
    能追加せよ

    View Slide

  13. © - BASE, Inc.
    “⼤きなクラスに取り組む時の最初の課題は「状況を
    より悪化させないために、どのように作業すべきか」
    ということです。”
    マイケル‧C‧フェザーズ. レガシーコード改善ガイド / 第20章 このクラスは⼤きすぎて、もうこれ以上⼤きくしたくありません

    View Slide

  14. © - 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

    View Slide

  15. © - BASE, Inc.
    スプラウトクラス
    スプラウトメソッド
    「割れ窓」を増やさないためのキーワード

    View Slide

  16. © - BASE, Inc.
    スプラウトメソッド
    追加する必要がありシステム要件を、まったく新しい
    コードで実現できる場合に、そのコードを新しいメ
    ソッドとして記述
    マイケル‧C‧フェザーズ. レガシーコード改善ガイド / 第6章 時間がないのに変更しなければなりません

    View Slide

  17. © - BASE, Inc.
    スプラウトクラス
    変更に必要な機能を別のクラスとして切り出し、その
    クラスを元のクラスから利⽤する
    マイケル‧C‧フェザーズ. レガシーコード改善ガイド / 第6章 時間がないのに変更しなければなりません

    View Slide

  18. 例題: 注⽂処理のaction
    注⽂を処理するcontroller
    action
    ビジネスロジック
    if, elseif, elseif, elseifの決
    済処理
    (※ このコードはフィクションです)
    © - BASE, Inc.

    View Slide

  19. © - BASE, Inc.
    例題: 注⽂処理のactionに機能追加
    • 「決済バリエーションを追加してほしい」
    うっ‧‧‧

    View Slide

  20. © - BASE, Inc.
    例題: 注⽂処理のactionに機能追加
    • 「決済バリエーションを追加してほしい」
    そもそも根本的に元のコードをどう
    にかしたほうがいいんだよな
    だが、時間と⼯数‧‧‧

    View Slide

  21. © - BASE, Inc.
    actionに同じように処理コードを追加する?
    既存コードと同じ感じで
    えいっ!

    View Slide

  22. © - 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

    View Slide

  23. © - BASE, Inc.
    新しい割れ窓の発⽣
    • ⼤きな責務のactionメソッドに更に責務が追加され
    てしまう
    • わかりやすい副作⽤として、このactionメソッドを
    テストしたい場合、テストで保証する責務が増える

    View Slide

  24. © - BASE, Inc.
    じゃあprivateで切っておくので..?
    処理を切り出しました!

    View Slide

  25. © - 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

    View Slide

  26. © - BASE, Inc.
    新しい割れ窓の発⽣
    • privateメソッドは変数スコープが関数スコープに閉
    じ込められるなど、まだマシな選択肢ではある
    • ただ、privateメソッドはpublicメソッドの責務を
    実現する、責務は当該actionにあるまま
    • (割れ窓を直していく、既存コードを切り出していくには、⼀歩⽬として有効
    ではある)

    View Slide

  27. © - 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

    View Slide

  28. © - BASE, Inc.
    例: スプラウトクラスを活⽤する
    新しい機能は新しいクラスで表現し、

    View Slide

  29. © - BASE, Inc.
    例: スプラウトクラスを活⽤する
    元コードはクラスで作成したメソッドを呼ぶ

    View Slide

  30. © - BASE, Inc.
    Pros スプラウトメソッド‧クラス
    • 古いコードと新しいコードを明確に区別できる
    • ⇒ 既存コードの枠内にとらわれずコード設計が可能
    • 追加する機能はテスト容易に設計可能
    • ⇒ テスト済みのコードを追加できる

    View Slide

  31. © - BASE, Inc.
    Cons スプラウトメソッド‧クラス
    • 元のメソッドは保護しても改善してもいない
    • ⇒ 割れ窓は直っていないので、追ってリファクタリ
    ングは必要

    View Slide

  32. © - BASE, Inc.
    ⽤法⽤量にご注意
    • 最初で使うべきベストプラクティスではない
    • 以下を検討した上で⼼が折れそうになったら使いま
    しょう
    • テストがあるか?
    • テストがないならテストが書けるか?
    • リファクタリングできるか?

    View Slide

  33. © - 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

    View Slide

  34. © - BASE, Inc.
    おまとめ
    • 割れ窓理論
    • スプラウトメソッド/クラスで、古いコード‧新しい
    コードを区別する

    View Slide

  35. © - BASE, Inc.

    View Slide