WPF(.NET, WinUI) GUIプログラミング Part26

■ このスレッドは過去ログ倉庫に格納されています
2021/06/20(日) 17:04:18.66ID:7UVkl7BZ
Windows Presentation Frameworkについて語るスレ。

前スレ
WPF(.NET4.x, .NET Core) GUIプログラミング Part25
https://mevius.5ch.net/test/read.cgi/tech/1612522463

関連スレ
Windows 10 UWPアプリ開発 Part 2
http://mevius.2ch.net/test/read.cgi/tech/1499658092/

コードを貼る場合は以下のサイトの利用をお勧め。
run codeのチェックは外しておきましょう。
http://ideone.com/
466デフォルトの名無しさん
垢版 |
2021/07/10(土) 11:43:48.27ID:Is4zF1A7
>>462
フレームワークはMが更新されたことをどうやって知るの?
2021/07/10(土) 12:19:02.06ID:uwFcR1va
>>466
ああ、わかったただのMVVMの変種か
今までだって、MVVMで作ってた時はModelでimmutableなのをあったけど、
イメージとしてModelを全部immutableにして、ViewModelのほうに全部押し込めって話か

極端な話Modelを全部immutableにして、後のつじつまあわせは全部ViewModel(Store)で全部やれってことww

負荷が全部ViewModel(Store)にいくってことじゃね??
2021/07/10(土) 12:32:05.86ID:uwFcR1va
今までだって例えばMVVMでTwitterアプリを作るとき
まず、汎用的なTwitterAPIを叩いてPOCOを返すだけのライブラリを作って(A)

(A)を内部で使ったModelを作る
必要ならここでINPCの変更通知を実装(B)

で、後はViewModelをつくるだけど、

(B)をすっとばして、ViewModelで(A)を使ってここですべてやる

こんな感じ??
2021/07/10(土) 12:35:43.17ID:uwFcR1va
だからそもそも今までだってどこのModelか知らんが(A)の部分は汚染されてないけどな..
二つ似たようなの作ってるが..
2021/07/10(土) 12:52:18.73ID:uwFcR1va
もちろん、Modelをmutableにしてもいいけど、ViewModel(Store)内でModelを直接更新するからModelの変更通知機能は全く必要なくて、更新後ViewModel(Store)がViewに状態が変わりましたよって通知できればいい

やっと理解できました
ありがとう
2021/07/10(土) 15:15:27.78ID:xJQjD86t
mvcやらmvvmやらに全てあてはめようとして考えて、
訳わかんない考えに染ってるのばっかだな
2021/07/10(土) 15:53:06.08ID:fmB/UGP2
まあデザインパターン病と同じ。
2021/07/10(土) 16:12:10.43ID:xJQjD86t
>>470
これが何も知らない新人君でもやる普通の実装なんだがな
2021/07/10(土) 18:17:59.49ID:Is4zF1A7
>>470
そうすると複数のビューで一つのモデルを参照しているようなときは
ひとつのVMだか何だかが複数のビューと対話するん?
2021/07/10(土) 18:34:12.08ID:X6uqNK3l
というかこれって答えあるのか?
2021/07/10(土) 18:37:01.39ID:yemPkoko
オブザーバーでも
イベントでも
好きなパターンで実装すればよろし
2021/07/10(土) 18:52:36.88ID:T1N+jIqA
>>470
それは間違いだよw

VMにM更新のロジックを書くなよとw
VMごとにロジック書いて不整合があってバグ発生するだけ
2021/07/10(土) 18:54:15.71ID:T1N+jIqA
VMからMにはメッセージのみ送る

馬鹿はVMからMをいじる
2021/07/10(土) 18:57:20.02ID:T1N+jIqA
WPFで本気でMVVMやりたいならMに通知もみんな書くんだよ
これがモデル汚染

最近はビジネスロジック層を作ってお茶を濁してるけどそれも結局通知はどこなのか普通に迷うところ
2021/07/10(土) 19:16:41.13ID:uwFcR1va
>>479
>WPFで本気でMVVMやりたいならMに通知もみんな書くんだよ
MVVMの話でいいならそれはrigaya?が勝手に言ってるだけだぞ
別に正解の定義なんてないだろうしどっちが正解とは言
言わんが

