Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
オブジェクト指向のこころ: 第19章 / DESIGN PATTERNS EXPLAINED:...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
hideki kinjyo
PRO
January 06, 2022
Programming
170
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
71
yield再入門 #phpcon
o0h
PRO
0
1.5k
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
360
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
3
360
ソースコード→AST→オペコード、の旅を覗いてみる
o0h
PRO
1
240
PCOVから学ぶコードカバレッジ #phpcon_odawara
o0h
PRO
0
460
夢の無限スパゲッティ製造機 -実装篇- #phpstudy
o0h
PRO
0
290
夢の無限スパゲッティ製造機 #phperkaigi
o0h
PRO
0
990
PHPer Book Revue 「雑に作る」 #phperkaigi
o0h
PRO
0
450
Other Decks in Programming
See All in Programming
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
490
cdk deploy JawsSonic #MARATHONしながらAWSリソースをデプロイしてみよう
akihisaikeda
2
130
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
3
550
The Good Stuff, Not the Slop: Engineering High-Quality Android Apps with Modern AI Tooling
danybony
1
250
Intent as Code
shoppingjaws
6
1k
Java 27新機能 / Java 27 new features
kishida
2
140
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
230
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
240
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
290
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
140
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2k
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
140
Featured
See All Featured
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
700
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
sira's awesome portfolio website redesign presentation
elsirapls
0
410
The browser strikes back
jonoalderson
0
1.7k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
540
Leo the Paperboy
mayatellez
10
2.3k
Deep Space Network (abreviated)
tonyrice
0
310
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
360
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
520
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ʹԠͯ͡ύλʔϯΛଊ͑Δʯ͜ ͱͷํ͕ॏཁͩͱࢥ͍·͢