1. ホーム
  2. .net

[解決済み] MVVMは無意味なのか?[クローズド]

2023-02-08 20:04:48

質問

オーソドックスなMVVMの実装は意味がない? 私は新しいアプリケーションを作成中で、WindowsフォームとWPFを検討しました。 WPFを選んだのは、将来性があり、柔軟性が高いからです。 コードは少なく、XAML を使用して UI に大きな変更を加えることも簡単です。

WPF を選択することは明らかなので、私は、ブレンド可能性、分離懸念、およびユニット テスト可能性を提供する MVVM を私のアプリケーション アーキテクチャとして使用することによって、すべての道を行くかもしれないと思いました。 理論的には、UIプログラミングの聖杯のような美しさです。 しかし、この短い冒険は、本当の頭痛の種になった。 実際にやってみると、予想通り、ひとつの問題を別の問題にすり替えていることに気がついた。 私は、物事を正しい方法で行うことで、正しい結果を得て、より優れたプログラマーになりたいと思う、強迫観念的なプログラマーである傾向がある。 MVVM パターンは、生産性に関する私のテストに落第し、大きな不愉快なハックに変わってしまいました!

明確なケースは、モーダルダイアログボックスのサポートを追加することです。正しい方法は、ダイアログ ボックスを設置し、それをビュー モデルに結びつけることです。 これを動作させるのは困難です。 MVVMパターンの恩恵を受けるには、アプリケーションのレイヤーを通して数カ所にコードを分散させなければなりません。 また、テンプレートやlamba式のような難解なプログラミング構造を使わなければならない。 そのため、メンテナンスとデバッグが大変です。 このため、メンテナンスとデバッグは悪夢のような状態になっています。 私は、アバウトボックスがうまく動作していたのですが、2回目に起動したときに、一度閉じたダイアログボックスを再び表示することができないという例外が発生しました。 私はダイアログウィンドウにクローズ機能のイベントハンドラを追加し、そのIDialogViewの実装にもう一つ、最後にIDialogViewModelにもう一つを追加しなければならなかったのです。 MVVMはこのような贅沢なハッキングから私たちを救ってくれると思ったのですが

この問題に対する競合するソリューションを持つ人々が何人かいて、それらはすべてハッキングであり、きれいで、簡単に再利用可能な、エレガントなソリューションを提供しません。 ほとんどの MVVM ツールキットはダイアログを無視し、ダイアログに対処するときは、カスタム インターフェイスまたはビュー モデルを必要としない単なる警告ボックスです。

私は、MVVMビューパターン、少なくともそのオーソドックスな実装に見切りをつけようと思っています。 どう思いますか? もしトラブルがあったとしても、それは価値があったのでしょうか。 私が無能なプログラマーなだけなのか、それとも MVVM は宣伝されているようなものではないのでしょうか?

どのように解決するのですか?

私の回答が少し長くなったとしても、私を責めないでください!あなたの質問も長いです。あなたの質問も長いのです。

要約すると、MVVMは無意味ではありません。

明確なケースは、モーダルダイアログボックスのサポートを追加することです。 モーダルダイアログボックスのサポートです。正しい方法は 正しい方法は、ダイアログボックスを設置し を設置し、それをビューモデルに結びつけることです。これを これがなかなかうまくいきません。

そうですね、本当にそうです。

しかし、MVVM は UI の外観をその論理から分離するための方法を提供します。誰もそれをどこでも使うことを強制しませんし、誰もあなたの額に銃を突きつけて、すべてのために別の ViewModel を作成させることはしません。

この特定の例に対する私の解決策は以下のとおりです。

UI が特定の入力をどのように処理するかは、ViewModel には関係のないことです。私はビューの .xaml.cs ファイルに、ダイアログボックスをインスタンス化し、その DataContext として同じ ViewModel インスタンス (または必要に応じて他の何か) を設定するコードを追加することにします。

<ブロッククオート

MVVMパターンの恩恵を受けるためには、アプリケーションの層全体を通して、コードをいくつかの場所に分散させる必要があります。また、テンプレートやラムバ式のような難解なプログラミング構造を使用する必要があります。

まあ、数カ所で使う必要はないでしょう。私ならこう解決します。

  • ViewにXAMLを追加し、.xaml.csには何も書かない。
  • すべてのアプリのロジック(UI要素で直接操作するものを除く)をViewModelの中に書く
  • UI で実行されるべきでビジネスロジックとは関係のないすべてのコードは .xaml.cs ファイルに格納します。

MVVMの目的は、主にアプリケーションのロジックと具体的なUIを分離することであり、したがってUIを簡単に修正(または完全に置き換える)できるようにすることだと思います。

私は次の原則を使用します:ViewはViewModelから望むものを知り、仮定することができますが、ViewModelはViewについて何も知ることができません。

WPFはまさにそれを達成するために使用できる素晴らしいバインドモデルを提供します。

(ところで、テンプレートとラムダ式は正しく使えば難解なものではありません。しかし、嫌なら使うなということです)。

頭をかきむしりながら画面を見つめることになるようなもの。

ああ、その気持ちわかるよ。まさに、私が初めてMVVMを見たときに感じたことです。でも、一度コツをつかめば、もう嫌な感じはしませんよ。

アバウトボックスがうまく動いていた.

なぜaboutボックスの後ろにViewModelを配置するのでしょうか?意味がありません。

MVVMツールキットのほとんどはダイアログを無視しており、ダイアログを扱ったとしても、カスタムインターフェースやビューモデルを必要としない単なるアラートボックスに過ぎません。

そうです。UI要素が同じウィンドウにあるか、別のウィンドウにあるか、または現在火星を周回しているという事実そのものが、ビューモデルの関心事ではないためです。

懸念事項の分離

EDITです。

とても素敵な動画があります。 独自のMVVMフレームワークを構築する . 一見の価値ありです。