Modelのメソッドは結果を返さず、メソッドの呼び出しの結果、自身の状態(プロパティ)を変更するだけってやつだろ
2021/07/10(土) 19:28:32.13ID:xJQjD86t
フレームワークの方法論は
その開発者が一方的に押し付けてる理屈なのに
気づけない馬鹿
2021/07/10(土) 19:35:48.59ID:T1N+jIqA
違うよ
知性の問題だ
それが理解できない馬鹿がバグを量産する
2021/07/10(土) 19:36:54.45ID:T1N+jIqA
馬鹿が自分が馬鹿でないと思って偉そうに何年もクソコードを書いてMVVM最高と言ってるだけだ
2021/07/10(土) 19:38:06.79ID:uwFcR1va
うん、rigayaは開発者じゃないしね
2021/07/10(土) 19:40:04.65ID:T1N+jIqA
>>484
うがやじゃなくてお前ともう一人が馬鹿なんだ

やっと理解できましたじゃねーよ
2021/07/10(土) 19:43:32.20ID:xJQjD86t
modelとviewModelの責務分けは
馬鹿には出来んよなーー
2021/07/10(土) 19:47:15.76ID:uwFcR1va
外人でrigayaと同じ主張してる人見たことない
Modelで通知をするのが普通とか言ってるのはお前が勝手に思ってるだけ

>>481でMVVMを本当に作った人が特定できるならまずそれを特定してくれ。で、Modelで変更通知を実装するのが普通ってどこに書いてあるか教えてくれ
2021/07/10(土) 19:52:15.95ID:uwFcR1va
もちろん、ViewModelはビューの状態を保持し、Modelに対してはModelのメソッドを呼んで
ビューに関するロジックを書くだけだぞ

Modelに変更通知機能あるかないかは全く関係ない話

勝手にModelに変更通知があるのが普通と思ってのはお前
2021/07/10(土) 19:52:27.91ID:xJQjD86t
フレームワークつかうと
やっぱ宗教じみた変なのが誕生するなーー

まずはプリミティブなライブラリのみ使用して
デザインパターンとか理解してみる事をおすすめする
2021/07/10(土) 20:01:26.66ID:16vz6VAu
>>478
「メッセージのみ送る」と「いじる」の違いはこいつの頭の中にしか無いんだろうな。
2021/07/10(土) 20:06:44.05ID:uwFcR1va
MVVMでViewModelの責務は>>488なだけ

Modelが変更通知を実装するしないかは関係ない

MVVM黎明期、rigaなんとだけが日本で声上げたからあいつの馬鹿信者が増えたんだろう
しかも日本だけ笑い
2021/07/10(土) 20:17:00.58ID:MxfUHgdm
だから>>362で最初からバインディングはVVMまででいいって言ってるじゃん
何をそんな喧嘩腰で議論する必要があるのか
2021/07/10(土) 20:23:04.54ID:xJQjD86t
“model” と “view、viewModel” の開発者は
分けた方がいいかもな

modelだけで業務が回せるようになってればいいだろ
実際modelはpythonで実装するの増えて
担当者も異なる事が多いわ
2021/07/10(土) 20:43:24.78ID:Is4zF1A7
>>492
バインディングの話じゃないって分かってない?
2021/07/10(土) 20:55:14.46ID:MxfUHgdm
>>494
え?変更通知なんだから要はバインディングの話でしょ?
2021/07/10(土) 21:06:48.12ID:o3oxPhaH
今日だけで50レスも進んでるのか
ヒマすぎだな
2021/07/10(土) 21:45:12.95ID:uwFcR1va
例えば、ModelがImuutableでINPCを実装しないとするよ。で、Modelの更新はModelのメソッドを呼んで、
メソッドの戻り値として新しいインスタンスを返すとする
class Model { // ImmutableなINPCを実装しない
 public Task<Model> UpdateAsync() <- 新しいインスタンスを返す
}

