.NET – POCO là gì?

question-mark

POCO – viết tắt của Plain Old CLR Object, hoặc Plain Old C# Object, Plain Old C++ Object,… là một thuật ngữ này bắt nguồn từ POJO (Plain Old Java Object). Nếu bạn cảm thấy mơ hồ về khái niệm này, hãy cùng tôi tìm hiểu qua bài viết sau.

Note: Tên gọi của nó thay đổi dựa vào ngôn ngữ (hay nền tảng) mà nó được sử dụng để tạo ra nên có thể gọi chung là Plain Old Class Object. Thay cho CLR, nó còn có thể được gọi là PONO (Plain Old .NET Object).
Một lớp POCO phải tuân theo hai nguyên tắc sau:

Nguyên tắc 1: Chỉ dùng CLR

Theo tiếng Việt, bạn có thể dịch sát nghĩa nó là “Đối tượng thuần CLR/.NET cũ”. Giải thích ngắn gọn: POCO là lớp chỉ sử dụng các kiểu dữ liệu tiêu chuẩn của CLR. Bạn không được sử dụng các kiểu dữ liệu “ngoại lai” từ bất kì thư viện, framework nào nằm ngoài phạm vi chứa các POCO (có thể xác định là project). Như vậy, một POCO có thể sử dụng các POCO khác miễn là nó cùng phạm vi.

up_carl_russel_cartoon_pixar

(thecia.com.au)

POCO giống một ông lão “cổ hủ” sống cô lập. 🙂

Để thấy rõ ràng đặc điểm của POCO, bạn có thể thực hành một vài ví dụ Entity Framework theo mô hình Code First. Bạn có thể nhận ra rằng các lớp POCO được định nghĩa đơn giản nhất có thể. Chúng không cần phải thừa kế từ lớp nọ hay hiện thực một interface nào đó, hay có các attribute để xác định thêm các thông tin (metadata) cho việc mapping (như tên gọi, kiểu dữ liệu,…).

Dưới đây là hai lớp POCO đơn giản ánh xạ hai bảng trong database Northwind:

public class Category
{
	public int CategoryID { get; set; }
	public string CategoryName { get; set; }
	public string Description { get; set; }
	public IList<Product> Products { get; set; }
}

public class Product
{
	public int ProductID { get; set; }
	public string ProductName { get; set; }
	public Category Category { get; set; }
}

Lưu ý rằng không nên nhầm lẫn rằng POCO chỉ được dùng làm đối tượng chứa dữ liệu như các DTO (Data Transfer Object). POCO có thể có các chức năng xử lý (hay behavior) cần thiết như tính toán, kiểm tra dữ liệu,… Tuy nhiên việc cung cấp các behavior cũng phải được giới hạn, tránh vi phạm nguyên tắc sau:

Nguyên tắc 2: Persistence Ignorance

Thuật ngữ này có một chút khó hiểu với từ “persistence”. Mò wikipedia, tôi được đoạn định nghĩa sau:

In computer science, persistence refers to the characteristic of state that outlives the process that created it. Without this capability, state would only exist in RAM, and would be lost when this RAM loses power, such as a computer shutdown. (Wikipedia)

Cụm từ “characteristic of state” bạn có thể hiểu theo một từ quen thuộc là data. Tóm lại “persistence” được hiểu là các dữ liệu được nằm “cứng” trên ổ đĩa, có thể là database, hay một file chứa bất kì. Các dữ liệu này không phụ thuộc vào chương trình sử dụng.

Như vậy thuật ngữ “Persistence Ignorance” được hiểu: tránh “dính líu” đến nguồn dữ liệu (persistence). Tức là các POCO sẽ không biết, không liên hệ, không có bất kì phương thức nào cho phép chúng truy xuất đến nguồn dữ liệu. POCO chỉ có nhiệm vụ chứa và xử lý dữ liệu.

Có thể hiểu nguyên tắc này khái quát hơn là: POCO ko nên có bất kì nhiệm vụ nào khác ngoài việc lưu trữ và xử lý dữ liệu (trên bộ nhớ). Điều này đơn giản là tuân theo nguyên lý Single responsibility trong việc thiết kế hướng đối tượng (Mỗi lớp chỉ nên đảm nhận duy nhất và trọn vẹn một trách nhiệm/công việc ).

refusal-woman

(womeninbiz.sbresources.com)

Chính vì vậy, khi sử dụng POCO, lập trình viên thường tạo một tầng Repository (pattern) để thao tác với nguồn dữ liệu.

Tại sao cần dùng POCO?

Một dự án có thể dùng các framework riêng để làm việc với database. Một số framework cung cấp các class, interface, attribute,… để lập trình viên sử dụng để tạo các entity. Điều này không xa lạ chút nào, và nó ảnh hưởng thế nào nếu đến lúc dự án cần thay đổi một framework mới? Bạn sẽ cần viết lại tất cả các lớp entity mặc dù database không thay đổi.

Rõ ràng rằng việc giữ cho các POCO đơn giản và độc lập khiến chúng trở nên linh hoạt và dễ dàng thay đổi. Bạn có thể thay đổi rất nhiều trong dự án, nhưng POCO vẫn không ảnh hưởng, và có thể được dùng trong nhiều dự án khác nhau. Theo đó, bạn có thể coi các POCO là một phần độc lập và hoàn toàn không phụ thuộc vào bất kì phần nào khác của dự án.

YinYangIt’s Blog

Advertisements

4 thoughts on “.NET – POCO là gì?

  1. thank anh đã hướng dẫn POCO là gì. Em hơi chậm 1 tí nên có thể em 1 số thứ em hiểu sẽ k đúng lắm.Theo em nghĩ vậy thì POCO là các lớp tạo ra để ánh xạ dataase bên dưới. Khi lấy dữ liệu lên thì sẽ đổ data vào trong các POCO và đưa xuống cho client(ví dụ là mình dùng WCF cho nó cụ thể 1 tí). Nếu đúng như vậy thì liệu các POCO đó có đáp ứng dc nhu cầu chứa dữ liệu không vì mình k phải chỉ lấy 1 bảng lên, đôi khi lấy dữ liệu từ nhiểu bảng khác nhau join lại và dữ liệu trả về không phù hợp với 1 POCO nào hết

    Phản hồi
    • Như bạn thấy là POCO đại diện cho duy nhất một dòng dữ liệu của một bảng. Bạn có thể tạo nhiều lớp POCO như với phương pháp database first của entity framework. Nếu cần thực hiện mapping với các kiểu dữ liệu, tên cột khác nhau thì việc sử dụng các attribute là cần thiết.

      Phản hồi
  2. Cám ơn bạn Yang nhiều ! Mình thắc mắc một chút , Nếu mình xài EF Code first thì mình cũng đã xử dụng POCO để tạo các entities đúng không bạn. Bạn có thể nói chi tiết 1 chút nếu mình xử dụng Reponsitory pattern + EF được không bạn ! Thanks bạn nhiều!

    Phản hồi

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s