วันอาทิตย์ที่ 19 ธันวาคม พ.ศ. 2553

Plain Old CLR Object (POCO)

วันนี้ไม่รู้จะเขียนอะไร ก็เลยมาเขียนเกี่ยวกับ POCO ซะหน่อยดีกว่า ว่ามันมีที่มาที่ไปยังไง

จริงๆ POCO ก็ไม่มีอะไรมากมาย แต่เพราะชื่อมันนี่เองที่ทำให้เรา งง กับมัน มาเริ่มกันเลยครับ...

ประเด็นมันเริ่มต้นเมื่อเราต้องการจะออกแบบ Architecture ของโปรแกรมเรา

ให้แยกออกเป็น Layer ต่างๆ ตามที่คุ้นเคยก็คงหนีไม่พ้น 3-Layer

Presentation เรียกใช้ Business และ Business เรียกใช้ Data Access แบบนี้

Focus to Business Logic Layer

ปกติหากเราออกแบบในส่วนของ Business เราสามารถทำได้เป็น 3 แบบ (Domain Logic Patern ) ดังนี้

1. Transaction Scripts
2. Domain Model
3. Table Module
***ref : Pattern of Enterprise Appication Architecture (PoEAA)
**ซึ่งผมไม่ขอพูดเกี่ยวกับรายละเอียดของแต่ละตัวใน Blog นี้ครับ ไว้ค่อยคุยกันนอกรอบ...
เรามาดูที่ Domian Model ซึ่งหากเราออกแบบ Class เพื่อมาใช้กับระบบหนึ่งๆ สมมุติ ระบบการสั่งซื้อสินค้า
เราก็อาจจะ Design Class ได้ประมาณด้านนี้
Domain Model
นั่นคือ Class ของเราก็จะเป็นเหมือนตัวแทนบอกเล่าเรื่องราวของระบบนั้นๆ
แล้ว POCO มันเป็นยังไง มาดูกันตามด้านล่างนี้ครับ..
เราสามารถสร้าง Class Order ได้โดยการเขียนขึ้นมาเอง หรือไม่ก็ใช้ EF/LINQtoSQL ในการทำ Domain Class
ก็ได้แบบนี้
POCO (เขียนเอง)
public class Order : EntityBase<Order ,int>{
public DateTime OrderDate {get;set;}
public Customer OrderedBy {get;set;}
....
}
No POCO (ใช้ EF(VS 2008 ) ช่วย Gen จาก DataBase )
[global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Orders")]

[global::System.Runtime.Serialization.DataContractAttribute(IsReference=true)]

[global::System.Serializable()]

public partial class Orders : global::System.Data.Objects.DataClasses.EntityObject

{

[global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]

[global::System.Runtime.Serialization.DataMemberAttribute()]

public int OrderID{

get { return this._OrderID; }

set {

this.OnOrderIDChanging(value);

this.ReportPropertyChanging("OrderID");

this._OrderID = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value);

this.ReportPropertyChanged("OrderID");

this.OnOrderIDChanged();

}

}

private int _OrderID;

partial void OnOrderIDChanging(int value);

partial void OnOrderIDChanged();

}

จากข้างบน เรามาหาคำจำกัดความของ POCO กันดีกว่า
" POCO ก็คือ การที่ Class ธรรมดาๆ ที่ใช้ในการอธิบายเกี่ยวกับระบบที่เราพัฒนา
โดยไม่ไปผูกติดกับวิธีการ Persistence Data นั่นเอง "
ซึ่งส่วนตัวผมชอบ POCO นะ ^^
แล้วมันดียังไง ?
- ทำให้เราสามารถเปลี่ยนวิธีการ Implement ในส่งของ Persistence โดยจะกระทบกับตัว Domain Class น้อย
- ทำให้ Code ดูไม่ยุ่งเหยิง ปรับแต่งเพิ่มเติมก็ทำได้ง่ายขึ้น เทสง่ายขึ้น
สำหรับชื่อ POCO นั้นอย่างที่บอกไปในตอนต้นว่า ชื่อมันไม่ค่อยจะสื่อสักเท่าไหร่ เนื่องจากว่า
ที่มามันเลียนแบบ Java ที่ใช้คำว่า POJO จนต่อมาภายหลัง ในหนังสือ Applying Domain-Driven Design and Patterns
ของ Jimmy Nilsson ก็ได้ใช้คำว่า Persistence Ignorance (PI) แทนครับ..โอเคค่อยดีขึ้นมาหน่อย

ที่มา http://www.greatfriends.biz/webboards/msg.asp?id=116362