で、ViewModelから更新かけるとき、更新後、最新の情報に更新する必要あるなら、それは
あくまで表示の都合だから、ViewModelにそのロジックを書いて問題ないだろ??

class ViewModel {
 public void Hoge() {
  var result = await model.updateAsync()
  // resultの結果を元にViewModel更新
 }
}

ModelがINPCを実装するかなんて本来はMVVMには関係なく俺にはこれも立派なMVVMにしか見えねぇわww
2021/07/10(土) 21:59:07.18ID:uwFcR1va
もちろん、MVVMの厳格な定義なんて知らないし、極論すれば言葉の問題になるから
どっちが正解なんて言うつもりはないが、

rigaなんとか的に
「ModelはINPCを実装して、Modelのメソッドは戻り値は返さないで、
メソッドの呼び出しの結果自身の状態を変更し、INPC経由でViewModelに通知する」


おまえらこれだけがMVVMだと思ってるだけじゃんw
2021/07/10(土) 22:07:37.44ID:321/A5HW
>>497
うん、これが王道の作り方
2021/07/10(土) 22:14:04.55ID:uwFcR1va
悪いけど売られた喧嘩で言わしてもらうが
>>485,486,490

はバカ三兄弟だわww
2021/07/10(土) 22:54:51.35ID:x1ppTpnc
ID:uwFcR1va
この人のサーバーサイドには
何が実装されてるのだろうか...
2021/07/10(土) 22:55:10.24ID:16vz6VAu
>>500
なりほど、お前さん>>478の言う「メッセージのみ送る」と「いじる」の違いが理解できるならちょっと説明してみてくれないか。
2021/07/10(土) 23:07:03.07ID:uwFcR1va
>>502
あ、ごめんひょっとして間違ってたら謝るわ

>>490って俺に対するあてつけ?じゃなかった??
ただの>>478へのレスなら謝るわ。すみませんでした。

つか、あとrigaじゃなくてググるとugaだったw
2021/07/10(土) 23:59:12.78ID:Wb8JMrdb
awaitはasyncが必要だろう。
2021/07/11(日) 00:15:04.56ID:BeeJLMuH
読みづらいからよ
続けるなら名前欄にスタンスを書いてくれないか
2021/07/11(日) 01:46:58.32ID:2ghBsept
やっぱりWPFはめんどくさいなw
507デフォルトの名無しさん
垢版 |
2021/07/11(日) 02:11:56.24ID:vIt/TVMn
>>495
そこまで話を広げるとMに通知機能があろうが無かろうが全部バインディングだろうよ
今問題になってんのはVはVMに依存してる前提で
VMとMの問題だと思うんだが違うんかな
508デフォルトの名無しさん
垢版 |
2021/07/11(日) 02:13:20.15ID:vIt/TVMn
>>506
WPFはめんどくさいっていうのが他の後発フレームワークとの比較なら分かるけど
WinFormと比較するんだったら比べものにならないくらい簡単だぞ
2021/07/11(日) 02:52:00.72ID:OgOa7vqd
>>508
ほんまかいな
2021/07/11(日) 02:59:38.37ID:bArpP16/
楽⇔面倒
簡単⇔難しい
単純⇔複雑
区別できない奴多すぎでは
2021/07/11(日) 08:40:13.02ID:x50DSKku
>>501
予想
ID:uwFcR1va 氏の構成

(client)
View
ViewModel
Model
Database Client Library


↑↓

(server)
Database Server
2021/07/11(日) 12:56:04.27ID:qjFfZwWG
一人ホームラン級の馬鹿がずっとレスしてるだけだな

MVVMでMから変更通知出すのは当たり前
VMでモデル変更して通知と言うけどモデル内で変更が生じた場合VMが変更通知出してるのかw?

VMは画面ごとに作るけどMに対応した処理はどこに書かれるんだ
まさか画面ごとか?
2021/07/11(日) 13:02:33.38ID:qjFfZwWG
MVVMが便利なのはMを操作すると通知が飛んで画面更新通知を自分でしなくて良いところ
それをVMで自分でやると言うのだから無意味なMVVMに感じる

