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
0
140
オブジェクト指向のこころ: 第19章 / DESIGN PATTERNS EXPLAINED: chapter-19
会社で「オブジェクト指向のこころ」の読書会をやっています
hideki kinjyo
PRO
January 06, 2022
Tweet
Share
More Decks by hideki kinjyo
See All by hideki kinjyo
Composerが「依存解決」のためにどんな工夫をしているか #phpcon
o0h
PRO
1
270
Composerの依存解決 #phpstudy
o0h
PRO
0
100
「影響が少ない」を自分の目でみてみる
o0h
PRO
3
1.6k
PHPによる"非"構造化プログラミング入門 -本当に熱いスパゲティコードを求めて- #phperkaigi
o0h
PRO
0
1.5k
もう少しテストを書きたいんじゃ〜 #phpstudy
o0h
PRO
23
5.1k
『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya
o0h
PRO
10
3.6k
色んなオートローダーを覗き見る #phpcon_okinawa
o0h
PRO
5
650
ヒューマンエラーの本を読んだ ~報告会~
o0h
PRO
3
340
みんなでワイワイ「テスト駆動開発」の話をやる会 #techramen24conf
o0h
PRO
4
660
Other Decks in Programming
See All in Programming
「テストは愚直&&網羅的に書くほどよい」という誤解 / Test Smarter, Not Harder
munetoshi
0
180
The Modern View Layer Rails Deserves: A Vision For 2025 And Beyond @ RailsConf 2025, Philadelphia, PA
marcoroth
2
400
猫と暮らす Google Nest Cam生活🐈 / WebRTC with Google Nest Cam
yutailang0119
0
140
新メンバーも今日から大活躍!SREが支えるスケールし続ける組織のオンボーディング
honmarkhunt
5
7.6k
脱Riverpod?fqueryで考える、TanStack Queryライクなアーキテクチャの可能性
ostk0069
0
170
ニーリーにおけるプロダクトエンジニア
nealle
0
860
PostgreSQLのRow Level SecurityをPHPのORMで扱う Eloquent vs Doctrine #phpcon #track2
77web
2
530
チームで開発し事業を加速するための"良い"設計の考え方 @ サポーターズCoLab 2025-07-08
agatan
1
430
Azure AI Foundryではじめてのマルチエージェントワークフロー
seosoft
0
180
プロダクト志向ってなんなんだろうね
righttouch
PRO
0
190
Systèmes distribués, pour le meilleur et pour le pire - BreizhCamp 2025 - Conférence
slecache
0
120
Agentic Coding: The Future of Software Development with Agents
mitsuhiko
0
110
Featured
See All Featured
Navigating Team Friction
lara
187
15k
Visualization
eitanlees
146
16k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.3k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
960
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.3k
For a Future-Friendly Web
brad_frost
179
9.8k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Rebuilding a faster, lazier Slack
samanthasiow
83
9.1k
How to Ace a Technical Interview
jacobian
278
23k
Music & Morning Musume
bryan
46
6.6k
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ʹԠͯ͡ύλʔϯΛଊ͑Δʯ͜ ͱͷํ͕ॏཁͩͱࢥ͍·͢