現在のプラクティス (少なくとも WPF と Silverlight を使用) では、ビュー モデルでコマンド バインディングを介してバインドされたビューが表示されるか、少なくともビュー モデルで処理されるビュー イベントが表示されます。ビュー モデルはビュー ステートをモデル化するだけでなく、ビュー (ユーザー) に応答するため、これはSRPに違反しているように見えます。他の人は、SRP に違反せずにビュー モデルを構築する方法を尋ねたり、実装がそうするかどうかを尋ねたりしました(これは MVC のコントローラーですが、ほぼ類似しています)。
では、現在の慣行は SRP に違反しているのでしょうか? それとも、「ビュー モデル」は本当に SRP に違反しないものの集まりなのでしょうか? これを少し理解するには、単一の責任とは何か、概念に複数の責任がある場合は、SRP に準拠して個々の責任が分割されているかを知る必要があるようです。わからない。
ウィキペディアのビューモデルの定義によると
[T]ViewModel は「View のモデル」であり、View と Model の間のデータ バインディングにも役立つ View の抽象化であることを意味します。
SRP にはこれで十分だと思われますが、後でエントリに次のように記載されています (強調を追加)。
[ViewModel] は、Model 情報を View 情報に変更し、View から Model にコマンドを渡すデータ バインダー/コンバーターとして機能します。
ビュー モデルの役割に関する Prism のブログ投稿で、著者は次のように述べています (繰り返しますが、私の強調です) 。
要するに、ビューモデルは次の複合体であるということです:
- ビューの抽象化
- コマンド
- 値コンバーター
- ビューステート
私はそこに多くの定義を見逃していると確信していますが、それらは次のカテゴリに分類されるようです:
- ビューステートのモデリングの単一の「あいまいな」責任 (つまり、状態とは どういう意味ですか)
- 複数の責任 (ビュー ステート、ユーザー インタラクション (つまりコマンド))
- 単一の特定の責任 (抽象化、状態、相互作用、変換) の複合体。したがって、「すべてのものを管理する」という単一の責任があります。
興味があれば、(2) は正しいと感じますが、一般的な実装に反しているように見えるので、私はこれを「気にします」。