VMで手作業の通知忘れるとバグが出る
Mに通知機能があれば通知忘れバグはない
2021/07/11(日) 15:05:54.19ID:otJ/Srhp
>>512
これは自分がホームラン級のバカと気づいていないバカ
515デフォルトの名無しさん
垢版 |
2021/07/11(日) 15:56:42.82ID:F24huBET
ここまで全部おれ
2021/07/11(日) 16:21:58.99ID:BeeJLMuH
マジカヨ死んでくれ
517デフォルトの名無しさん
垢版 |
2021/07/11(日) 17:09:03.43ID:WA0GzHcp
オブザーブバブルコレクション使ってモデル読み込むだけだよね
Mは単なるデータでいい
2021/07/11(日) 18:49:50.97ID:HaMWdASV
VMVもUserControl以外全部Xamlにしてバッチグーなローコードだ
2021/07/11(日) 19:22:59.17ID:qjFfZwWG
馬鹿が必死になってるのが痛い
2021/07/11(日) 19:37:13.31ID:lnDzPe6P
昨日の話を一人で長文書いて続きやろうとしてる必死さが笑える
2021/07/11(日) 20:23:07.63ID:r2mSMqWr
コテンパンにされた通知馬鹿w
2021/07/11(日) 20:29:52.86ID:qjFfZwWG
一人でINPCって言ってる馬鹿が勝手にコテンパンにされてるだけだろう
2021/07/11(日) 21:47:14.35ID:vIt/TVMn
>>514
オウム返しするだけじゃなくてちゃんと反論してくれ
あおり合いじゃなくて議論が見たい
2021/07/11(日) 21:58:06.58ID:x50DSKku
>>523
ここじゃあとてもとても無理だ
2021/07/11(日) 22:15:44.15ID:vIt/TVMn
>>524
なら黙ってて
2021/07/12(月) 06:31:59.34ID:n+s+RpIK
凡俗法則の実例
2021/07/12(月) 10:14:37.67ID:UFEp8oQ1
凡俗法則って言葉知らんかったわ

この外資系社員が凡俗法則を説明してんだが、例に出してるコイツ自身の資料がダメだわ
https://www.daijob.com/crossculture/takashi/20120207.html
528デフォルトの名無しさん
垢版 |
2021/07/12(月) 11:29:09.25ID:B/Smfxyl
UIへの変更通知と
Modelの購読をごっちゃにしてるのがそもそもの間違い。

前者はUIフレームワークで良く扱っているやつだが、
後者は一般的にはPush等で知られる通知処理だ。

で通知処理(Modelの購読が必要になるケース)なんてほぼほぼ無くて、
業務系システムだと株価のリアルタイム表示、チャット位なもんだ。
実装方法としてポピュラーなのはWebPush、WebSocket 、SignalRとか。

それ以外でどうしても必要になっても、通知処理みたいな面倒な機能は設けずに
通常はクライアント側でタイマー回してポーリングして凌ぐのが定石だし手堅いし
どこでもその方式でやってる。
529デフォルトの名無しさん
垢版 |
2021/07/12(月) 12:00:20.06ID:QRdBsraN
数量、単価、金額のプロパティがあるとしてどういう実装する?

VMで掛算してMはPOCOだよな
2021/07/12(月) 12:34:29.39ID:EMnZux7N
計算ロジックは当然Mでしょ。
2021/07/12(月) 12:44:59.03ID:0lrYCdZ4
POCOってなんですか?
おしえてよ
2021/07/12(月) 12:50:37.95ID:EMnZux7N
>>531
基本的な.NETのオブジェクトだけで構成されているもの。
そこは気にしなくていい。

View→UI
ViewModel→UIフレームワークの都合上必要な部分
Model→その他全部

これだけ覚えておけば十分。
2021/07/12(月) 12:57:16.22ID:0lrYCdZ4
>>532
ありがとう
ついていくぜ、旦那
534デフォルトの名無しさん
垢版 |
2021/07/12(月) 13:20:29.38ID:B/Smfxyl
POCO : Plain Old CLR Object
DTO : Data Transfer Object

現場では必ずしも正しい意味では使われておらず、
実際は POCO は DTO と同義で用いられる事が多いかな。

