前にコードレシピにあげたRxのサンプルへのありがたいご指摘のまとめ

以前にコードレシピにあげたサンプル
■Reactive Extensionsを使用してTwitterから非同期にデータを取得し表示する
について、なんとMicrosoft MVPでRxの日本での開拓者(と僕が思っている)neueさんがブログで取りあげてくださって、よりよい書き方についてご指摘下さった。
(ブログ記事自体は僕のサンプルのことがメインではなく、Rxを使っての再帰的な辿り方やAsyncCTPとの連携など幅広く、深い記事です。是非、最後まで読んでみてください)
■非同期の再帰的な辿り方、或いはRxとC# 5.0 Asyncの連携について

サンプルをあげた時のブログにも書いたけど、てさぐり状態だったのでneueさんからのご指摘は大変ありがたかった。
で、そのまとめ

  • (引用)単純なものは演算子の組み合わせで、複雑なものは素直に偉大なるコンパイラ生成(yield return)に頼る。そういう切り分けがLINQ的には大事
    • 今思えば、もっと素直に頭を使えば良かった。(つまり、yieldを使えば良かった) Modelを考えるとき、TwitterAPIの引数と戻り値の形式にこだわってしまったのが失敗だったかなあと。大事なことはTwitterAPIに形式を合わせることではなく、結果(Friends)をできるだけ取得しやすいように取得することなんだから、Jsonの形に合わせたUsersResultで返すより、IEnumerableの方が扱いやすいのは至極当たり前のことだった。
  • (引用)IEnumerableとIObservableに両対応できてる、という柔軟性
    • 前述の通りyieldを使いIEnumerableとして返しておけば、その処理を非同期で(バックグラウンドで)行って結果を取得したい場合はToObservableで良い。「同期的か、非同期かは呼び出し側が決めれば良く、その切り替え(同期的取得or非同期での取得)も呼び出し側で簡単にできる」と言うことは非常に重要(というかもともとIOvservableがIEnumerableとの対称性を意識して作られているのはそのことが主目的だろうし...)だと改めてご指摘を受けて考え直した、どうも知らないメソッド(この場合はGenerate)の使い方を考えるのに一生懸命で、本質的なことを見失っていたよう。木を見て森を見ずとはこのことか。
  • もうざっくり「非同期」ってゆうのやめよう
    • サンプルのタイトル「Twitterから非同期にデータを取得し表示する」についてなのだけれども、これだとどの部分が非同期処理なのかが不明確。ご指摘にある通りWebサービスへのアクセス自体は同期的に行っている。どちらかというと「UIスレッドではないバックグラウンドスレッドでデータを取得し、表示するサンプル」等にした方が的確だなと。これは反省。

僕のサンプルに関してのまとめは以上。
てさぐり状態の中でとても勉強になりました。
neueさんには大変感謝しています。
あと、neueさんの記事にはAsyncCTPとの連携についても書かれていて、Asyncについても追っていかなきゃなと思った。
がんばれ俺。