会社で「オブジェクト指向のこころ」の読書会をやっています
第19章Template Methodパターン課題図書:オブジェクト指向のこころ: デザインパターンとともに学ぶ
View Slide
オブジェクト指向における再利⽤のためのデザインパターン 改訂版 P347
ຊॻͰɾɾz͜͏͍ͬͨڞ௨֓೦ΛநΫϥεʹ·ͱΊͳ͕Βɺࡉ͔ͳࡍΛੜΫϥεʹΧϓηϧԽ͢Δz 1ڞ௨ੑ(common)Մมੑ(variable)「抽象」を親に、「具体」を⼦に置いていこうぜ〜!という魂に通ずるものを感じますね
最初にサンプルを⽰しちゃいましょ
「乗り物で⽬的地へ」• 「Rider 搭乗者」クラスは、「Norimono」にのって移動する〜みたいなイメージです• INorimono interfaceは「運ぶ」APIが定義されています•Norimono concreateは、「乗っけて→運んで→降ろす」を実装しています
乗り物ごとの仕事たち• なんか似た仕事をしていますよね・・?ただ、差異もありますよね・・・?• 「似た流れ」や「同じとみなせる⼿続き」が、アルゴリズムの⾻格な部分
·ͣʮ࣮ࡍͷࣄͱͯ͠Կ͕ߦΘΕ͍ͯΔ͔ʯʹͯ͠ཧ͢Δtemplate methodͷద༻共通部分を⾒つけるコピペ的なものを探し出すまとめられる?→整える「⼿配する」「乗る」「運転する」「降りる」にまとめる
template methodͷద༻ڞ௨ੑΛΫϥεʹʮҾ্͖͛Δʯ振る舞いのpartを切り出すリファクタリングパターン「Extract method」抽象・共通を親に、可変を⼦にリファクタリングパターン「Pull up method」「Inline function」
Template Methodͷʮ͔Γ͍͢ʯ• ʮେ·͔ͳྲྀΕʯͱʮࡉ͔ͳखଓ͖ɾৼΔ͍ʯΛִ͢Δ͜ͱͰɺʮຊےʯ͕Θ͔Γ͘͢ͳΔ• ͜ͷลStrategyͱ͔ͷϝϦοτΛى͢Δͱྑ͛͞• ڞ௨ॲཧΛࣗ()ʹ๊͑ࠐΉ͜ͱͰDRYԽ͕ୡ͍͢͠*.0ܧঝجຊతʹࣦ͘͠ഊ͢ΔՄೳੑ͕ߴ͍ͷͰ͕͢ɺ͜Εܧঝͷྑ͍࣮ફྫͩͳͱࢥ͍·͢ɻʮܧঝ͔ΠϯλʔϑΣΠε͔ʯʹରͯ͠ͷߟ͑ͱͯ͠ɺʮجຊΠϯλʔϑΣΠεɺ5FNQMBUF.FUIPE͕࠷దͳΒܧঝʯ͔ͳʙͬͯײ͕֮͋Γ·͢
本の話に戻ります
• Α͋͘ΔʮෳͷDBΛ͍͍ͨʯΈ͍ͨͳྫ• QueryControllerɺʮΫΤϦΛॲཧͯ͠ʂʯͱݺͼ͔͚Δ• ݺͼ͔͚ઌ͕QueryTemplate(ந)ͱͳ͍ͬͯΔ• QueryTemplateɺ• ʮΫΤϦॲཧͷͨΊͷྲྀΕʯΛ͍ͬͯΔ• ʮॲཧͷͨΊͷதʯΒͳ͍ࠃࡍe-ίϚʔεγεςϜͷࣄྫ
• QueryTemplate• ʮఆٛͯ͋͠Δͣ(தΒͳ͍ʂʂʯͷϝιουΛݺͼग़ͯ͠ॲཧͷྲྀΕΛඳ͘• ݺͼग़͞ΕΔͰ͋Ζ͏खଓ͖࣮Λڧ੍͠ɺଘࡏΛ୲อ͢Δࠃࡍe-ίϚʔεγεςϜͷࣄྫ
ผͷྫ: ͪΐͬͱͣͭҧ͏ॲཧ͕ࢁ͋ΔΑʂ• ֓Ͷಉ͡ίʔυɾॲཧͳΜ͚ͩͲɺඍົʹࠩҟ͕͋Δʙɾɾɾͱ͍͏࣌ʹͲ͏͠·͔͢ʁ• if-else/switchΛͬͯɺʮࠩҟʯΛදݱ͢Δ• ڞ௨෦ؚΊͯίϐϖͯ͠ʮผʯΛผͷՕॴʹஔ͘
ͪΐͬͱͣͭҧ͏ॲཧ͕ࢁ͋ΔΑʂif-elseの例分岐が多く複雑・・コピペの例凝集度が低い(処理が散らかる)・・
Template Methodͷద༻खॱ1.·ͣʮίϐϖʯͷख๏ͰίʔυΛྔ࢈͢Δ• Ճ͞ΕͨཁٻʹʮશମతͳίϐϖʯͰରԠ͢Δ2.ίϐʔઌͰʮࣗʹඞཁͳ߹͚ͩΛߟ͑ͯϜμͳ෦Λফ͢ʯͳͲɺίʔυͷߋ৽Λ͢Δ• ྫ͑ذͷഉআɺϝϯόʔͷআͳͲ3.ίϐʔݩͱίϐʔઌΛൺֱͯ͠ɺʮڞ௨ʯΛݟ͚ͭΔ•ίʔυͦͷͷͷ༰ॏෳ͚ͩͰͳ͘ɺʮฒͼʯΛݟൈ͚Δͱ˕4.ΫϥεͷҠಈΛ༻͍ͨॏෳͷഉআ
Template Methodͷʮ͏Ε͍͠ʯ• ίʔυͷύλʔϯԽ(ྲྀΕͷڞ௨Խɾ໌ࣔԽ)ɺDRYԽ͕ਐΉ• ʮมಈʯʹରͯ͠ʮ͚ࠩͩΛ࣮͢Δʯ͜ͱ͕ग़དྷΔͷͰɺ։์/ดݪଇΛଅਐ͍ͤ͢͞• ͋ͱ͔ΒϦϑΝΫλϦϯάͱͯ͠ద༻͍͢͠(※ࢲݟ)
ิ: Strategyύλʔϯͱͷൺֱ• StrategyॲཧΛ·ΔͬͱೖΕସ͑Δ• ͔ͩΒComposition͕·ΕΔ• DIύλʔϯͱ͔ͱྑ͘Ұॹʹར༻͞ΕΔΑ• Template Method͚ࠩͩΛೖΕସ͑Δ• ͔ͩΒܧঝ͕·ΕΔ• IoCͷݦஶͳྫɻhttps://bliki-ja.github.io/InversionOfControl/ ͷʮFWʯ͕Template methodɺʮϥΠϒϥϦʯ͕Strategy• ͱ͍͑ʮͲ͏ݺͿ͖͔ʯΑΓɺʮత/contextʹԠͯ͡ύλʔϯΛଊ͑Δʯ͜ͱͷํ͕ॏཁͩͱࢥ͍·͢