Sự khác biệt giữa các đối tượng miền, POCO và các thực thể là gì?


81

Tôi có ấn tượng về cơ bản họ đều giống nhau. Các đối tượng mô hình cũng giống nhau?

Hiện tại, trong kiến ​​trúc của tôi, tôi có:

class Person 
{

    public string PersonId;        
    public string Name;
    public string Email;

    public static bool IsValidName() { /* logic here */ }
    public static bool IsValidEmail() { /* logic here */ }
}


class PersonService
{
    private PersonRepository pRepository;

    PersonService()
    {
        pRepository = new PersonRepository();
    }

    public bool IsExistingEmail(string email)
    {
        //calls repo method to see if email is in db
    }


    public Person GetPerson(email)
    {
        return pRepository.Get(email);
    }


    public void SavePerson(Person p)
    {
        if (Person.IsValidEmail(p.Email) && !IsExistingEmail(p.Email)
        {
            pRepository.Save(p);
        }
    }

}


class PersonRepository
{
    public void Save(Person p)
    {
        //save to db
    }

    public Person Get(string email)
    {
        //get from db
    }

    public bool IsExistingEmail(string email)
    {
        //see if email in db
    }

}

Vì vậy mà các lớp trên là POCO, Domain Object, Model object, entity?

Câu trả lời:


115

Định nghĩa Layman (không chuẩn) của tôi

