Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

本の話に戻ります

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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