Story-2: สนุกกับการวิเคราะห์และออกแบบในแบบ Domain Model Pattern จากเรื่องราวในโลกจริงของเรา(Real World)

สวัสดีครับ

ว่างๆผมก็จะหาเรื่องราวจากข่าวที่ใช้เวลาไม่มากนัก มาอ่าน ทั้งได้ความรู้ภาษาอังกฤษไปด้วย ได้การวิเคราะห์ และออกแบบในแบบของ Domain Model pattern ไปด้วย ก็ทำแบบสนุกๆนะครับ อย่าไปยึดติดมากนัก(Supple design)เพราะทำเล่นอยู่ผู้เดียว ไม่ได้ทำเป็นทีม ถ้าทำเป็นทีมจะสนุกกว่านี้มาก ให้ถือซะว่าวิธีการนี้ เป็นการละเล่นชนิดหนึ่งไปนะครับ จะได้ไม่เครียดมากนัก

บทความนี้ก็จะรับเอา domain models จาก story-1 มาใช้ต่อ และใช้ต่อไปในเรื่องราวอื่นไปเรื่อยๆ เพราะมัน real world อยู่แล้วนี่ใช่มั้ย(ไม่มีใครเปลี่ยน real world ได้) แล้วผมจะเปลี่ยนแปลง และวิวัฒนาการพวกมันไปเรื่อยๆตามเรื่องราวที่ผมจับเข้ามาสนใจไปเรื่อยๆ ดังนั้น class ของผมก็จะเปลี่ยนแปลง เติบโตไปเรื่อยๆ รวมถึงตอนนี้ใช้ภาษา C# อธิบาย ต่อไปอาจจะใช้ภาษาอื่นอธิบายก็ได้ครับ

Story-2 ผมเอามาจาก http://www.bangkokpost.com/learning/learning-from-news/240442/weekend-travel-dreams

Story-2: “Vat Phou hotel boat features 12 airconditioned wooden cabins, each equipped with twin beds, a bathroom with hot shower, a working desk and a cabinet. It also offers a restaurant, a lounge and resting areas on its front and back of the deck space with comfortable day-beds and sofas. Breakfast and lunch are served on open-air deck so passengers can have good views of the river.”

จากเรื่องราวแบ่งเป็น 3 ประโยค ประโยคที่หนึ่งอธิบายห้องพักในเรือ, ประโยคที่สองอธิบายพื้นที่ใช้สอยบนดาดฟ้าของเรือ และ ประโยคที่สามอธิบายบรรยากาศที่ลูกเรือจะได้เห็นแม่น้ำสวยๆบนดาดฟ้าของเรือ เขียน C# ได้ domain models(ไม่รวม infrastructure classes ใดๆ) ตามข้างล่างนี้ครับ

    public class Passenger : Human
    {
        public bool HaveGoodViewsOfTheRiver { get; internal set; }
    }


    public class Area : Actor
    {
        public uint Width { get; set; }
        public uint Height { get; set; }
        public List<Actor> Areas { get; set; }
    }
    public class Boat : Actor { }
    public class HotelBoat : Boat
    {
        public List<Area> Features { get; set; }
        public Area DeckSpace { get; set; }
        public HotelBoat OnOpenAirDeck()
        {
            /*ค้นหาชั้นดาดฟ้าของเรือ แล้ว return มันออกไป*/
            return this;
        }

        public HotelBoat BreakfastServe(Passenger passenger)
        {
            passenger.HaveGoodViewsOfTheRiver = true;
            return this;
        }

        public HotelBoat LunchServe(Passenger passenger)
        {
            passenger.HaveGoodViewsOfTheRiver = true;
            return this;
        }
    }
    public class Aircondition : Actor { }
    public class Room : Area { }
    public class Cabin : Room
    {

        public List<Aircondition> Airconditions { get; set; }

        public List<Bed> Beds { get; set; }

        public List<Room> Rooms { get; set; }

        public List<Desk> Desks { get; set; }

        public List<Cabinet> Cabinets { get; set; }

        public Cabin()
        {
            Airconditions = new List<Aircondition>();
            Beds = new List<Bed>();
            Rooms = new List<Room>();
            Desks = new List<Desk>();
            Cabinets = new List<Cabinet>();
        }

        public Cabin AddAircondition(Aircondition aAir)
        {
            Airconditions.Add(aAir);
            return this;
        }

        public Cabin AddBed(Bed aBed)
        {
            Beds.Add(aBed);
            return this;
        }

        public Cabin AddRoom(Room aRoom)
        {
            Rooms.Add(aRoom);
            return this;
        }

        public Cabin AddDesk(Desk aDesk)
        {
            Desks.Add(aDesk);
            return this;
        }

        public Cabin AddCabinet(Cabinet aCabinet)
        {
            Cabinets.Add(aCabinet);
            return this;
        }
    }
    public class WoodenCabin : Cabin { }
    public class Bed : Actor { }
    public class TwinBed : Bed { }
    public class DayBed : Bed { }
    public class BathRoom : Room
    {
        public Shower Shower { get; set; }
    }
    public class Shower : Actor { }
    public class HotShower : Shower { }
    public class Restaurant : Room { }
    public class Desk : Actor { }
    public class Cabinet : Actor { }
    public class Sofa : Actor { }


