Thursday, July 13, 2006

SOC Application - Analisa Domain (Repository Dan Factory)

Senarai artikel berkaitan:
SOC Application - Requirement
SOC Application - Analisa Domain

Sehingga ketahap ini kita sudah cover a few pattern dalam DDD seperti Entity,ValueObject dan Aggregate. Terdapat beberapa pattern lain yang akan saya masukkan semasa tune Domain design ini.

Motif utama kita ialah untuk membolehkan kita create Docket. Jadi kita cuba buat adakah Domain yang telah design mampu untuk create Docket berdasarkan requirement yang ada. Setiap docket perlu ada startFaultTime dan endFaultTime. Perbezaan antara waktu docket dibuka dan ditutup penting untuk mendapatkan performance report.

Object Creation - Factory
Kita boleh create object dari contructor object sendiri atau kita boleh create melalui Factory. Saya suka untuk create object dari factory, sebab ada beberapa kelebihan, insyAllah pada artikel yang akan datang saya sentuh detail kelebihan tersebut. Ok dari domain design yang ada, saya perlu memilih dimana saya perlu mempunyai factory, biasanya factory akan hanya ada di root aggregate dan factory yang akan kawal association antara domain-domain yang akan dibina.



Test Driven Design - TDD
Saya akan masuk sedikit ke bahagian TDD, unutk test beberapa domain yang telah saya buat. Saya akan menggunakan NUnit unutk melakukan test fixture.

Perkara pertama saya saya ingin test ialah untuk create docket dgn minimum maklumat.
Terdapat 2 domain yang penting unutk bahagian ini iaitu Docket sendiri dan ProblemSpecification.

Ok, let's start.
Saya kena import dahulu NUnit library seperti berikut

using NUnit;
using NUnit.Framework;


Langkah seterusnya menulis code seperti berikut

using System;
using System.Collections.Generic;
using System.Text;
using SOCManagement.Core.TestDomain;
using SOCManagement.Core.TestFactory;
using NUnit;
using NUnit.Framework;

namespace SOCManagement.Core.TestUnit
{
[TestFixture]
public class FactoryTest
{
[Test]
public void CreateDocketTest()
{
ProblemSpecification problemSpecification = DocketFactory.CreateProblemSpecification("DataCenterA","ProductA",Convert.ToDateTime("01/01/2006 10:00:00"),Convert.ToDateTime("02/01/2006 08:30:00"));
Docket docket = DocketFactory.CreateDocket(problemSpecification);
Assert.IsNotNull(docket);
}
}
}


Dalam TDD, sequence ialah fail->pass->refactor->fail->pass..
Jadi this test code diatas akan memberi anda tanda merah iaitu fail. Kenapa? itu memang cara TDD :)...

Code diatas akan fail kerana anda masih lagi tiada code untuk domain-domain tersebut.Ok jom tulis class untuk domain-domain tersebut.
Pada tahap ini, layer between code belum disentuh. Saya akan tulis class-class tersebut dahulu, kemudian saya akan sentuh pembahagian layer-layer dan dimana hendak letak class-class domain tersebut.

Class ProblemSpecification
using System;
using System.Collections.Generic;
using System.Text;

namespace SOCManagement.Core.TestDomain
{
public class ProblemSpecification
{
private string _dataCenterName;
private string _productName;
private DateTime _startFaultTime;
private DateTime _endFaultTime;

public ProblemSpecification(string dataCenterName,string productName,
DateTime startFaultTime,DateTime endFaultTime)
{
this._dataCenterName=dataCenterName;
this._productName=productName;
this._startFaultTime=startFaultTime;
this._endFaultTime=endFaultTime;
}
}
}


Class Docket:
using System;
using System.Collections.Generic;
using System.Text;

namespace SOCManagement.Core.TestDomain
{
public class Docket
{
private ProblemSpecification _problemSpecification;

public Docket(ProblemSpecification problemSpecification)
{
this._problemSpecification = problemSpecification;
}
}
}


Class DocketFactory
using System;
using System.Collections.Generic;
using System.Text;
using SOCManagement.Core.TestDomain;

namespace SOCManagement.Core.TestFactory
{
public class DocketFactory
{
public static Docket CreateDocket(ProblemSpecification problemSpecification)
{
return new Docket(problemSpecification);
}

public static ProblemSpecification CreateProblemSpecification(string dataCenterName,string productName,DateTime startFaultTime,DateTime endFaultTime)
{
return new ProblemSpecification(dataCenterName,productName,startFaultTime,endFaultTime);
}
}
}


Selepas semua class selesai ditulis, anda boleh compile dan run NUnit.

0 comments: