void Update() {
    this.UpdateAsObservable().Subscribe(_ => Foo());
}- 毎フレームObsrevableが生成されてしまう
 - 端末がアツくなる
 - 覚えたての頃にありがち
 
一回だけ呼びましょう
void Start() {
    this.UpdateAsObservable().Subscribe(_ => Foo());
}void Start() {
    // ボタンを押したら通信する
    _button1.OnClickAsObservable
        .Subscribe(_ => {
            apiClient.Foo().Subscribe(response => {                
            })
        });
    // ボタン押したらUpdateのストリームが作られる
    _button2.OnClickAsObservable
        .Subscribe(_ => {
            this.UpdateAsObservable().Subscribe(_ => Foo());
        });
}- ストリームがガラッと変わるときにたまに見る
 - イベント駆動でObservableを作りたいときにたまにみる
 - ネストしてるのでけっこうつらい
 
- 入れ子Subscribeは大体一本にできます
 
void Start() {
    // ボタンを押したら通信する
    _button1.OnClickAsObservable
        .ContinueWith(_ => apiClient.Foo())
        .Subscribe();
    // ボタン押したらUpdateのストリームが作られる
    this.UpdateAsObservable()
        .SkipUntil(_button2.OnClickAsObservable())        
        .Subscribe(_ => Foo());
}void Start() {
    var stream =_button.HogeAsObservable().Share();
    stream.where(hoge => hoge.State == State.Foo).Subscribe(hoge => hoge.Foo());
    stream.where(hoge => hoge.State == State.Bar).Subscribe(hoge => hoge.Bar());
    stream.where(hoge => hoge.State == State.Buz).Subscribe(hoge => hoge.Baz());
}- Hot変換などで、状態に応じた購読処理をストリームごと分岐している
 - 状態ごとにストリームが増えてしまう
 - 購読処理は短くなるが、そもそもそのコンテキストはストリームごと変えてしまってよいのか
 - DRYっぽくない(個人の感想)
 
- Streamは分岐が得意ではないので素直にSubScribe内で分岐しましょう
 
void Start() {
    _button.HogeAsObservable()
           .Subscribe(hoge => {
               switch(hoge.State) {
                   case Foo:
                      hoge.Foo();
                      break;
                   case Bar:
                      hoge.Bar();
                      break;
                   case Baz:
                      hoge.Baz();
                      break;                      
               }
           });
}void Start() {
    var localBar;
    _button.HogeAsObservable()
           .Select(hoge => hoge.Fuga)
           .Where(fuga => fuga.Foo)
           .SelectMany(apiClient.ConnectBar)
           .Where(response => response.Success)
           .Do(response => localBar = response.Bar)
           .SelectMany(apiClient.ConnectBaz)
           .Where(response => response.Success)
           .Select(response => response.Baz)
           .Subscribe(baz =>  {
               view.Text = $"{localBar}:{baz}";
           });
}- 一本のストリームでやってることがでかい
 - Subscribeの内容が薄い
 - オペレータが便利故にすべて任せられるので、結果可読性がつらい
 - ラムダでアレコレするので名前を放棄しがち
 
適切な分割を心がけましょう
ReactiveProperty<Bar> bar = new ReactiveProperty<Bar>();
ReactiveProperty<Baz> baz = new ReactiveProperty<Baz>();
// �テキストを作るだけ
Observable.Zip(bar, baz, (bar, baz)=> $"{localBar}:{baz}").SubscribeToText(view);
_button.HogeAsObservable()
       .Select(hoge => hoge.Fuga)
       .Where(fuga => fuga.Foo)
       .SelectMany(ConncetBarObservable)
       .SelectMany(ConncetBazObservable)
       .Subscribe();
private IObservable<Bar> ConncetBarObservable(Foo foo) {
    return apiClient.ConnectBar(foo)
                    .Where(response => response.Success);
                    .Select(response => response.Bar);
}
private IObservable<Baz> ConncetBazObservable(Bar bar) {
    return apiClient.ConnectBaz(bar)
                    .Where(response => response.Success)
                    .Select(response => response.Baz);
}- ストリームは分岐へた
 - ストリームは適切に分割を
 - 手続き的に書くのも大事