และนี่ก็คือ code C# ที่เล่าเรื่องตาม story-2

        [TestMethod]
        public void TestVatPhouHotelBoatStory()
        {

            /*Vat Phou hotel boat features 12 airconditioned wooden cabins, each equipped with twin beds, a bathroom with hot shower, a working desk and a cabinet.*/
            var theVatPhouHotelBoat = new HotelBoat();
            theVatPhouHotelBoat.Features = (from i in Enumerable.Range(1, 12) select new WoodenCabin()
                                                .AddAircondition(new Aircondition())
                                                .AddBed(new TwinBed())
                                                .AddRoom(new BathRoom { Shower = new HotShower() })
                                                .AddDesk(new Desk())
                                                .AddCabinet(new Cabinet())).ToList<Area>();

            /*It also offers a restaurant, a lounge and resting areas on its front and back of the deck space with comfortable day-beds and sofas.*/
            theVatPhouHotelBoat.Features.Add(new Restaurant());
            var loungeArea = new Area();
            var restingArea = new Area();
            theVatPhouHotelBoat.DeckSpace.Areas.Add(loungeArea);//Add Lounge Area
            theVatPhouHotelBoat.DeckSpace.Areas.Add(restingArea);//Add Resting Area
            theVatPhouHotelBoat.DeckSpace.Areas.AddRange(new DayBed[] { new DayBed(), new DayBed(), new DayBed()});
            theVatPhouHotelBoat.DeckSpace.Areas.AddRange(new Sofa[] { new Sofa(), new Sofa(), new Sofa()});

            /*Breakfast and lunch are served on open-air deck so passengers can have good views of the river.*/
            var iAmChavPPassenger = new Passenger();
            theVatPhouHotelBoat.OnOpenAirDeck().BreakfastServe(iAmChavPPassenger);
            theVatPhouHotelBoat.OnOpenAirDeck().LunchServe(iAmChavPPassenger);

            if (iAmChavPPassenger.HaveGoodViewsOfTheRiver)
            {
                Console.WriteLine("I'am Happy.");
            }
        }


Class diagram ของ Story-2

ขอบคุณครับ 🙂

ให้คิดซะว่าทุกๆวันเป็นวันเริ่มต้นงานใหม่ของคุณเสมอ

ไม่ว่างานนั้นจะเล็กน้อย หรือยิ่งใหญ่

คุณจะเรียนรู้ และรู้สึกสนุกกับมันเสมอ

— Chav.P–

Advertisements

#agile-software-development, #design, #pattenrs