MVVMでModelをリッチにしていくとViewModelの処理が小さくなる?
ViewMakerのサンプルBurgerShopはMVVM+ドメインモデルで作成しています。このサンプルを作成している時に感じたのは、ViewModelのロジックをビジネスロジックとして捉えるとどんどんModel側のコードに吸収されていきます。
例えば、オーダーを登録するためにはオプション商品が全て選択されているかを判断する処理は、オーダーの登録中と画面の状態値として捉えると画面側すなわちViewModelに記述します。しかし、これをオーダーエンティティの完了状態として捉えるとModel側の処理になります。
//Modelコード部 public partial class Order { public bool IsComplete { get { return this.Items.All(item => item.IsComplete); } } } public partial class OrderItem { public bool IsComplete { get { return this.Item.Items .All(item => this.Options.Any(opt => opt.ItemName == item.Name)); } } } //ViewModelコード部 public class OrderEntryViewModel : AppViewModel { ... public ICommand EnterCommand { get { return CreateCommand(Enter, CanEnter); } } private void Enter() { if (!Validate()) return; if (!OrderData.IsComplete) throw new BurgerShopException("You should choice item options."); if (OrderData.Items.Count == 0) throw new BurgerShopException("You should add order item."); ... } private bool CanEnter() { if (OrderData == null || !OrderData.IsComplete) return false; if (OrderData.Items.Count == 0) return false; return true; } }
これはリッチなドメインモデル派には好都合なのだが、ドメインモデルに変に画面の責務が入り込まないのか心配であったりします。選択行の概念をドメインモデル側には記述したいとは思わないですね。ViewModelとModelの責務分割についてもう少し考えてみる必要がありそうです。