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
Visitorパターン
Search
k-kohey
October 28, 2019
Programming
0
190
Visitorパターン
k-kohey
October 28, 2019
Tweet
Share
More Decks by k-kohey
See All by k-kohey
ゲームボーイアドバンスでSwiftを動かそう
k_koheyi
0
1.1k
Swift Package Mangerのバグを直した話
k_koheyi
2
1.5k
swift-async-algorithms...? へえ…面白そうじゃん…?
k_koheyi
3
1.6k
[社内勉強会]Parchment-swiftの実装説明
k_koheyi
0
140
[社内勉強会]Combineの説明
k_koheyi
0
36
あるインスタンスの取る値が 何パターンあるか数えてみるンゴ!
k_koheyi
1
170
Tuistを用いた Xcode Project管理の紹介
k_koheyi
0
210
SwiftでわかるSOLID原則 iOSDC 2020
k_koheyi
3
2.8k
Application Design 勉強会23-25章
k_koheyi
0
79
Other Decks in Programming
See All in Programming
CIを整備してメンテナンスを生成AIに任せる
hazumirr
0
300
副作用と戦う PHP リファクタリング ─ ドメインイベントでビジネスロジックを解きほぐす
kajitack
3
480
変化を楽しむエンジニアリング ~ いままでとこれから ~
murajun1978
0
520
Understanding Kotlin Multiplatform
l2hyunwoo
0
230
AIコーディングエージェント全社導入とセキュリティ対策
hikaruegashira
15
8.4k
NEWT Backend Evolution
xpromx
1
160
Claude Code派?Gemini CLI派? みんなで比較LT会!_20250716
junholee
1
750
LLMは麻雀を知らなすぎるから俺が教育してやる
po3rin
2
1.3k
Gemini CLIの"強み"を知る! Gemini CLIとClaude Codeを比較してみた!
kotahisafuru
2
200
QA x AIエコシステム段階構築作戦
osu
0
210
The Modern View Layer Rails Deserves: A Vision For 2025 And Beyond @ RailsConf 2025, Philadelphia, PA
marcoroth
2
820
Reactの歴史を振り返る
tutinoko
1
140
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
53
7.7k
Testing 201, or: Great Expectations
jmmastey
43
7.6k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
22k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Typedesign – Prime Four
hannesfritz
42
2.7k
Designing for humans not robots
tammielis
253
25k
Making Projects Easy
brettharned
117
6.3k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.3k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1k
Faster Mobile Websites
deanohume
308
31k
Rails Girls Zürich Keynote
gr2m
95
14k
Transcript
"QQMJDBUJPO%FTJHO ษڧձ ষ ஜେֶ ใϝσΟΞֶྨ ޱ ߤฏ 1
࣍ • ষ 7JTJUPSύλʔϯ • 7JTJUPSύλʔϯ • "DZDMJD7JTJUPSύλʔϯ • %FDPSBUPSύλʔϯ
• &YUFOTJPO 0CKFDUύλʔϯ 2 ط ଘ ͷ ֊ ߏ ʹ ख Λ Ճ ͑ ͣ ʹ ৽ ͠ ͍ ϝ ι ỽ υ Λ Ճ ͢ Δ ͨ Ί ʹ
എܠ • 下記のようなモデムを制御するためのクラス群がある • Hays,Zoom,およびErnieは全てべつのハードウェアを制御する 3 <interface> Modem Hays Zoom
Ernie
എܠ • 下記のようなモデムを制御するためのクラス群がある • Hays,Zoom,およびErnieは全てべつのハードウェアを制御する 4 <interface> Modem Hays Zoom
Ernie ModemとUnixを接続する configureForUnixを追加して
എܠ • Modemに対応OSが増える毎にModemにインタフェースが増える ⇢ その都度,すべてのモデムソフトウェアを再配布するハメになる 5 <interface> Modem + configureForUnix
+ configureForLinux + configureForWindows …. Hays Zoom Ernie そのモデルが 追加されたOSを サポートするかに 関わらず 必ず変更を要する
ղܾ͍ͨ͠ • ModemインタフェースにconfigureForUnixメソッドを追加せずに Unix対応をする ⇢ 既存の階層構造に⼿を⼊れずに新しいメソッドを追加する 6 <interface> Modem Hays
Zoom Ernie
7JTJUPSύλʔϯͷ࣮ cΫϥεਤ • OS依存の処理をModemVisitorに委託する • Modem::acceptからModemVisitorの処理を実⾏ 7 <interface> Modem +
accept(ModemVisitor) Hays Zoom Ernie UnixModem Configurator <interface> ModemVisitor + visit(Hayes) + visit(Zoom) + visit(Ernie)
7JTJUPSύλʔϯͷ࣮ cίʔυ • OS依存の処理をModemVisitorに委託する • Modem::acceptからModemVisitorの処理を実⾏ 8 <interface> Modem +
accept(ModemVisitor) Hays Zoom Ernie UnixModem Configurator <interface> ModemVisitor + visit(Hayes) + visit(Zoom) + visit(Ernie)
7JTJUPSύλʔϯͷ cยଆͷมߋ͕͏ยଆʹൖ 9 <interface> Modem + accept(ModemVisitor) Hays Zoom Ernie
UnixModem Configurator <interface> ModemVisitor + visit(Hayes) + visit(Zoom) + visit(Ernie) Visitする側 Visitされる側
7JTJUPSύλʔϯͷc7JTJUPSʹੜΫϥεΛੜ͢ͷ͕େม • HogeModemを追加する場合は? • Modemを継承したHogeModemクラスを追加 • ModemVisitorにvisit(:HogeModem)メソッドを追加 • ModemVisitorを継承しているすべての派⽣クラスにvisit(:HogeModem)を追加 •
UnixModemConfiguration以外にもLinuxModemConfigurationやWindowsModemConfigurationも 考えられる • 実際に必要とならないところにもvisit(:HogeModem)は実装しなくてはいけない ModemVisitorに派⽣クラスがあると(or増やそうとすると) 変更が多くて⼤変
"DZDMJD7JTJUPSύλʔϯ cΫϥεਤ • ⾮循環のVisitorパターン,Acyclic Visitorを使えば問題は解決する 11 <interface> Modem + accept(ModemVisitor)
Hays Ernie Zoom <interface> Hays + visit(Hays) <interface> Zoom + visit(Hays) <interface> Ernie + visit(Hays) UnixModem Configuration <delegate> ModemVisitor
"DZDMJD7JTJUPSύλʔϯ cίʔυ • ⾮循環のVisitorパターン,Acyclic Visitorを使えば問題は解決する 12 <interface> Modem + accept(ModemVisitor)
Hays Ernie Zoom <interface> Hays + visit(Hays) <interface> Zoom + visit(Hays) <interface> Ernie + visit(Hays) UnixModem Configuration <delegate> ModemVisitor
"DZDMJD7JTJUPSύλʔϯ cྑ͍͜ͱ • ⾮循環のVisitorパターン,Acyclic Visitorを使えば問題は解決する 13 <interface> Modem + accept(ModemVisitor)
Hays Ernie Zoom <interface> Hays + visit(Hays) <interface> Zoom + visit(Hays) <interface> Ernie + visit(Hays) UnixModem Configuration <delegate> ModemVisitor Modemの派⽣クラスが増えても 変更が伝搬しない
7JTJUPSύλʔϯ·ͱΊ • 1つのデータ構造をいろいろと違った形で利⽤しなければいけないアプリ ケーションで便利 • データ構造とVisitorは無関係 • 既存のデータ構造を再構成したりせずに 新しいVisitorを追加したり変更したりできる •
既存のデータ構造に影響を与えずに,Visitorを配布出来る
%FDPSBUPSύλʔϯ • Visitorと同様なことを提供してくれるパターン!! <interface> Modem + dial Hays Zoom Ernie
%FDPSBUPSύλʔϯc ྫ • dialをするときにその⾳量ボリュームを制御したい • 下記のような実装はコピペの嵐を⽣んでしまう <interface> Modem + dial
Hays Zoom Ernie
%FDPSBUPSύλʔϯc ྫ • dialをするときにその⾳量ボリュームを制御したい • 新しいModemの派⽣クラスの作者はこのコードを知っていなくてはいけない <interface> Modem + dial
Hays Zoom Ernie
%FDPSBUPSύλʔϯ • ボリュームの変更を⾏うModemはLoudDialModemを使ってラップする <interface> Modem + dial Hays Zoom Ernie
LoudDialModem <delegate>
%FDPSBUPSύλʔϯ • ボリュームの変更を⾏うModemはLoudDialModemを使ってラップする <interface> Modem + dial Hays Zoom Ernie
LoudDialModem <delegate> システムの他の部分に影響を与えずに ⾳量を上げられる!
%FDPSBUPSύλʔϯ • ボリュームの変更を⾏うModemはLoudDialModemを使ってラップする <interface> Modem + dial Hays Zoom Ernie
LoudDialModem <delegate> 継承してるので Modemとして振る舞える
&YUFOTJPO0CKFDUύλʔϯ • Visitorと同様なことを提供してくれるパターン!! • 部品⼀覧を取り扱うアプリケーションを考える • 複合部品のAssembly • 単⼀部品のPiecePart •
Partの構成する部品をXMLで吐き出す機能を 追加したい • Partの中に処理を押し込むとSRP違反になる
&YUFOTJPO0CKFDUύλʔϯ • Visitorと同様なことを提供してくれるパターン!! • 部品⼀覧を取り扱うアプリケーションを考える
&YUFOTJPO0CKFDUύλʔϯ 基底クラスが Extensionを管理 所有している 派⽣クラスの情報を参照して XMLを作成 派⽣クラスから 基底クラスのExtension を参照し, XMLを取得できる
&YUFOTJPO0CKFDUύλʔϯ • Extensionを挿⼊したり,消去したりすることが出来るのが特徴 • 柔軟性が⼤きい • 実際にこれが必要になる機会は少ない
݁ • Visitor系のパターンは既存のクラスに変更を加えずに, クラス階層構造の振る舞いを変更できる • OCPを維持する⼿助けとなる • 異なる機能がクラス内に分散するのを防ぐ • CCPを維持する⼿助けとなる
• SRP,LSP,DIPにも適合 • Visitorパターンで解決出来る問題はもっとシンプルな⽅法で解決出来る 可能性があるから懐疑的な態度を持とう
Ҿ༻ • ロバート・C・マーチンほか.アジャイルソフトウェア開発の奥義 第 2版 オブジェクト指向開発の神髄と匠の技. SBクリエイティブ, 2008 26