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

Application Design 勉強会 #4

Application Design 勉強会 #4

Application Design 勉強会 #4

Kazuki Chigita

July 17, 2019
Tweet

More Decks by Kazuki Chigita

Other Decks in Technology

Transcript

  1. Application Design勉強会
    13-15章
    Wed Jul 17
    Kazuki Chigita

    View Slide

  2. はじめに
    • 第3部の意義
    • デザインパターンを学ぶ.

    View Slide

  3. 今⽇話すこと
    • Commandパターン
    • ActiveObjectパターン
    • TemplateMethodパターン
    • Strategyパターン
    • Facadeパターン
    • Mediatorパターン

    View Slide

  4. 今⽇話すこと
    • Commandパターン
    • ActiveObjectパターン
    • TemplateMethodパターン
    • Strategyパターン
    • Facadeパターン
    • Mediatorパターン

    View Slide

  5. Commandパターン
    • 以下のようなinterfaceを用意する.
    • 利用するときはCommandを実装する.
    • 何がうれしいの?
    • この構造にすれば,Commandの実装クラスの詳細を
    知らずとも利用できる.
    • do()をすれば全てのコマンドが操作できる.

    View Slide

  6. Commandパターン
    • 以下のようなinterfaceを用意する.
    • 利用するときはCommandを実装する.
    • 何がうれしいの?
    • この構造にすれば,Commandの実装クラスの詳細を
    知らずとも利用できる.
    • do()をすれば全てのコマンドが操作できる.
    シンプルなCommandパターンでは
    メソッドは⼀つ

    View Slide

  7. Commandパターン
    • 以下のようなinterfaceを用意する.
    • 利用するときはCommandを実装する.
    • 何がうれしいの?
    • この構造にすれば,Commandの実装クラスの詳細を
    知らずとも利用できる.
    • do()をすれば全てのコマンドが操作できる.
    シンプルなCommandパターンでは
    メソッドは⼀つ
    それぞれでdo()をoverrideする.

    View Slide

  8. Commandパターン(例1)
    • Transactionでの利用
    • 使う側は同様にTransactionを実装(override)
    • メリット1 : ビジネスロジックとチェック機構の分離
    • メリット2 : 一時保存 / 時間差実行の実現

    View Slide

  9. Commandパターン(例1)
    • メリット1 : ビジネスロジックとチェック機構の分離
    • validate() はGUI等からも使われる有効性の
    チェックが具体的な登録処理を含むのは危ない.
    • validate()はデータベースの詳細を知ることがな
    いので,ここでも分離ができている.
    • メリット2 : 一時保存 / 時間差実行の実現
    • validate()の後,すぐにexecute()を呼び出す
    必要はない.
    • execute()だけバッチ処理的に時間差で実行しても
    なんの問題もない.
    • 分離することで,一時的に状態を保持しておく構造
    ができている.

    View Slide

  10. Commandパターン(例2)
    • Undo機構の実現
    • Commnadの実装先でdo()の処理内容を記憶す
    る必要がある.
    • undo()はdo()に依存しているので抱き合わせ
    て実装を考える必要がある.

    View Slide

  11. Commandパターンまとめ
    • 普通はクラスに多くのpublic methodをもたせ
    るがそうではなくごく少数に抑えることで,
    見通しを良くする.
    • interfaceの中に複数のメソッドを入れても,そ
    の存在意味を分離させたり(Transactionの例),
    抱き合わせたり(Undoの例)できる.

    View Slide

  12. 今⽇話すこと
    • Commandパターン
    • ActiveObjectパターン
    • TemplateMethodパターン
    • Strategyパターン
    • Facadeパターン
    • Mediatorパターン

    View Slide

  13. ActiveObjectパターン
    • Commandパターンの利用例
    • イベント駆動型やマルチスレッドを実現するた
    めのパターン
    ActiveObjectEngine : Commandのリストを持ち,
    これらの実⾏を管理する
    Command : Interface.Commandパターン.
    SleepCommand: Commandの実装クラス

    View Slide

  14. ActiveObjectパターン

    View Slide

  15. ActiveObjectパターン
    ActiveObjectEngine
    itsCommands
    SleepComand
    HogeComand (wakeupCommandとして持っていると仮定)

    View Slide

  16. ActiveObjectパターン
    ActiveObjectEngine
    itsCommands
    SleepComand
    HogeComand (wakeupCommandとして持っていると仮定)

    View Slide

  17. ActiveObjectパターン
    ActiveObjectEngine
    itsCommands
    SleepComand
    SleepTimeの間これを繰り返す.
    HogeComand (wakeupCommandとして持っていると仮定)

    View Slide

  18. ActiveObjectパターン
    ActiveObjectEngine
    itsCommands
    SleepComand
    SleepTimeの間これを繰り返す.
    HogeComand (wakeupCommandとして持っていると仮定)
    SleepTimeが終わったらこっちが登録される.

    View Slide

  19. ActiveObjectパターン
    ActiveObjectEngine
    itsCommands
    SleepComand
    SleepTimeの間これを繰り返す.
    HogeComand (wakeupCommandとして持っていると仮定)
    SleepTimeが終わったらこっちが登録される.

    View Slide

  20. ActiveObjectパターン

    View Slide

  21. ActiveObjectパターンまとめ
    • 本来はブロッキング処理等で処理を止めて,
    itsCommandsを複数のスレッドにわたしてあ
    げると簡易的なマルチスレッド処理に実現がで
    きる.
    • イベント駆動型の真髄はこういうパターンだ.
    • Commandパターンをうまく活用している例.

    View Slide

  22. 今⽇話すこと
    • Commandパターン
    • ActiveObjectパターン
    • TemplateMethodパターン
    • Strategyパターン
    • Facadeパターン
    • Mediatorパターン

    View Slide

  23. TemplateMethodパターン
    • 課題 : 似た処理がアチラコチラに出てくる.
    パターン化した処理がコピペで煩雑に使われて
    いる.
    • 解決法
    • 共通化や概念化できる大きな枠としての処理を
    abstract class(抽象基本クラス)に持っていく.
    • 上の概念化されたクラスを継承先で具体的なクラス
    実装を行う.
    • 例 : Bubble Sortをどう扱うか

    View Slide

  24. TemplateMethodパターン
    • BubbleSorter という abstractクラスを作成し,
    ここに大枠の実装の処理を委ねる.
    • これを継承するクラスで詳細を実装することで
    共通化を図る.
    BubbbleSorter
    {abbstract}
    IntBubbbleSorter
    DoubleBubbble
    Sorter

    View Slide

  25. View Slide

  26. TemplateMethodパターン
    • 問題点
    • BubbleSorterという名前にしてることからも分かる
    通り,swap(index: Int)や,
    outOfOrder(index: Int)は,他のアルゴリズム
    で利用できない.
    • BubbleSortのための再利用性はあるが,
    他アルゴリズムのために使うことができない.

    View Slide

  27. 今⽇話すこと
    • Commandパターン
    • ActiveObjectパターン
    • TemplateMethodパターン
    • Strategyパターン
    • Facadeパターン
    • Mediatorパターン

    View Slide

  28. Strategyパターン
    • 課題 : 似た処理がアチラコチラに出てくる.
    パターン化した処理がコピペで煩雑に使われて
    いる.(TemplateMethodパターンと同じ)
    • 解決法
    • 汎用的な部分や概念的な部分を抽象クラスで実装せ
    ずに,Handleクラスのようなものに持っていく
    • 実装すべきものはinterfaceに切り出す
    • 例 : Bubble Sortをどう扱うか

    View Slide

  29. View Slide

  30. View Slide

  31. Strategyパターン
    • 良い点
    • TemplateMethodパターンの課題を解決している.
    • SortHandleを他のソートパターンでも利用できる
    • interfaceで切り出しているので,
    DIPと相性がいい.
    • BubbleSortのみにとどまらない再利用性が高い.
    • 問題点
    • 実装が少し多くなる
    • (こういうパターンはStrategyパターンで解決
    するのが現状良さそう)

    View Slide

  32. 今⽇話すこと
    • Commandパターン
    • ActiveObjectパターン
    • TemplateMethodパターン
    • Strategyパターン
    • Facadeパターン
    • Mediatorパターン

    View Slide

  33. Facade & Mediator パターン
    • 課題 : クラス間の結合度を下げたい.
    • 解決方法
    • Façade
    • 上から抑える(wrapする)
    • Mediator
    • 下から抑える(Mediatorにやってもらう)

    View Slide

  34. Facade & Mediator パターン
    • 課題 : クラス間の結合度を下げたい.
    • 解決方法
    • Façade
    • 上から抑える(wrapする)
    • Mediator
    • 下から抑える(Mediatorにやってもらう)

    View Slide

  35. Facadeの場合
    P224 図15-1より

    View Slide

  36. Facadeの場合
    P224 図15-1より
    集約点を作る

    View Slide

  37. Mediatorの場合

    View Slide

  38. Mediatorの場合

    View Slide

  39. 使い分け
    • FacadeとMediatorの使い分け
    • 明示的に方針を示したいとき.集約点を作りたいと
    き→Façade
    • 非明示的に方針を課したいとき→Mediator

    View Slide