(というか、自分の現場じゃ DTO と言う事が圧倒的に多い)

で、DTO の意味だが
アプリケーションの各層(ViewModel層、Model層、DA層)の
データのやり取りをする単純な入れ物クラスを指す。

class Xxxx
{
public int ID { get; set; }
public string Name {get; set; }
public string Address { get; set; }
}

こんなクラス。(あ!別にクラスでなくても良い)
ここに基本ロジックは無い。
(まあ、getterとかを足す場合もあるけどね)
で現場では、WebAPI等のIF実装から自動的に生成したりする事が多い。
2021/07/12(月) 13:24:45.35ID:0lrYCdZ4
>>534
なにこの丁寧な説明!
もう抱いて!!
536デフォルトの名無しさん
垢版 |
2021/07/12(月) 13:26:43.36ID:B/Smfxyl
>>535
♀?
537デフォルトの名無しさん
垢版 |
2021/07/12(月) 13:34:36.87ID:B/Smfxyl
Model層へのアクセスは RESTful API で行う事が最近は多いとおもうから、
APIの仕様書を OpenAPI形式の APIドキュメントでもらって、
そこから自動生成するのが定石だよ。

まあ、イケてる現場なら普通やってたり検討したりするはず。
正直いって DTO とか POCO とか自動生成の最右翼コードだ。
2021/07/12(月) 15:17:10.90ID:P5SgcPEZ
>>529
素でこういう人が多いんだろうなあと思う
539デフォルトの名無しさん
垢版 |
2021/07/12(月) 16:19:35.12ID:zhwkz6A9
でもPOCOをラッピングしてPropertyChanged付けるとVMになるんですよね?
2021/07/12(月) 19:40:53.71ID:mV+dJaVa
>>529
こいつ一人が馬鹿なんだ
いい加減にあきらめろよ
2021/07/12(月) 19:48:49.64ID:mV+dJaVa
>>528 >>534
一番の馬鹿はこいつ

お前のやってる業務の現場の話じゃないWPFの話をしてるのにどんどん話をすり替えていく
土方業務話をしたいならどこかよそでやれよ

まだ恥の上塗りを繰り返すの?
ここには誰も味方はいない
2021/07/12(月) 19:50:31.26ID:mV+dJaVa
WPFのモデル層へのアクセスをRESTful API でやってるやつを教えて欲しい

馬鹿の世界では当たり前らしいけどw
2021/07/12(月) 19:51:48.31ID:P5SgcPEZ
>>542
もう恥の上塗りはやめなよ
モデルのソースがWebAPIって話でしょ
2021/07/12(月) 19:54:08.90ID:mV+dJaVa
なんでWPFのモデル層の話をしていたのに

誰かの業務のWebAPIの話をしてドヤってんの?
知能レベル低すぎ
2021/07/12(月) 19:56:53.06ID:P5SgcPEZ
>>544
なんで分からんのやろ?
ものすごいバカの壁を感じる
2021/07/12(月) 20:02:52.66ID:mV+dJaVa
>>545
そちらが馬鹿の壁を超えられないサルだからだろ

WPFのモデル層は他のフレームワークのようなPOCO(単なる入れ物)としてコーディングするだけでは通知が抜けており
MVVMの本来のメリットを享受できないという話だったのに

なぜかwebAPI使ったりロジックをVMに書いたりする話にすり替わっている
WPFではVMでロジック書いて通知が一般的だと言われても納得する人はいないんじゃないの?

旗色が悪くなると相手が理解できないと勘違いして業務の話を出してドヤってるけど誰でもわかるわ
2021/07/12(月) 20:10:18.98ID:mV+dJaVa
負けられない病にかかってるのかもしれないけど

そちらの主張どおりWPFではM層はみなiNotifyPropertyChangedの実装なしで書くのが一般的で
VMで通知が当然ですと書かれて納得すると言うのはおかしな話

本筋をねじ曲げて勝利したいのかがわからない

