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
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
オブジェクト指向のこころ: 第19章 / DESIGN PATTERNS EXPLAINED: chapter-19
会社で「オブジェクト指向のこころ」の読書会をやっています
hideki kinjyo
PRO
January 06, 2022
More Decks by hideki kinjyo
See All by hideki kinjyo
Symfonyが 簡単にAI agentになる
o0h
PRO
0
3
yield再入門 #phpcon
o0h
PRO
0
1.1k
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
330
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
310
ソースコード→AST→オペコード、の旅を覗いてみる
o0h
PRO
1
220
PCOVから学ぶコードカバレッジ #phpcon_odawara
o0h
PRO
0
430
夢の無限スパゲッティ製造機 -実装篇- #phpstudy
o0h
PRO
0
270
夢の無限スパゲッティ製造機 #phperkaigi
o0h
PRO
0
960
PHPer Book Revue 「雑に作る」 #phperkaigi
o0h
PRO
0
430
Other Decks in Programming
See All in Programming
仕様駆動開発の消費期限
watany
20
8.6k
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.6k
Google Apps Script で Ruby を動かす
kawahara
0
270
Foundation Models frameworkで画像分析
ryodeveloper
1
620
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
210
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
500
Android CLI
fornewid
0
220
プロポーザルを書いてもらう
pvcresin
0
550
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
250
KotlinConf Extended South Korea 2026 Keynote
l2hyunwoo
0
110
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
800
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
270
Featured
See All Featured
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
470
The Art of Programming - Codeland 2020
erikaheidi
57
14k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
490
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
420
How to Think Like a Performance Engineer
csswizardry
28
2.7k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
630
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
340
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
960
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.2k
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ʹԠͯ͡ύλʔϯΛଊ͑Δʯ͜ ͱͷํ͕ॏཁͩͱࢥ͍·͢