  • POCO- Đối tượng% Chèn_Your_Language% Cũ. Một kiểu không có logic trong đó. Nó chỉ lưu trữ dữ liệu trong bộ nhớ. Bạn thường chỉ thấy các thuộc tính tự động trong đó, đôi khi là các trường và hàm tạo.
  • Domain objectmột phiên bản của lớp có liên quan đến miền của bạn. Tôi có thể sẽ loại trừ bất kỳ đối tượng vệ tinh hoặc tiện ích nào khỏi đối tượng miền, ví dụ: trong hầu hết các trường hợp, đối tượng miền không bao gồm những thứ như ghi nhật ký, định dạng, tuần tự hóa, mã hóa, v.v. - trừ khi bạn đang xây dựng cụ thể một sản phẩm để ghi nhật ký, tuần tự hóa, định dạng hoặc mã hóa tương ứng .
  • Model objectTôi nghĩ là giống như Domain object. Mọi người có xu hướng sử dụng điều này thay thế cho nhau (tôi có thể sai)
  • Entity một lớp học có id
  • Repositorymột lớp nói với bộ lưu trữ dữ liệu từ một phía (ví dụ: cơ sở dữ liệu, dịch vụ dữ liệu hoặc ORM) và dịch vụ, giao diện người dùng, lớp nghiệp vụ hoặc bất kỳ cơ quan yêu cầu nào khác. Nó thường ẩn tất cả những thứ liên quan đến dữ liệu (như sao chép, tổng hợp kết nối, ràng buộc khóa, giao dịch, v.v.) và làm cho nó đơn giản để chỉ làm việc với dữ liệu
  • Servicephần mềm cung cấp một số chức năng thường thông qua API công khai. Tùy thuộc vào lớp, nó có thể là ví dụ như một vùng chứa riêng RESTful hoặc lớp cho phép bạn tìm một phiên bản cụ thể của kiểu cần thiết.

Câu trả lời ban đầu

Đây là những thuật ngữ được sử dụng chủ yếu trong Thiết kế hướng miền (Phân tán). Chúng không giống nhau. Thuật ngữ mô hình Đối tượng có thể được sử dụng như một từ đồng nghĩa với đối tượng miền .

Đối tượng miền. Đối tượng từ khu vực kinh doanh cụ thể đại diện cho điều gì đó có ý nghĩa đối với chuyên gia miền. Các đối tượng miền chủ yếu được đại diện bởi các thực thể và các đối tượng giá trị. Nói chung, hầu hết các đối tượng sống trong lớp miền đều đóng góp vào mô hình và là các đối tượng miền.

Thực thể. Một đối tượng về cơ bản được xác định không phải bởi các thuộc tính của nó, mà bởi một chuỗi liên tục và nhận dạng. (Có nghĩa là nó phảiId )

POCO. Một đối tượng đơn giản không có logic phức tạp, thường nó chỉ có một vài thuộc tính và được sử dụng với ORM hoặc làm Đối tượng truyền dữ liệu

class Person- Thực thể và POCO, phiên bản của lớp này là Đối tượng miền
class PersonService- Dịch vụ
class PersonRepository- Kho lưu trữ


4
Vui lòng xem mẫu mã của tôi ở trên và cho tôi biết bạn sẽ áp dụng các điều khoản như thế nào.
jpshook

Câu trả lời tốt. Tôi đã sẵn sàng trả lời câu này, nhưng đó sẽ là bản sao câu trả lời của bạn. Tôi có thể nói thêm rằng bên cạnh các đối tượng Thực thể và Giá trị, bạn còn có Sự kiện miền, v.v. Tất cả các đối tượng và sống trong lớp Miền và đóng góp vào mô hình là các đối tượng Miền.
Magnus Backeus

1
Nếu một POCO không cần được xác định, thì làm cách nào để có thể tải nó bằng ORM. Đó là không hợp lý!
Pascal

1
Tại sao thông tin sai sự thật này lại được nhiều người ủng hộ và chấp nhận nhất. POJO KHÔNG phải là một loại không có logic trong đó. Trên thực tế, Martin Fowler đã đặc biệt đặt ra thuật ngữ POJO để đối lập với Entity Beans ("chúng tôi đã chỉ ra nhiều lợi ích của việc mã hóa logic nghiệp vụ thành các đối tượng java thông thường hơn là sử dụng Entity Beans"). martinfowler.com/bliki/POJO.html
USER này cần giúp đỡ

1
Tôi xin lỗi nếu nhận xét của tôi bị nặng lời, nhưng một lần nữa, kinh nghiệm cá nhân của bạn không thực sự quan trọng khi người huấn luyện thuật ngữ đã định nghĩa POJO phải chứa logic nghiệp vụ một cách rõ ràng. Trên thực tế, anh ấy sẽ phân loại thực hành của bạn theo mô hình miền thiếu máu ( martinfowler.com/bliki/AnemicDomainModel.html ) mà anh ấy coi là một mô hình chống và anh ấy khuyên bạn nên sử dụng POJO thay thế. Cho dù đó là một mô hình phản đối nằm ngoài phạm vi của định nghĩa này, nhưng có một điều rõ ràng: POJO không có nghĩa là một đối tượng không có bất kỳ logic kinh doanh nào.
NGƯỜI DÙNG NÀY CẦN GIÚP ĐỠ

18

Nó có nhiều ý nghĩa hơn về chức năng; một đối tượng miền là một cái gì đó cụ thể cho việc triển khai logic của bạn và có thể phức tạp hơn một POCO đơn giản; một thực thể có nội hàm đại diện cho một thứ gì đó (thường là tham chiếu đến một phương tiện bền vững) và POCO chỉ là một định danh nhanh cho một lớp. Mô hình chỉ là một thuật ngữ được sử dụng để đại diện cho một đối tượng (thường chứa trạng thái và thường xử lý giao diện người dùng hoặc DB).

Không phải là có bất kỳ sự khác biệt về chức năng nào, chúng chỉ là những thuật ngữ khác nhau để mô tả kỹ hơn một thứ gì đó. Giống như sự khác biệt giữa xe đua, xe tải và sedan gia đình. Tất cả đều là ô tô, nhưng mỗi thuật ngữ mang tính mô tả nhiều hơn.


Mình cập nhật thêm mẫu mã, các bạn cho ý kiến ​​nhé. Tôi chỉ muốn đảm bảo rằng khi tôi đặt câu hỏi, tôi đang sử dụng các thuật ngữ chính xác.
jpshook

18

về cơ bản nó đi đến logic nội bộ