勝利病なの?
2021/07/12(月) 20:28:01.38ID:Yv2DGcH3
>>528
MVVMアプリ的にはクライアント・サーバーのやり取りなんざまとめてMの範疇だろうに
そこの実装がプッシュだろうがポーリングだろうがどうでもいい話
2021/07/12(月) 20:32:07.25ID:EMnZux7N
まずPOCOが単なる入れ物って認識が間違い
2021/07/12(月) 20:34:47.17ID:P5SgcPEZ
POCOがあったらそこになんちゃらRepositoryやらなんちゃらServiceがあるわけじゃん
Modelはそれらを内包した概念なわけで
もうその辺から認識がズレてるから擦り合わせようがないんだと思う

話がどんどん後退していってる
2021/07/12(月) 20:36:41.56ID:LswkHmLx
なんでPOCOとDTOをゴッチャにしてんだ
WPFでMVVMやるならDTOはMの更に先にあるもんだぞ
そっかだからやたらポコポコ言ってんのか
申し訳ないがWebに例えないと話ができない人はNGに入れとくわ
2021/07/12(月) 20:39:06.39ID:P5SgcPEZ
MVVMのMには当然DTOが内包されるよね
更にその先って何?w
2021/07/12(月) 21:02:09.50ID:Gt7PpS3W
>>534
>実際は POCO は DTO と同義で用いられる事が多いかな。

そう思ってる人と正しく使ってる人とで話が噛み合ってない感じだよな。
2021/07/12(月) 21:30:46.04ID:EMnZux7N
>>540-541
これ、自演に失敗したのかな
2021/07/12(月) 22:04:12.08ID:0kBd/ns6
あのさ>>528は例えば特に>>495対するレスで、単にUIとは関係ない一般的な
通知論を言っただけで、>>541の言いたい事を否定してるように見えないんだけど
むしろ君の味方だと思うんだが、>>541は全員敵に見えてるの??
2021/07/12(月) 22:19:19.66ID:0kBd/ns6
ああ、ごめん俺が間違ってたww
>通知処理(Modelの購読が必要になるケース)なんてほぼほぼ無くて
ここでちゃんと否定してたねw
2021/07/12(月) 22:20:11.65ID:LswkHmLx
>>555
エコシステムの話をしてるんじゃなくてWPFアプリの話をしてるので
MVVMのMをWPFアプリでどう実装するかが論点なのよ
2021/07/12(月) 22:22:33.14ID:e9fWYKI2
一応はWPFなりMVVMなりを前提として話してるもんだと思ったらまさかのUIは関係ない宣言

U I は 関 係 な か っ た !

そら誰とも話通じんわw バカ同士仲良くしてくれ
2021/07/12(月) 22:25:45.89ID:0kBd/ns6
いや、やっぱ>>556取り消すわ
やっぱ、>>528は単に>>495に対するレスにしか見えないな

>>557
論点はそこにあると思うけど>>528は通知の一般論話しただけかもしれん
2021/07/12(月) 23:41:05.62ID:B/Smfxyl
なんじゃこりゃ!
561デフォルトの名無しさん
垢版 |
2021/07/12(月) 23:46:26.66ID:B/Smfxyl
WPFに限らず一般的な話してるだけじゃん
2021/07/12(月) 23:57:26.60ID:0kBd/ns6
俺は土曜日までは会話に主な論点わかってたけど

昼間に君のレス見て、UIと通知を結びつける人がいて気になってたから、その人向けにUI関係ない通知の一般論言ってるんだろうと納得してたら

夜みて、通知の一般論言ってるだけなら全く関係ない人が怒り出してから草
って感じ
2021/07/13(火) 00:56:18.26ID:xjJDoKS2
だってWPFと関係ない話になってんだもん
むしろ論点ずらししてるっしょ
2021/07/13(火) 05:46:23.04ID:fhfe26+M
頭ひろゆきかよ
2021/07/13(火) 08:46:15.95ID:Pw5n0ID3
VMに相当する部分にビジネスロジックをガッツリ書くのはアプリ設計としてありだが、それはMVVMじゃないな
MVVMはModelにビジネスロジックを書くのが本来の定義だ
2021/07/13(火) 08:51:29.18ID:+zVQ74um
いやあ皆性格わるいねえw
醜いもんだよw
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況