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

オブジェクト指向のこころ: 第19章 / DESIGN PATTERNS EXPLAINED: chapter-19

オブジェクト指向のこころ: 第19章 / DESIGN PATTERNS EXPLAINED: chapter-19

会社で「オブジェクト指向のこころ」の読書会をやっています

hideki kinjyo
PRO

January 06, 2022
Tweet

More Decks by hideki kinjyo

Other Decks in Programming

Transcript

  1. 第19章
    Template Methodパターン
    課題図書:
    オブジェクト指向のこころ: デザインパターンとともに学ぶ

    View Slide

  2. オブジェクト指向における再利⽤のためのデザインパターン 改訂版 P347

    View Slide

  3. ຊॻͰ͸ɾɾ
    z͜͏͍ͬͨڞ௨֓೦Λந৅Ϋϥεʹ·ͱΊͳ͕Βɺࡉ͔ͳࡍΛ೿ੜΫϥεʹΧϓηϧԽ͢Δz 1

    ڞ௨ੑ(common)
    Մมੑ(variable)
    「抽象」を親に、「具体」を⼦に置いていこうぜ〜!
    という魂に通ずるものを感じますね

    View Slide

  4. 最初にサンプルを⽰しちゃいましょ

    View Slide

  5. 「乗り物で⽬的地へ」
    • 「Rider 搭乗者」クラスは、「Norimono」
    にのって移動する〜みたいなイメージです
    • INorimono interfaceは「運ぶ」APIが定義さ
    れています
    •Norimono concreateは、「乗っけて→運んで
    →降ろす」を実装しています

    View Slide

  6. 乗り物ごとの仕事たち
    • なんか似た仕事をしていますよね・・?
    ただ、差異もありますよね・・・?
    • 「似た流れ」や「同じとみなせる⼿続き」
    が、アルゴリズムの⾻格な部分

    View Slide

  7. ·ͣ͸ʮ࣮ࡍͷ࢓ࣄͱͯ͠Կ͕ߦΘΕ͍ͯΔ͔ʯʹ஫໨ͯ͠
    ੔ཧ͢Δ
    template methodͷద༻
    共通部分を⾒つける
    コピペ的なものを探し出す
    まとめられる?→整える
    「⼿配する」「乗る」「運転する」「降りる」にまとめる

    View Slide

  8. template methodͷద༻
    ڞ௨ੑΛ਌ΫϥεʹʮҾ্͖͛Δʯ
    振る舞いのpartを切り出す
    リファクタリングパターン「Extract method」
    抽象・共通を親に、可変を⼦に
    リファクタリングパターン「Pull up method」「Inline function」

    View Slide

  9. Template Methodͷʮ෼͔Γ΍͍͢ʯ
    • ʮେ·͔ͳྲྀΕʯͱʮࡉ͔ͳखଓ͖ɾৼΔ෣͍ʯΛִ཭͢
    Δ͜ͱͰɺʮຊےʯ͕Θ͔Γ΍͘͢ͳΔ
    • ͜ͷล͸Strategyͱ͔ͷϝϦοτΛ૝ى͢Δͱྑ͛͞
    • ڞ௨ॲཧΛࣗ਎(਌)ʹ๊͑ࠐΉ͜ͱͰDRYԽ͕ୡ੒͠΍͍͢
    *.0
    ܧঝ͸جຊతʹ೉ࣦ͘͠ഊ͢ΔՄೳੑ͕ߴ͍ͷͰ͕͢ɺ͜Ε͸ܧঝͷྑ͍࣮ફྫͩͳͱࢥ͍
    ·͢ɻ
    ʮܧঝ͔ΠϯλʔϑΣΠε͔ʯʹରͯ͠ͷߟ͑ͱͯ͠ɺ
    ʮجຊ͸ΠϯλʔϑΣΠεɺ5FNQMBUF.FUIPE͕࠷దͳΒܧঝʯ͔ͳʙͬͯײ͕֮͋Γ·͢

    View Slide

  10. 本の話に戻ります

    View Slide

  11. • Α͋͘Δʮෳ਺ͷDBΛ࢖͍͍ͨʯΈ͍ͨͳྫ
    • QueryController͸ɺʮΫΤϦΛॲཧͯ͠ʂʯͱݺͼ͔͚Δ
    • ݺͼ͔͚ઌ͕QueryTemplate(ந৅)ͱͳ͍ͬͯΔ
    • QueryTemplate͸ɺ
    • ʮΫΤϦॲཧͷͨΊͷྲྀΕʯΛ஌͍ͬͯΔ
    • ʮॲཧͷͨΊͷத਎ʯ͸஌Βͳ͍
    ࠃࡍe-ίϚʔεγεςϜͷࣄྫ

    View Slide

  12. • QueryTemplate͸
    • ʮఆٛͯ͋͠Δ͸ͣ(த਎͸஌Βͳ͍ʂʂʯͷϝιουΛݺͼग़͠
    ͯॲཧͷྲྀΕΛඳ͘
    • ݺͼग़͞ΕΔͰ͋Ζ͏खଓ͖͸࣮૷Λڧ੍͠ɺଘࡏΛ୲อ͢Δ
    ࠃࡍe-ίϚʔεγεςϜͷࣄྫ

    View Slide

  13. ผͷྫ: ͪΐͬͱͣͭҧ͏ॲཧ͕୔ࢁ͋ΔΑʂ
    • ֓Ͷಉ͡ίʔυɾॲཧͳΜ͚ͩͲɺඍົʹࠩҟ͕͋
    Δʙɾɾɾͱ͍͏࣌ʹͲ͏͠·͔͢ʁ
    • if-else/switchΛ࢖ͬͯɺʮࠩҟʯΛදݱ͢Δ
    • ڞ௨෦෼΋ؚΊͯίϐϖͯ͠ʮผ෺ʯΛผͷՕॴʹஔ͘

    View Slide

  14. ͪΐͬͱͣͭҧ͏ॲཧ͕୔ࢁ͋ΔΑʂ
    if-elseの例
    分岐が多く複雑・・
    コピペの例
    凝集度が低い(処理が散らかる)・・

    View Slide

  15. Template Methodͷద༻खॱ
    1.·ͣ͸ʮίϐϖʯͷख๏ͰίʔυΛྔ࢈͢Δ
    • ௥Ճ͞ΕͨཁٻʹʮશମతͳίϐϖʯͰରԠ͢Δ
    2.ίϐʔઌͰʮࣗ෼ʹඞཁͳ౎߹͚ͩΛߟ͑ͯϜμͳ෦෼Λফ
    ͢ʯͳͲɺίʔυͷߋ৽Λ͢Δ
    • ྫ͑͹෼ذͷഉআɺϝϯόʔͷ࡟আͳͲ
    3.ίϐʔݩͱίϐʔઌΛൺֱͯ͠ɺʮڞ௨ʯΛݟ͚ͭΔ
    •ίʔυͦͷ΋ͷͷ಺༰ॏෳ͚ͩͰͳ͘ɺʮฒͼʯΛݟൈ͚Δͱ˕
    4.਌Ϋϥε΁ͷҠಈΛ༻͍ͨॏෳͷഉআ

    View Slide

  16. Template Methodͷʮ͏Ε͍͠ʯ
    • ίʔυͷύλʔϯԽ(ྲྀΕͷڞ௨Խɾ໌ࣔԽ)ɺDRYԽ͕ਐ
    Ή
    • ʮมಈʯʹରͯ͠ʮࠩ෼͚ͩΛ࣮૷͢Δʯ͜ͱ͕ग़དྷΔͷ
    Ͱɺ։์/ด࠯ݪଇΛଅਐͤ͞΍͍͢
    • ͋ͱ͔ΒϦϑΝΫλϦϯάͱͯ͠ద༻͠΍͍͢(※ࢲݟ)

    View Slide

  17. ิ଍: Strategyύλʔϯͱͷൺֱ
    • Strategy͸ॲཧΛ·ΔͬͱೖΕସ͑Δ
    • ͔ͩΒComposition͕޷·ΕΔ
    • DIύλʔϯͱ͔ͱྑ͘Ұॹʹར༻͞ΕΔΑ
    • Template Method͸ࠩ෼͚ͩΛೖΕସ͑Δ
    • ͔ͩΒܧঝ͕޷·ΕΔ
    • IoCͷݦஶͳྫɻ
    https://bliki-ja.github.io/InversionOfControl/ ͷʮFWʯ͕Template methodɺ
    ʮϥΠϒϥϦʯ͕Strategy
    • ͱ͸͍͑ʮͲ͏ݺͿ΂͖͔ʯΑΓ͸ɺʮ໨త/contextʹԠͯ͡ύλʔϯΛଊ͑Δʯ͜
    ͱͷํ͕ॏཁͩͱࢥ͍·͢

    View Slide