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パターン 課題図書: オブジェクト指向のこころ: デザインパターンとともに学ぶ

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

  3. ຊॻͰ͸ɾɾ z͜͏͍ͬͨڞ௨֓೦Λந৅Ϋϥεʹ·ͱΊͳ͕Βɺࡉ͔ͳࡍΛ೿ੜΫϥεʹΧϓηϧԽ͢Δz 1 ڞ௨ੑ(common) Մมੑ(variable) 「抽象」を親に、「具体」を⼦に置いていこうぜ〜! という魂に通ずるものを感じますね

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

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

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

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

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

    function」
  9. Template Methodͷʮ෼͔Γ΍͍͢ʯ • ʮେ·͔ͳྲྀΕʯͱʮࡉ͔ͳखଓ͖ɾৼΔ෣͍ʯΛִ཭͢ Δ͜ͱͰɺʮຊےʯ͕Θ͔Γ΍͘͢ͳΔ • ͜ͷล͸Strategyͱ͔ͷϝϦοτΛ૝ى͢Δͱྑ͛͞ • ڞ௨ॲཧΛࣗ਎(਌)ʹ๊͑ࠐΉ͜ͱͰDRYԽ͕ୡ੒͠΍͍͢ *.0

    ܧঝ͸جຊతʹ೉ࣦ͘͠ഊ͢ΔՄೳੑ͕ߴ͍ͷͰ͕͢ɺ͜Ε͸ܧঝͷྑ͍࣮ફྫͩͳͱࢥ͍ ·͢ɻ ʮܧঝ͔ΠϯλʔϑΣΠε͔ʯʹରͯ͠ͷߟ͑ͱͯ͠ɺ ʮجຊ͸ΠϯλʔϑΣΠεɺ5FNQMBUF.FUIPE͕࠷దͳΒܧঝʯ͔ͳʙͬͯײ͕֮͋Γ·͢
  10. 本の話に戻ります

  11. • Α͋͘Δʮෳ਺ͷDBΛ࢖͍͍ͨʯΈ͍ͨͳྫ • QueryController͸ɺʮΫΤϦΛॲཧͯ͠ʂʯͱݺͼ͔͚Δ • ݺͼ͔͚ઌ͕QueryTemplate(ந৅)ͱͳ͍ͬͯΔ • QueryTemplate͸ɺ • ʮΫΤϦॲཧͷͨΊͷྲྀΕʯΛ஌͍ͬͯΔ

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

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

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

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

    •ίʔυͦͷ΋ͷͷ಺༰ॏෳ͚ͩͰͳ͘ɺʮฒͼʯΛݟൈ͚Δͱ˕ 4.਌Ϋϥε΁ͷҠಈΛ༻͍ͨॏෳͷഉআ
  16. Template Methodͷʮ͏Ε͍͠ʯ • ίʔυͷύλʔϯԽ(ྲྀΕͷڞ௨Խɾ໌ࣔԽ)ɺDRYԽ͕ਐ Ή • ʮมಈʯʹରͯ͠ʮࠩ෼͚ͩΛ࣮૷͢Δʯ͜ͱ͕ग़དྷΔͷ Ͱɺ։์/ด࠯ݪଇΛଅਐͤ͞΍͍͢ • ͋ͱ͔ΒϦϑΝΫλϦϯάͱͯ͠ద༻͠΍͍͢(※ࢲݟ)

  17. ิ଍: Strategyύλʔϯͱͷൺֱ • Strategy͸ॲཧΛ·ΔͬͱೖΕସ͑Δ • ͔ͩΒComposition͕޷·ΕΔ • DIύλʔϯͱ͔ͱྑ͘Ұॹʹར༻͞ΕΔΑ • Template

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