  1. Các đối tượng miền có logic miền nội bộ cho những thứ như xác thực, v.v.
  2. Mô hình về cơ bản là một đối tượng miền nhẹ, họ biết về dữ liệu họ nắm giữ nhưng không thực sự biết gì về cách nó sẽ được sử dụng
  3. Các thực thể nắm giữ dữ liệu và có một số kiến ​​thức nội bộ về nguồn gốc của dữ liệu và nơi dữ liệu sẽ được lưu, cập nhật, v.v.
  4. POCO nắm giữ dữ liệu và có thể có một số kiến ​​thức nội bộ về bản thân nó, những thứ như tổng giá trị của tất cả các mục trong một bộ sưu tập thuộc tính
  5. DTO là mục đơn giản nhất, nó chỉ chứa dữ liệu và không có logic

Về cơ bản, tất cả chúng đều được sử dụng cho cùng một việc, chỉ là bạn muốn chúng thông minh đến mức nào

theo mẫu mã của bạn Lớp Person sẽ là một đối tượng miền hoặc một mô hình, 2 lớp còn lại là một dịch vụ và một kho lưu trữ. Đối tượng miền, Pocos, mô hình, dtos, v.v. được sử dụng giống như thông điệp, được truyền từ lớp này sang lớp khác, lớp dịch vụ như PersonService là một lớp trong ứng dụng và tương tự với lớp Kho lưu trữ như PersonRepository. để có một cái nhìn tổng thể tốt hơn, hãy xem http://bob-the-janitor.blogspot.com/2009/07/n-tier-design-revisit-part-1-over-view.html trong trường hợp này nó đang nói về việc sử dụng một thực thể dữ liệu về cơ bản là một dto


11

Đã có những giải thích tốt về Miền và Mô hình trong các câu trả lời ở trên.

Trong một Thực thể ngữ cảnh-Cơ sở dữ liệu nghĩa là Mục trong Mô hình Quan hệ Thực thể ERD . (tức là Hàng trong Bảng)

Trong Microsoft-Dotnet-EntityFramework-World Entity có nghĩa là một Đối tượng có thể được tải và lưu vào cơ sở dữ liệu bằng Ngữ cảnh Dữ liệu (Cơ sở). Thông thường một Thực thể không thể tồn tại nếu không có Ngữ cảnh Dữ liệu (Cơ sở) của nó. (Unit-) Kiểm tra chức năng kinh doanh của các lớp này là do difficuilt.

Pocos (Plain Old CommonRuntime Objects) có thể tồn tại mà không có PersistenceFramework (EntityFramework hoặc NHibernate) do đó chúng dễ kiểm tra hơn nhiều.

Từ poco là chuyển thể của pojo (đối tượng java cũ thuần túy) được tạo ra trong thế giới java với cùng lý do.


lý do gì để từ chối? Câu hỏi là "Sự khác biệt giữa các đối tượng miền, POCO và các thực thể là gì?" tôi đã giải thích sự khác biệt giữa Entity và Poco
k3b,

"Đã có những giải thích tốt về Miền và Mô hình trong các câu trả lời ở trên." Làm cách nào tôi có thể chọn một câu trả lời phụ thuộc vào các câu trả lời khác như một câu trả lời hợp lệ?
jpshook

np. Nhìn lại, tôi nên chỉ nhận xét yêu cầu bạn cung cấp một câu trả lời đầy đủ. Sẽ suy nghĩ 2x lần sau.
jpshook

3

Đối tượng miền là một thực thể trong lớp miền của ứng dụng của bạn, ví dụ. một lớp Địa chỉ. "Mô hình" có nghĩa tương tự - một thực thể trong "Mô hình miền".

POCO (đối tượng CLR cũ thuần túy) là một đối tượng không có hành vi (phương thức) nào được xác định và chỉ chứa dữ liệu (thuộc tính). POCO thường được sử dụng như DTO (đối tượng vận chuyển dữ liệu) để mang dữ liệu giữa các lớp và dữ liệu sau đó thường được sử dụng để điền vào một đối tượng / thực thể miền.


POCO không thể là một thực thể? Tôi nghĩ POCO có thể có hành vi nhưng phải kiên trì không biết gì?
jpshook

@Developr Vâng, các mô hình / thực thể miền của bạn thực sự có thể là của POCO - đây được gọi là mô hình miền "thiếu máu" - xem martinfowler.com/bliki/AnemicDomainModel.html
MattDavey,

Làm thế nào bạn sẽ xem xét này thiếu máu? Bạn định nghĩa "đối tượng tên miền đa dạng thức" như thế nào? Nếu các đối tượng miền không thể tương tác trực tiếp hoặc gián tiếp với cơ sở dữ liệu, chúng có thể có loại chức năng phong phú nào?
jpshook

@Developr Tôi muốn xem xét một mô hình miền bao gồm các đối tượng POCO thiếu máu vì các lớp POCO theo truyền thống không có bất kỳ chức năng phong phú nào, chỉ có dữ liệu. Tuân theo nguyên tắc Phân tách mối quan tâm ( en.wikipedia.org/wiki/Seposystem_of_concerns ), một đối tượng trong mô hình miền không nên quan tâm đến việc truy cập cơ sở dữ liệu (do đó thuật ngữ phổ biến là "sự thiếu hiểu biết bền bỉ"). Loại chức năng mà một thực thể trong mô hình miền nên có sẽ là logic nghiệp vụ - chúng phải nắm bắt và đóng gói các quy tắc logic & quy trình làm việc của vấn đề / miền mà chúng đại diện.
MattDavey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.