読者です 読者をやめる 読者になる 読者になる

なか日記

一度きりの人生、楽しく生きよう。

MVVMに触れてみた(2)

前回「MVVMに触れてみた(1) - タイトルは未定」の続きで、今回は画面とロジックを分離してみます。
タイトルに反して、全くMVVMに触れてないですが、次回まで我慢です。

BmiViewModel.cs

BmiViewModelクラスを追加して、これにBMI計算に必要な身長、体重、そしてBMI計算のコードを移動します。

using System;

namespace MVVMSample
{
    public class BmiViewModel
    {
        public double Height { get; set; }
        
        public double Weight { get; set; }

        public double Bmi
        {
            get
            {
                return Math.Truncate(Weight / Math.Pow((Height / 100), 2) * 100) / 100;
            }
        }
    }
}

MainWindow.xaml.cs

計算部分はBmiViewModelに移しましたので、それにあわせてコードビハインドの方を書き換えます。
これで計算部分が分離できました。

using System.Windows;

namespace MVVMSample
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void calcButton_Click(object sender, RoutedEventArgs e)
        {
            var viewModel = new BmiViewModel();

            viewModel.Height = double.Parse(heightText.Text);
            viewModel.Weight = double.Parse(weightText.Text);

            bmiText.Text = string.Format("{0,5:##.##}", viewModel.Bmi);
        }
    }
}

BmiViewModelTest.cs

テストプロジェクトを追加して、以下のようにUnitTestが行えるようになりました。
テスト内容は適当なので大目に見てやってください。

using System;
using MVVMSample;
using NUnit.Framework;

namespace MVVMSampleTest
{
    [TestFixture]
    public class BmiViewModelTest
    {
        [Test]
        public void 正常()
        {
            var viewModel = new BmiViewModel();

            viewModel.Height = 172;
            viewModel.Weight = 66;

            Assert.That(viewModel.Bmi, Is.EqualTo(22.30));
        }
    }
}

まとめ

とりあえず自動で単体テストが行えるようになりました。
しかし、コードビハインドに相変わらずコードが残っています。
次回はこの辺をMVVMパターンを使ってきれいにしてみましょう。

ソース

このエントリで作成したソースはこちら
テストプロジェクトを追加 · 54611fe · nakaji/MVVMSample · GitHub