6

いくつかのサンプルプロジェクトでは、ViewModelsを使用してデータオブジェクトを文字列に変換し、Viewで使用するのを見てきました。

ViewModelには通常、1つのパラメーター(データオブジェクト)を受け取るコンストラクターがあります。次に、コンストラクターはViewModelのさまざまなプロパティ(主に文字列とint)にデータを入力します。

これにより、ビューで複雑なロジックが発生するのを防ぎます。

一見すると、これは複雑なロジックからのビューの分離をより完全に強制するため、私には良い考えのように思えます。

たとえば、私のビューがデータオブジェクトのプロパティ「サイズ」をレンダリングしようとしていたとします。サイズは「小/中/大」を表す1〜3の数値です。

ビューにif/switchステートメントを含める代わりに、ViewModelに「SizeString」などを含めるだけで、if/switchステートメントをViewModelコンストラクターに入れることができます。

誰かがこのアプローチに同意しませんか?

ヘルパーなど、他のアプローチを使用する方がよいでしょうか?もしそうなら、なぜですか?

4

2 に答える 2

6

ViewModelの目的は、他の形式でレンダリングできるプリミティブとして分解された複雑なドメインモデル(の一部)を表すことです。

この分解はどこかで行われる必要があります。これには、私のお気に入りの例のように、単純な種類のロジックが含まれる場合があります。離散値(OK警告エラー)を色(緑、黄、赤)に変換します。これがViewModelの本質であるため、私のデフォルトのアプローチは、このロジックをViewModel自体にカプセル化することです。

代替案を検討してください。ViewModelに実装されていない場合、どこにありますか?ロジックを別の場所に配置すると、基本的にロジックのない構造であるViewModelになります。ViewModelにドメインオブジェクトの変換/分解をカプセル化させることは、単一責任の原則にうまく適合します。

これは私のデフォルトのアプローチですが、ロジックを複数のViewModelで再利用する必要がある場合があることを常に認識しています。このような場合、これは、元のViewModelが実際には複数のサブビューで構成される複雑なViewModelであることを示している可能性があります。このような場合、共通ロジックを、その小さな部分のみをカプセル化するサブViewModelに抽出できます。

于 2010-01-02T10:03:41.273 に答える
2

Web内のすべてが文字列であるため、すべてを文字列に変換します。

基本的に-ビューモデルは「出力準備完了」状態にあると想定されています。Webが数値のみで作成されている場合、すべてをint/decimalsに変換します。

全体の視点モデル-表現可能なデータをフォーマットします。あなたの場合-サイズ列挙型から小/中/大。ビューからロジックを切り離すことでこれが価値のあるものになるわけではありません。つまり、データを1つの方法で1か所でWebに適合させることができます。


コメントへの回答=>

ええ、それはよく座っています。私も同じことをしています。しかし、言及すること-私もそれをビューに入れることに反対していません。ビューとビューモデルは「依存関係チェーン」の最後にあるためです。私は非常に実用的で、開発者がビューモデルとしてドメインモデルを使用し、ビューモデルの要件がドメインモデルと競合する場合(つまり、開発者が表現目的でのみ新しい「ドメインオブジェクト」を追加する場合)にのみ完全に反対します。

于 2010-01-02T09:47:53.063 に答える