Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ObserverパターンからはじめるUniRx

3,845 views

Published on

Gotanda.unity #8 in ワンダープラネット株式会社 @渋谷 https://gotanda-unity.connpass.com/event/97806/
 での発表資料です

Published in: Technology
  • Login to see the comments

ObserverパターンからはじめるUniRx

  1. 1. Observerパターンから はじめるUniRx 2018/09/26 とりすーぷ
  2. 2. 自己紹介 • とりすーぷ(@toRisouP) • 株式会社バーチャルキャスト所属
  3. 3. UniRx •むずかしい • どこから手を付けていいかわからない • 動作原理がわからない
  4. 4. ObserverパターンとUniRx • UniRxのベースはGoFのObserverパターン • Observerパターンを覚えればUniRxは8割は理解できる • UniRxで登場する主要インタフェースの意味を理解しよう
  5. 5. Observerパターン
  6. 6. Observerパターン • イベントの発行・購読を実現するデザインパターン • 「Observer」と「Subject」の2者が登場する
  7. 7. ObserverとSubject • Observer • 観察者、イベントリスナ、メッセージの受信側 • Subject • 観察対象、イベントの発行側 • 自分を購読しているObserverを全員記憶している
  8. 8. 2者の関係 • 「ObserverがSubjectを観察する」 • 実際は、Subjectが各Observerを管理する • SubjectがObserverにメッセージを送る
  9. 9. Observerパターンを作ってみよう
  10. 10. シンプルなObserverパターン • シンプルなObserverパターンを実装してみよう • UniRxよりもずっとシンプルなもの
  11. 11. つくるもの • IMyObserver<T>インタフェースと、その実装 • MySubject<T>クラス
  12. 12. IMyObserver<T>インタフェース • メッセージの受信を表現するインタフェース
  13. 13. Observerの具体的な実装 • PrintObserver • 受信メッセージをログに出すだけ
  14. 14. MySubject<T>クラス
  15. 15. MySubject<T>クラス(上半分)
  16. 16. MySubject<T>クラス(下半分)
  17. 17. 使用例
  18. 18. Observerパターンそのものは簡単 • Observerを登録してメッセージを送るだけ • 名前と挙動が一致していないところがややこしい • Subject側がObserverへの参照を持つ(参照関係に注意!) • 「Observer」という名前のくせに、こいつは受け身
  19. 19. ObserverパターンからUniRxへ
  20. 20. シンプルなパターンからUniRxへ • 自前実装をUniRxへと置き換えていく • 置き換えていく途中で、 UniRxでよく使うインタフェースが登場する
  21. 21. UniRx.IObserver<T> • IMyObserver<T> → UniRx.IObserver<T> • .NET 4.6のときはSystem.IObservable<T>になる点に注意
  22. 22. UniRx.IObserver<T> • OnRecieved()がOnNext() に変わった • OnError()とOnCompleted()が増えた 1つのインタフェースで3種類のメッセージを同時に 扱うことができるようになった!
  23. 23. PrintObserverをIObserver<T>へ
  24. 24. UniRx.Subject<T> • 下準備 • MySubject<T>のインタフェースを分解する
  25. 25. Observerを扱う部分をインタフェースに切り出す
  26. 26. UniRx.IObservable<T> • RegisterObserver() が Subscribe() に変わった • UnRegisterObserver() が IDisposable.Dispose()になった
  27. 27. Subjectのメッセージ送信 • IObserver<T>で代用ができそう! • OnNext()がそのままメッセージの「入力」に使える
  28. 28. ISubject<T>インタフェース • 「Subjectである」ということを明示するインタフェース • SubjectはIObserver<T>とIObservable<T>の両方を実装する
  29. 29. MySubject<T> -> UniRx.Subject<T> • UniRx.Subject<T> は ISubject<T>を実装している • 中身はめっちゃ長いので省略
  30. 30. 使用例
  31. 31. いつもSubscribe()でラムダ式使ってるじゃん? • 本来Subscribe()は、IObserver<T>しか引数にとらない
  32. 32. 拡張メソッドが用意されているから! • IObservable<T>に拡張メソッドが用意されている • デリゲートを渡すと内部でObserverのインスタンスを生成してくれる
  33. 33. 拡張メソッドを使った記法 • これでいつものUniRxの感じになった
  34. 34. UniRxのインタフェース • IObserver<T>インタフェース • メッセージを受け取る機能が定義されている • IObservable<T>インタフェース • IObserver<T>を登録できる機能が定義されている
  35. 35. UniRx is Observerパターン • 動作原理はまんまObserverパターン • UniRxの各インタフェースの意味が理解できた • IObservable<T>の本来の意味 • IObserver<T>の重要性
  36. 36. Operator
  37. 37. こういうことできそうじゃない? • IObserver<T>とIObservable<T>を両方実装した何かを 作ればメッセージ伝達処理の途中に機能を付け足せない?
  38. 38. Operator • IObserver<T>とIObservable<T>の2つの実装するもの • Subject -> Observer間に挟まってメッセージ処理を行う • ちなみにこういうの「Decoratorパターン」っていいます
  39. 39. Operatorの使用例
  40. 40. Scheduler
  41. 41. Scheduler • メッセージの処理タイミングや、処理スレッドを管理するもの • UniRxは基本的にUnityのWaitForSecondsを使って時間を計測する (MainThreadScheduler) • WaitForSecondsが嫌なら他のSchedulerに差し替えれば、 時間の計測方法を切り替えられる
  42. 42. Observable
  43. 43. Observable • 発行されたメッセージは、いくつかのOperatorを経由し、 末端のObserverへと到達する • このメッセージが伝達される経路・仕組み・機構を Observableと呼ぶ • 「ストリーム」って呼ばれてたりもする
  44. 44. Observable • 「Observable」に対して「Observer」が「Subscribe」する
  45. 45. UniRxを構成する3大要素 • Observable • メッセージシーケンスを扱う機構 • Operator • Observableに機能を付与する機構 • Scheduler • Observableの時間管理・スレッド管理を担当する機構

×