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
OOP, Double Dispatch and Visitor Pattern
Search
Akihito Koriyama
May 24, 2024
Technology
2
150
OOP, Double Dispatch and Visitor Pattern
OOPのエッセンスとビジターパターンを使ったディスパッチのデザインパターン。弁護士ドットコム社で紹介。
Akihito Koriyama
May 24, 2024
Tweet
Share
More Decks by Akihito Koriyama
See All by Akihito Koriyama
新世界の理解
koriym
0
150
AI Centric
koriym
0
360
app-state-diagram
koriym
0
93
BEAR.Sunday 2014-2024
koriym
0
68
イベント駆動コンテンツ (a.k.a Webアプリケーションの効率を再定義するBEAR.Sundayの分散キャッシングフレームワーク)
koriym
4
8.3k
Unconf: RWA読書会
koriym
0
610
REST 6+4の制約
koriym
2
2.8k
RESTful Web API 読書会 #1
koriym
3
300
RESTの力 / The Power of REST
koriym
10
8.1k
Other Decks in Technology
See All in Technology
DDD集約とサービスコンテキスト境界との関係性
pandayumi
2
260
「魔法少女まどか☆マギカ Magia Exedra」のグローバル展開を支える、開発チームと翻訳チームの「意識しない協創」を実現するローカライズシステム
gree_tech
PRO
0
560
AI時代に非連続な成長を実現するエンジニアリング戦略
sansantech
PRO
3
1.1k
Nstockの一人目エンジニアが 3年間かけて向き合ってきた セキュリティのこととこれから〜あれから半年〜
yo41sawada
0
200
5年目から始める Vue3 サイト改善 #frontendo
tacck
PRO
3
190
250905 大吉祥寺.pm 2025 前夜祭 「プログラミングに出会って20年、『今』が1番楽しい」
msykd
PRO
1
470
AIエージェントの活用に重要な「MCP (Model Context Protocol)」とは何か
masayamoriofficial
0
290
[RSJ25] Feasible RAG: Hierarchical Multimodal Retrieval with Feasibility-Aware Embodied Memory for Mobile Manipulation
keio_smilab
PRO
0
100
Function Body Macros で、SwiftUI の View に Accessibility Identifier を自動付与する/Function Body Macros: Autogenerate accessibility identifiers for SwiftUI Views
miichan
2
170
【Grafana Meetup Japan #6】Grafanaをリバプロ配下で動かすときにやること ~ Grafana Liveってなんだ ~
yoshitake945
0
270
「魔法少女まどか☆マギカ Magia Exedra」での負荷試験の実践と学び
gree_tech
PRO
0
590
Obsidian応用活用術
onikun94
1
390
Featured
See All Featured
The Language of Interfaces
destraynor
161
25k
Rebuilding a faster, lazier Slack
samanthasiow
83
9.2k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
A designer walks into a library…
pauljervisheath
207
24k
RailsConf 2023
tenderlove
30
1.2k
Balancing Empowerment & Direction
lara
3
610
Done Done
chrislema
185
16k
Building Better People: How to give real-time feedback that sticks.
wjessup
368
19k
Into the Great Unknown - MozCon
thekraken
40
2k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
6k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
358
30k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
910
Transcript
001 %PVCMF%JTQBUDIBOE 7JTJUPS1BUUFSO "LJIJUP,PSJZBNB
1BSU001ͱखଓܕ 001BOEQSPDFEVSBMUZQFT
-PHJD %BUB
࢛֯ܗͷ໘ੵΛٻΊΔ 'JOEJOHUIFBSFBPGBRVBESBOHMF
-PHJD %BUB < > BYC
-PHJD%BUBΛΔඞཁ͕͋Δ -PHJDOFFETUPLOPX%BUB
"SFB %BUB BYC QVCMJDB QVCMJDC
ΧϓηϧԽͰ͖ͯͳ͍ /PUFODBQTVMBUFE
-PHJD %BUB BYC HFU" JOU HFU# JOU
ΧϓηϧԽͰ͖ͯͳ͍ /PUFODBQTVMBUFE
w 8IZHFUUFSBOETFUUFSNFUIPETBSFFWJM w (FUUFS4FUUFSѱͩɻҎ্ɻ
ΦϒδΣΫτࢦ PCKFDUPSJFOUFE
4IBQF < > BYC
4IBQF < > BYC BSFB JOU
खଓ͖ܕ QSPDFEVSBMUZQF
$MJFOU %BUB BYC B C
5FMM
4IBQF < > BYC BSFB JOU
"TL
$MJFOU %BUB BYC B C
5FMM %POUBTL
5FMMࣗݾنత 5FMMJTTFMGEJTDJQMJOFE
ΧϓηϧԽ FODBQTVMBUJPO
ΦϒδΣΫτࢦ PCKFDUPSJFOUFE
"TL ϩδοΫ͕σʔλͷ֎ʹ͋Δ *O"TL UIFMPHJDJTPVUTJEFUIFEBUB
-PHJD %BUB BYC B C
σʔλߏ͕࿐ग़ %BUBTUSVDUVSFTFYQPTFE
ϧʔϧ͕ͳ͍ /PSVMFT
υϝΠϯ͕ࣝͳ͍ -BDLPGEPNBJOLOPXMFEHF
υϝΠϯශ݂ %%% %PNBJOBOBFNJB %%%
1BSUμϒϧσΟεύον %PVCMFEJTQBUDI
001Ͱ-PHJDͱ%BUBΛ
యܕత001ͰΦϒδΣΫτ͕ -PHJDΛϓϩύςΟʹอ࣋ *OUZQJDBM001 PCKFDUTIPME-PHJDBTBQSPQFSUZ
%BUB -PHJD BYC
7JTJUPSύλʔϯͰ -PHJD͕σʔλΛ๚ -PHJDWJTJUTEBUBPCKFDUJOUIF7JTJUPSQBUUFSO
7JTJUPS %BUB GVODUJPOBDDFQU 7JTJUPSW
σʔλ๚ऀΛར༻ %BUBVTFTWJTJUPST
7JTJUPS %BUB WWJTJU B C
๚ऀʹϩδοΫ͕͋Δ 7JTJUPSTIBWFMPHJD
7JTJUPS %BUB GVODUJPOWJTJU B C SFUVSOB C
7JTJUPSͰ -PHJD͕ϝιουͰ͞ΕΔ *OUIF7JTJUPSQBUUFSO -PHJDJTQBTTFECZNFUIPE
σʔλίϨΫλʔ ਤܗͷࢹ֮Խ όϦσʔγϣϯ %BUBDPMMFDUPST TIBQFWJTVBMJTBUJPO7BMJEBUJPO
ଟ༷ͳ-PHJDͷҰ࣌తͳ๚ %JWFSTF-PHJDUFNQPSBSZWJTJUT
" %BUB #
γϯάϧσΟεύον ࣮ߦͷܾఆ͕୯Ұ 4JOHMFEJTQBUDI TJOHMFEFDJTJPOUPFYFDVUF
" %BUB # BDDFQU WJTJU
μϒϧσΟεύον ࣮ߦͷܾఆ͕̎ճ %PVCMFEJTQBUDI 5XPFYFDVUJPOEFDJTJPOT
ଟॏσΟεύον ࣮ߦͷܾఆ͕ෳճ .VMUJQMFEJTQBUDI .VMUJQMFFYFDVUJPOEFDJTJPOT
QBSU%*ίϯύΠϥͷઃܭ %*DPNQJMFSEFTJHO
Πϯελϯεੜ JOTUBODFDSFBUJPO
%BUB wOFX*OTUBODF wDMBTT/BNF wBSHVNFOUT wBSHVNFOU wTFUUFS.FUIPET wTFUUFS.FUIPE wNFUIPE/BNF wBSHVNFOUT
wBSHVNFOU Dependency
ґଘʹґଘ͕͋Δ %FQFOEFODFVQPOEFQFOEFODF
%BUB wOFX*OTUBODF wDMBTT/BNF wBSHVNFOUT wBSHVNFOU wTFUUFS.FUIPET wTFUUFS.FUIPE wNFUIPE/BNF wBSHVNFOUT
wBSHVNFOU Dependency
7JTJUPSίϯύΠϥͷઃܭ 7JTJUPSDPNQJMFSEFTJHO
ड͚औͬͨΦϒδΣΫτར༻Λ܁Γฦ͢ 3FQFBUSFDFJWFEPCKFDUVTF
w WJTJU%FQFEFODZ w WJTJU/FX*OTOUBDF w WJTJU"SHVNFOUT w WJTJU"SHVNFOU w
WJTJU4FUUFS.FUIPET w WJTJU4FUUFS.FUIPE %BUB w OFX*OTUBODF wDMBTT/BNF wBSHVNFOUT wBSHVNFOU wTFUUFS.FUIPET wTFUUFS.FUIPE wNFUIPE/BNF wBSHVNFOUT wBSHVNFOU Visitor Dependency
4FUUFS.FUIPETͷ߹ 'PS4FUUFS.FUIPET
%BUB SetterMethods public function accept(VisitorInterface $visitor) { $visitor->visitSetterMethods($this->setterMethods); }
w Visitor public function visitSetterMethods( array $setterMethods ) { foreach
($setterMethods as $setterMethod) { $setterMethod->accept($this); } }
7JTJUPSड͚औͬͨΦϒδΣΫτΛ ʑͱεΫϦϓτʹ 5IF7JTJUPSTFOETUIFSFDFJWFEPCKFDUUPUIFTDSJQUDPEF
ෳࡶͳߏͷBDDFQUͱWJTJUΛ܁Γฦ͠ ݁ہ࠷ॳͷίʔϧ͕࠷ऴ݁ՌΛड͚औΔ 3FQFBUFEBDDFQUBOEWJTJUPGDPNQMFYTUSVDUVSFT &WFOUVBMMZUIF fi STUDBMMSFDFJWFTUIF fi OBMSFTVMU
w WJTJU%FQFEFODZ w %BUB w Visitor Dependency
ͦΕͧΕͷϝιου ہॴతͳࣝͱλεΫ͔͠ཁٻ͞Εͳ͍ 0OMZMPDBMLOPXMFEHFBOEUBTLTBSFSFRVJSFE
ෳࡶͳґଘߏΛίϯύΠϥΒͳ͍ $PNQJMFSTBSFVOBXBSFPGDPNQMFYEFQFOEFODZTUSVDUVSFT
ࠓԿΛ͢Δ͔ͱɺ࣍ʹԿΛݺͿ͔ ଞʹؔ৺͕ͳ͍ 8IBUUPEPOPXBOEXIBUUPDBMMOFYU /PUJOUFSFTUFEJOBOZUIJOHFMTF
શମΛΔίϯμΫλʔ͍ͳ͍ /PDPOEVDUPSLOPXTUIFXIPMFTUSVDUVSF
ΦʔέετϨʔγϣϯͰͳ͘ɺίϨΦάϥϑΟʔ $IPSFPHSBQIZ OPUPSDIFTUSBUJPO
σʔλͱϩδοΫΛ͠ɺΦϒδΣΫ τߏͷৄࡉΛΒͣʹ৽͍͠ϩδοΫ Λద༻Ͱ͖ΔσβΠϯύλʔϯ %FTJHOQBUUFSOTUIBUTFQBSBUFEBUBGSPNMPHJDBOE BMMPXOFXMPHJDUPCFBQQMJFEXJUIPVULOPXJOHUIF EFUBJMTPGUIFPCKFDUTUSVDUVSF