Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
オブジェクト指向のこころ: 第19章 / DESIGN PATTERNS EXPLAINED:...
Search
hideki kinjyo
PRO
January 06, 2022
Programming
160
0
Share
オブジェクト指向のこころ: 第19章 / DESIGN PATTERNS EXPLAINED: chapter-19
会社で「オブジェクト指向のこころ」の読書会をやっています
hideki kinjyo
PRO
January 06, 2022
More Decks by hideki kinjyo
See All by hideki kinjyo
ソースコード→AST→オペコード、の旅を覗いてみる
o0h
PRO
1
130
PCOVから学ぶコードカバレッジ #phpcon_odawara
o0h
PRO
0
340
夢の無限スパゲッティ製造機 -実装篇- #phpstudy
o0h
PRO
0
230
夢の無限スパゲッティ製造機 #phperkaigi
o0h
PRO
0
470
PHPer Book Revue 「雑に作る」 #phperkaigi
o0h
PRO
0
360
俺にも私がAIと作った オススメの個人ツールを語らせてくれ
o0h
PRO
0
59
#phperbiglt のLT
o0h
PRO
0
95
手軽に積ん読を増やすには?/読みたい本と付き合うには?
o0h
PRO
1
270
symfony/mcp-bundleで、既存アプリケーションもお手軽にMCPサーバー化
o0h
PRO
1
160
Other Decks in Programming
See All in Programming
Sans tests, vos agents ne sont pas fiables
nabondance
0
130
AlarmKitで明後日起きれるアラームアプリを作る
trickart
0
140
Import assertionsが消えた日~ECMAScriptの仕様はどう決まり、なぜ覆るのか~
bicstone
2
180
Making the RBS Parser Faster
soutaro
0
720
Back to the roots of date
jinroq
0
860
運転動画を検索可能にする〜Cosmos-Embed1とDatabricks Vector Searchで〜/cosmos-embed1-databricks-vector-search
studio_graph
3
950
決定論 vs 確率論:Gemini 3 FlashとTF-IDFを組み合わせた「法規判定エンジン」の構築
shukob
0
160
いつか誰かが、と思っていた フロントエンド刷新5年間の実践知
kiichisugihara
1
280
クラウドネイティブなエンジニアに向ける Raycastの魅力と実際の活用事例
nealle
2
260
SREに優しいTerraform構成 modulesとstateの組み方
hiyanger
2
180
Kubernetesを使わない環境にもCloud Nativeなデプロイを実現する / Enabling Cloud Native deployments without the complexity of Kubernetes
linyows
3
410
cloudnative conference 2026 flyle
azihsoyn
0
180
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
210
Typedesign – Prime Four
hannesfritz
42
3k
Speed Design
sergeychernyshev
33
1.7k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
150
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
10k
How to Ace a Technical Interview
jacobian
281
24k
The untapped power of vector embeddings
frankvandijk
2
1.7k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.2k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Transcript
第19章 Template Methodパターン 課題図書: オブジェクト指向のこころ: デザインパターンとともに学ぶ
オブジェクト指向における再利⽤のためのデザインパターン 改訂版 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ʹԠͯ͡ύλʔϯΛଊ͑Δʯ͜ ͱͷํ͕ॏཁͩͱࢥ͍·͢