CanExecute()
との使用法は理解していますがExecute()
、次のシナリオについて疑問に思っています。
public class MyViewModel : NotificationObject
{
public MyViewModel()
{
FooCommand = new DelegateCommand(DoFoo, CanDoFoo);
}
public Bar MyBar { get; set; }
public DelegateCommand FooCommand { get; private set; }
public Boolean CanDoFoo()
{
return (MyBar != null)
}
public void DoFoo()
{
MyBar.BarFunc(); //Potential for a NullReferenceException
}
}
基本的に、コンシューマー ビューは DoFoo メソッドを直接呼び出すことを決定し (明らかにICommand
インターフェイスの要点を壊します)、NullReferenceException を引き起こす可能性があります。これは少し主観的かもしれませんが、「標準的な」方法で行うことを望んでいます。
私たちは:
if (MyBar != null)
最初に NullReferenceException の可能性を防ぎますか?CanDoFoo()
true を返すことを確認して、NullReferenceException の可能性を防ぎますか?- 消費するビューが適切に動作しており、メソッドを呼び出すことができることを既に確認していると仮定します
DoFoo()
か?
補足として、私がこれを尋ねた主な理由は、単体テストを書いているときに、誰かが対応
Execute()
するメソッドを呼び出さずにメソッドを呼び出すことで、ViewModel を壊す可能性があることに気付いたからです。CanExecute()
明らかに、単体テストでは、メソッドを実行する前にメソッドを実行できることを確認しますが、ビューを消費するとそれを無視する場合があります。
更新: (シナリオ 2)
この質問の拡張として、DoFoo()
例外に関してメソッドが壊れないシナリオを追加したいのですが、論理的に壊れる可能性がありますか?
public class MyViewModel : NotificationObject
{
public MyViewModel()
{
FooCommand = new DelegateCommand(DoFoo, CanDoFoo);
}
public Int32 Age { get; set; }
public DelegateCommand FooCommand { get; private set; }
public Boolean CanDoFoo()
{
return (Age >= 21)
}
public void DoFoo()
{
ProvideAlcohal(Age);
}
}
この 2 番目のシナリオは、実際には壊れません (コマンドは正常に処理できます) が、論理的に壊れます。では、呼び出してビジネス ロジックをもう一度検証するCanDoFoo()
か、消費するビューが動作していると仮定するか? (これはビジネス ロジックを壊すだけであることを忘れないでください)。
基本的にはこれに要約されます...消費するビューが不正な動作によって足元を撃たれないようにするための予防策を講じていますか?