Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Visitorパターン

k-kohey
October 28, 2019

 Visitorパターン

k-kohey

October 28, 2019
Tweet

More Decks by k-kohey

Other Decks in Programming

Transcript

  1. ໨࣍ • ষ 7JTJUPSύλʔϯ • 7JTJUPSύλʔϯ • "DZDMJD7JTJUPSύλʔϯ • %FDPSBUPSύλʔϯ

    • &YUFOTJPO 0CKFDUύλʔϯ 2 ط ଘ ͷ ֊ ૚ ߏ ଄ ʹ ख Λ Ճ ͑ ͣ ʹ ৽ ͠ ͍ ϝ ι ỽ υ Λ ௥ Ճ ͢ Δ ͨ Ί ʹ ͸
  2. എܠ • Modemに対応OSが増える毎にModemにインタフェースが増える ⇢ その都度,すべてのモデムソフトウェアを再配布するハメになる 5 <interface> Modem + configureForUnix

    + configureForLinux + configureForWindows …. Hays Zoom Ernie そのモデルが 追加されたOSを サポートするかに 関わらず 必ず変更を要する
  3. 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)
  4. 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)
  5. 7JTJUPSύλʔϯͷ໰୊఺ cยଆͷมߋ͕΋͏ยଆʹ఻ൖ 9 <interface> Modem + accept(ModemVisitor) Hays Zoom Ernie

    UnixModem Configurator <interface> ModemVisitor + visit(Hayes) + visit(Zoom) + visit(Ernie) Visitする側 Visitされる側
  6. 7JTJUPSύλʔϯͷ໰୊఺c7JTJUPSʹ೿ੜΫϥεΛੜ΍͢ͷ͕େม • HogeModemを追加する場合は? • Modemを継承したHogeModemクラスを追加 • ModemVisitorにvisit(:HogeModem)メソッドを追加 • ModemVisitorを継承しているすべての派⽣クラスにvisit(:HogeModem)を追加 •

    UnixModemConfiguration以外にもLinuxModemConfigurationやWindowsModemConfigurationも 考えられる • 実際に必要とならないところにもvisit(:HogeModem)は実装しなくてはいけない ModemVisitorに派⽣クラスがあると(or増やそうとすると) 変更が多くて⼤変
  7. "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
  8. "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
  9. "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の派⽣クラスが増えても 変更が伝搬しない
  10. %FDPSBUPSύλʔϯ • ボリュームの変更を⾏うModemはLoudDialModemを使ってラップする <interface> Modem + dial Hays Zoom Ernie

    LoudDialModem <delegate> システムの他の部分に影響を与えずに ⾳量を上げられる!
  11. ݁࿦ • Visitor系のパターンは既存のクラスに変更を加えずに, クラス階層構造の振る舞いを変更できる • OCPを維持する⼿助けとなる • 異なる機能がクラス内に分散するのを防ぐ • CCPを維持する⼿助けとなる

    • SRP,LSP,DIPにも適合 • Visitorパターンで解決出来る問題はもっとシンプルな⽅法で解決出来る 可能性があるから懐疑的な態度を持とう