MVVMにおいてVMで非同期は必要か?async void/Taskのどちらが良いか?非同期処理の例外ハンドリングは?

C# MVPを始めとした方々がガチ議論!(誰でも編集可なので抜け等あればご自由に)
9
前へ 1 ・・ 4 5 次へ
neuecc @neuecc

@ugaya40 いや、Testメソッド内部の話です、例にあげてもらったのはしてますよね。

2014-12-11 19:23:59
尾上 雅則 @ugaya40

@neuecc あ、なのでTestメソッド内部はちゃんと例外が発生する可能性のある非同期メソッドの呼び出しに責任を持つってことです。Testメソッドで例外が発生して、VM側にその例外をどうするかという選択肢があるべきではないので。

2014-12-11 19:26:26
neuecc @neuecc

@ugaya40 同期の時は選択肢があるのに、非同期の時は選択肢がない、ってことでいいですか?それを「良い」とするのは納得できない話ではないですけれど。

2014-12-11 19:28:36
尾上 雅則 @ugaya40

@neuecc 同期の時もないです。例外が起こった時の対応はPresenPlat関係なく決まるのでModel内で完結しますから。どうしょうもないのだけ集約エラーハンドラ、非同期のGetTextとかVMからよばれないやつはasync Taskです

2014-12-11 19:30:40
neuecc @neuecc

ちなみにこのコードはアプリを殺せるので、async voidが危険(ネストさせた時の挙動は予測困難)なのはカワリマセン。 gist.github.com/neuecc/563b4a9…

2014-12-11 19:32:56
neuecc @neuecc

@ugaya40 んー、同期の時は「しようと思えばできる」はず。しようと思えばできるか、しようと思ってもできないかが違いだと思ってます。

2014-12-11 19:36:11
neuecc @neuecc

なんで死ぬのかは宿題ということで。

2014-12-11 19:36:21
尾上 雅則 @ugaya40

@neuecc しようと思ってはいけないわけで、だから相性が悪いのはないかという最初の結論にいたったわけです。

2014-12-11 19:36:57
neuecc @neuecc

@ugaya40 async Taskのほうがしようと思いたい度が強まるってことですか?async voidは根本的にできない。voidはできるけどしようと思いにくい。async Taskはしようと思いたくなる。という?それなら完全に慣習の問題では。

2014-12-11 19:38:08
尾上 雅則 @ugaya40

@neuecc 慣習の問題かどうかでは確かに悩んでいます。そして慣習ならasync Taskの方がいいに決まってる。でもTaskだとVM側から呼びっぱなしにすると警告なわけで慣習の問題を超えてる感を感じます。

2014-12-11 19:39:47
neuecc @neuecc

@ugaya40 ええと、だからバインディングエンジンが問題で、エンジンにTaskごと返せるようになるべき、というのが私の言い分ですねー。ただしこれは理想論かもしれません。

2014-12-11 19:41:19
尾上 雅則 @ugaya40

@neuecc なるほど。おっしゃる事はわかりました。そこら辺日曜の夜少し話せるとうれしいです。結構頻繁に考えます。

2014-12-11 19:44:09
ぐらばく☪ @Grabacr07

私が WPF アプリ書くと Model との I/F に Task なんて出てこないのでそのコンテキストで async/await 使ったことがないマン

2014-12-11 19:51:13
neuecc @neuecc

ウィンドウごと殺す危険なasync voidコードの答え合わせ。 gist.github.com/neuecc/da94a47…

2014-12-11 19:54:30
neuecc @neuecc

Rx使うとSubscribeがFireAndForget的になりますからネ。

2014-12-11 19:58:33
ぐらばく☪ @Grabacr07

View は Model の状態を表示 & 変化させているに過ぎないし、View (ViewModel) が Model に対して操作 (= Task (= 終了を待つ必要のある動作)) を要求する必要があるケースに今のところ出会っていない

2014-12-11 20:13:51
ぐらばく☪ @Grabacr07

だからこそ、ViewModel -> Model は戻り値 void を同期で叩く以外にないし、ViewModel で await なんてするわけがないし、Model が VM に叩かせる前提での Task を公開した時点で負け という考えでいつもアプリ書いてますね

2014-12-11 20:14:11
ぐらばく☪ @Grabacr07

なので V での await 要求される WinRT あんまり好きくない

2014-12-11 20:16:32
neuecc @neuecc

ViewModelがawaitするかっていうよりも、ViewModelが持て余すTaskをどうするかってことですにゃ。これはフレームワークが解答のガイドを掲示してあげるべき(AsyncCommandなりなんなりね)。現状、結論づいていないなら持て余しちゃうのはしょうがない。

2014-12-11 20:18:45
neuecc @neuecc

ただし間違いなくC#的に言えるのはasyncのシステム上、async voidするなら最上位であるべき。Modelは間違いなく最上位にはならないので、Modelがasync voidするという点だけは恐らくどう転んでも推奨できない。

2014-12-11 20:19:04
ぐらばく☪ @Grabacr07

なので私は結局 Model でも基本的に async/await 使わないので、実際ほんとに使ったことがあんまりないのですわ

2014-12-11 20:27:14
neuecc @neuecc

@Grabacr07 asyncと向きあいましょう!ReadAsyncからはじめるasync!

2014-12-11 20:28:19
尾上 雅則 @ugaya40

ん?僕のさっきまで出したサンプルも結局Modelのルートからasync消えましたよ。同じくほとんど使う事がないので苦しみました。

2014-12-11 20:34:39
尾上 雅則 @ugaya40

Retryとかの柔軟性でRx好きまんなのでRxを基本使うしな

2014-12-11 20:35:22
尾上 雅則 @ugaya40

やっぱりasyncから離れてくな。

2014-12-11 20:36:26
前へ 1 ・・ 4 5 次へ