ドメインモデル駆動開発をやってみる(1)

ドメインモデルを先に作って、次に画面周り、最後にDBを作成する手順を試してみます。どこまでできるか?ではありますがチャレンジしてみます。シナリオは伝言メモでトライします。

ドメインモデルの作成

事前に分析レベルのクラス図があるので、これを元にドメインモデルを作成していきます。ドメインモデルは実コードを作成する具体的な作業であり、当初のモデルで抜けていた点が見つかったり、より分かりやすい構造に気づいたりと、元のモデルのブラッシュアップにも効果的であることも実感しました。モデル精度を上げる方法として、UMLのレベルではなくビジネスルールを実装したドメインモデルを作成するレベルまで行うという選択肢も実用的と感じます。


テストケース

ドメインモデルは実際のコードなので実行することが可能で、テストケースを書いて動作を確認することができます。動くモデルの有用性は昔から言われていますが、ドメインモデルを使えば簡単に手に入ります。

        [TestMethod()]
        public void CustomerCallerTest()
        {
            Message target = new Message(); 
            target.Action = ResponseAction.CallAgain;
            target.CallBackPhoneNo = "06-666-6666";
            target.ReceiptPerson = new Employee() { Name = "yamada taro" };
            target.TargetPerson = new Employee() { Name = "suzuki hanako" };
            target.CallerPerson = new CustomerCaller(null, new Customer(), "Yamamoto");

            Assert.IsTrue(target.IsValid());
            Assert.AreEqual("Yamamoto", target.CallerPerson.Name);
            Assert.AreEqual("06-666-6666", target.CallBackPhoneNo);
        }

        [TestMethod()]
        public void NoCallbackTest()
        {
            Message target = new Message(); 
            target.Action = ResponseAction.CallBack;
            target.ReceiptPerson = new Employee() { Name = "yamada taro" };
            target.TargetPerson = new Employee() { Name = "suzuki hanako" };
            target.CallerPerson = new CustomerCaller("06-666-6666",
                new Customer() { Name="A Corp" }, "YAMAMOTO");

            Assert.IsFalse(target.IsValid());
            try
            {
                target.Validate();
                Assert.Fail();
            }
            catch (CommonApplicatioExcpetion ex)
            {
                Assert.AreEqual("ErrorNoCallablePhoneNo", ex.MessageCode);
            }
        }