Address
:
[go:
up one dir
,
main page
]
Include Form
Remove Scripts
Accept Cookies
Show Images
Show Referer
Rotate13
Base64
Strip Meta
Strip Title
Session Cookies
More Web Proxy on the site http://driver.im/
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
140
Visitorパターン
k-kohey
October 28, 2019
Tweet
Share
More Decks by k-kohey
See All by k-kohey
ゲームボーイアドバンスでSwiftを動かそう
k_koheyi
0
800
Swift Package Mangerのバグを直した話
k_koheyi
2
1.3k
swift-async-algorithms...? へえ…面白そうじゃん…?
k_koheyi
3
1.4k
[社内勉強会]Parchment-swiftの実装説明
k_koheyi
0
110
[社内勉強会]Combineの説明
k_koheyi
0
28
あるインスタンスの取る値が 何パターンあるか数えてみるンゴ!
k_koheyi
1
140
Tuistを用いた Xcode Project管理の紹介
k_koheyi
0
170
SwiftでわかるSOLID原則 iOSDC 2020
k_koheyi
3
2.7k
Application Design 勉強会23-25章
k_koheyi
0
61
Other Decks in Programming
See All in Programming
Recoilを剥がしている話
kirik
5
6.6k
Keeping it Ruby: Why Your Product Needs a Ruby SDK - RubyWorld 2024
envek
0
180
モバイルアプリにおける自動テストの導入戦略
ostk0069
0
110
Cloudflare MCP ServerでClaude Desktop からWeb APIを構築
kutakutat
1
540
PHPとAPI Platformで作る本格的なWeb APIアプリケーション(入門編) / phpcon 2024 Intro to API Platform
ttskch
0
150
ソフトウェアの振る舞いに着目し 複雑な要件の開発に立ち向かう
rickyban
0
890
たのしいparse.y
ydah
3
120
開発者とQAの越境で自動テストが増える開発プロセスを実現する
92thunder
1
180
コンテナをたくさん詰め込んだシステムとランタイムの変化
makihiro
1
120
ゆるやかにgolangci-lintのルールを強くする / Kyoto.go #56
utgwkk
1
370
useSyncExternalStoreを使いまくる
ssssota
6
1k
わたしの星のままで一番星になる ~ 出産を機にSIerからEC事業会社に転職した話 ~
kimura_m_29
0
180
Featured
See All Featured
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.3k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Writing Fast Ruby
sferik
628
61k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.3k
Making the Leap to Tech Lead
cromwellryan
133
9k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
170
Automating Front-end Workflow
addyosmani
1366
200k
A Tale of Four Properties
chriscoyier
157
23k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
28
900
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
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