基本的に、MVVM を使用して公開 ICommand を公開する場合、デリゲートは公開または非公開にする必要がありますか?
3 に答える
私はそれらをプライベートにします-それらはあなたのクラスのパブリックインターフェイスの一部ではありません。それがパブリック ICommand プロパティの目的です。
個人的には、プライベート メソッドを使用しますが、その理由を説明します。を公開していますがICommand
、これは、消費するビューが Execute を呼び出す前に CanExecute を呼び出す必要があることを示しています。そうでなければ、彼らは API に逆らい、足を撃ちます。その時点で、それはあなたの手から離れます。誰かがリフレクションを使用して重要なプライベート変数を null に設定し、これが原因でクラス設計を壊した場合と同じように...自分自身を撃ちます。では、なぜメンバーを非公開にするのでしょうか。直接呼び出してはならないメンバーを公開する必要がないためです。
基本的に、メンバーの単体テストを行う場合は、個別に行うのではなく、API がメンバーの実行を意図する方法で行います。したがって、実際にはメンバーをテストしていませんが、さらにコマンドをテストしています。これは、次の特定の順序でペアでテストする必要があることを意味します。
if (CanExecute)
{
Execute;
}
増加、減少ボタン、およびスライダーの表示値を簡単に制御するためのMVVMがあります。
テスト ICommand と INotifyPropertyChanged がある場合は、一種の UnitTest を作成できます。
[TestMethod]
public void TestViewModel3()
{
int min = -10;
int max = 10000;
int initVal = 50;
bool initState = false;
ToglledSliderModel model = new ToglledSliderModel(initState, initVal, min, max);
ToglledSliderViewModel viewModel = new ToglledSliderViewModel();
viewModel.Model = model;
int status = 567;
viewModel.PropertyChanged += delegate
{
status = 234;
};
for (int i = 1; i < 100; i++)
{
status = 567;
ICommand ic = viewModel.IncreaseValue;
ic.Execute(this);
Thread.Sleep(2);
Assert.AreEqual(status, 234);
Assert.AreEqual(model.SliderValue, initVal + i);
}
}
ご覧のとおり、INotifyPropertyChanged の動作と ICommand の実行をテストします