忍者ブログ
おそらく活動状況とか、他愛もないこととか書きます。 μ崎みのりの気ままで気まぐれなブログです。 作曲とか、ゲーム製作なんかしてます。
[580]  [579]  [578]  [577]  [576]  [575]  [574]  [573]  [572]  [571]  [570
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

昨日、リアクティブエクステンションが流行というのと、
私なりに問題があるんじゃないかと思ってそれについて少し書きましたが、
実装の段階で自分の間違いに気づきました。
くれぐれも、昨日の記事を参考にしてIObserver<T>の類似インターフェイスを作らないで下さい。
それは一時の気の迷いです。
以下、反省点と未来の自分へのメモ。

【Awaitable と Observable の違い】
●Awaitable (待機できる)
.NETがasync / await を使用するための条件としている実装パターン。
何らかのプロセスの完了を待って、結果(戻り値)を取り出すためにあります(※戻り値が無い場合もありますが、完了を待って「無」を取り出すと考えます)。
.NET でインターフェイスにしなかったのは恐らくTaskより後発だからで、パターンが先にあれば
IAwaitable<T> / IAwaiter<T> インターフェイスみたいなのが用意されていたと思います。

●Observable (観察できる)
Rxの根幹となるパターン。
時間と共に変化する状態に対して、リアルタイムに最新情報を共有するイメージ。
.NET ではインターフェイス IObservable<T> / IObserver<T> が用意されています。
このインターフェイスは GoF の Observer パターンよりちょっと高機能。

●で、どこが違うのか
Awaitable も Observable も時間に関わるパターンなわけですが、
Awaitable が単一の値を通知するのに対して Observable は複数の値を通知する点が違います。
ここが最も重要な違いです。

【Observable と Enumerable の関連性】
「複数の値」といえば .NET のIEnumerable<T> / IEnumerator<T> が思い浮かびます。
GoF の Iterator パターンです。
この2つの違いは、「複数の値」を空間上に並べるか時間上に並べるかの差です。
「時間か空間か」という点を除いて、この2つは完全に一致します。
というか、同じように扱うために「一致するように実装します」。

【なら、Awaitable が対応するものは?】
ここまで考えて、↓の表にたどり着きました。

時間空間
単一の値Awaitable(値)
複数の値ObservableEnumerable

Observable と Enumerableという「複数同士」が対応するなら、
Awaitableに対応する「ひとつ」って何かと考えると、それは単なる変数などの値です。
ここまで分かれば結論まであと少し。

【IObserver<T>のOnCompletedメソッドに引数がない理由】
配列などの列挙可能なものは「0個」である場合があります。
同じように、時間軸に並んだ観察可能なものも、通知すべき値がない、つまり「0個」である場合を表現できるべきです。
この「0個」の表現のためにも、OnCompletedメソッドに引数があってはなりません。
引数がある場合、最低でも1個の値が必要になってしまいます。

【Observable ≠ Awaitable】
昨日の私が勘違いしていた点。
それぞれのインターフェイスを定義する場合でも、IObservable<T> と IAwaitable<T>、
IObserver<T> と IAwaiter<T> に継承関係があってはいけません(私は継承関係を持たせてしまい、実装していくうちに詰まりました)。
これは、int[ ] 型が int 型を継承しないのと同じことです。



……さて、コードの修正に入ります。
PR
この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
忍者ブログ [PR]