Định nghĩa 'POCO'


238

Ai đó có thể định nghĩa chính xác 'POCO' nghĩa là gì không? Tôi đang gặp thuật ngữ này ngày càng thường xuyên hơn và tôi tự hỏi liệu nó chỉ là về các lớp đơn giản hay nó có nghĩa gì hơn?


27
Thật buồn cười khi "poco" là một từ tiếng Tây Ban Nha có nghĩa là "ít, không nhiều". Vì vậy, nó phù hợp với bối cảnh này độc đáo! en.wiktionary.org/wiki/poco
EnocNRoll - AnandaGopal Pardue

6
Nó cũng có nghĩa tương tự trong tiếng Ý :)
BlackBear

3
Và trong tiếng Bồ Đào Nha có nghĩa là một lỗi vì nó được đánh vần: "pouco".
Ismael

3
Nghe có vẻ giống PocoHaram với tôi :)
hữu íchBee

4
Trong tiếng Ba Lan "POCO" là câu hỏi "Tại sao nên sử dụng nó"
Titol

Câu trả lời:


197

"Đối tượng C # cũ đơn giản"

Chỉ là một lớp bình thường, không có thuộc tính nào mô tả mối quan tâm về cơ sở hạ tầng hoặc các trách nhiệm khác mà các đối tượng miền của bạn không nên có.

EDIT - như các câu trả lời khác đã nêu, về mặt kỹ thuật là "Đối tượng CLR cũ đơn giản" nhưng tôi, như nhận xét của David Arno, thích "Đối tượng lớp cũ đơn giản" để tránh quan hệ với các ngôn ngữ hoặc công nghệ cụ thể.

ĐỂ XÁC NHẬN: Nói cách khác, chúng không xuất phát từ một số lớp cơ sở đặc biệt, cũng như không trả về bất kỳ loại đặc biệt nào cho các thuộc tính của chúng.

Xem dưới đây cho một ví dụ về mỗi.

Ví dụ về POCO:

public class Person
{
    public string Name { get; set; }

    public int Age { get; set; }
}

Ví dụ về một cái gì đó không phải là POCO:

public class PersonComponent : System.ComponentModel.Component
{
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public string Name { get; set; }

    public int Age { get; set; }
}

Ví dụ trên cả hai đều thừa hưởng từ một lớp đặc biệt để cung cấp cho nó hành vi bổ sung cũng như sử dụng thuộc tính tùy chỉnh để thay đổi hành vi, các thuộc tính giống nhau tồn tại trên cả hai lớp, nhưng một lớp không chỉ là một đối tượng cũ đơn thuần nữa.


15
Tôi sẽ xem POCO là một lớp cũ đơn giản không cố gắng trở thành một phần của tập mẫu hợp thời trang. Tuy nhiên tôi cũng thích câu trả lời của bạn.
David Arno

1
Đồng ý - không phải là người hâm mộ tên C #, nhưng đó là những gì tôi nghe lần đầu tiên khi tôi thắc mắc về câu hỏi :) Lớp sau đó phù hợp với POJO, POVBO POC # O, POC ++ O, PORO, v.v.
David Mohundro

14
Điều này thực sự không đưa ra một câu trả lời tốt trong quan điểm cá nhân của tôi vì ai đó cũng tò mò. Ok, vì vậy không có thuộc tính nào mô tả cơ sở hạ tầng (ý nghĩa của các thuộc tính và cơ sở hạ tầng ... ví dụ như kết nối DB là gì? Ví dụ? Xin vui lòng). Những đối tượng miền của bạn không có trách nhiệm gì? Vậy POCO là một đối tượng miền (đối tượng BL) về cơ bản? Vì vậy, POCO thực sự chỉ là một từ viết tắt khác của Đối tượng lớp / Đối tượng lớp nghiệp vụ, tất cả đều có nghĩa là cùng một thứ chết tiệt. POCO / Đối tượng lớp doanh nghiệp / Đối tượng miền == cùng một thứ chết tiệt, chỉ 3 từ viết tắt khác nhau cho cùng một khái niệm phải không?
positiveGuy

4
câu trả lời này cho tôi biết hoàn toàn không có gì về thế giới thực ... chỉ là một định nghĩa mà bất cứ ai cũng có thể tìm kiếm trên Wikipedia. Làm thế nào về một số lớp POCO ví dụ ?? và tại sao họ là POCO trong bối cảnh.
Tích cực,

1
Ví dụ, một lớp bạn đã viết chỉ kế thừa từ System.Objectmột POCO. Nếu nó kế thừa từ ExternalFramework.OrmMapperBasehoặc một cái gì đó tương tự, nó không còn là POCO nữa.
David Mohundro 17/12/14

47

Hầu hết mọi người đã nói điều đó - Đối tượng CLR cũ đơn giản (trái ngược với POJO - Đối tượng Java cũ đơn giản)

POJO đã ra khỏi EJB, yêu cầu bạn thừa kế từ một lớp cha cụ thể cho những thứ như các đối tượng giá trị (những gì bạn nhận được từ một truy vấn trong ORM hoặc tương tự), vì vậy nếu bạn muốn chuyển từ EJB (ví dụ: Mùa xuân), bạn đã bị nhồi.

POJO chỉ là các lớp không bắt buộc kế thừa hoặc bất kỳ đánh dấu thuộc tính nào để làm cho chúng "hoạt động" trong bất kỳ khuôn khổ nào bạn đang sử dụng.

POCO là như nhau, ngoại trừ trong .NET.

Nói chung, nó sẽ được sử dụng xung quanh ORM - cũ hơn (và một số hiện tại) yêu cầu bạn kế thừa từ một lớp cơ sở cụ thể, liên kết bạn với sản phẩm đó. Những cái mới hơn không (nhibernate là biến thể mà tôi biết) - bạn chỉ cần tạo một lớp, đăng ký nó với ORM, và bạn đã tắt. Dễ dàng hơn nhiều.


1
chỉ vì mục đích hoàn chỉnh, CLR đã tạo ra cú pháp cho Common Language Runtime - máy ảo .net.
philant

4
Ví dụ .Net 3.5 sp1 ORM: khung Thực thể yêu cầu các lớp kế thừa từ một lớp khung nhất định. LINQ to SQL không có yêu cầu này. Do đó, LINQ to SQL hoạt động với POCO và khung Entity thì không.
Lucas

23

Tôi có thể sai về điều này .. nhưng dù sao, tôi nghĩ POCO là Đối tượng CLR Lớp đơn giản cũ và nó xuất phát từ Đối tượng Java cũ đơn giản POJO. POCO là một lớp chứa dữ liệu và không có hành vi.

Dưới đây là một ví dụ được viết bằng C #:

class Fruit 
{
    public Fruit() { }

    public Fruit(string name, double weight, int quantity) 
    {
        Name = name;
        Weight = weight;
        Quantity = quantity;
    }

    public string Name { get; set; }
    public double Weight { get; set; }
    public int Quantity { get; set; }

    public override string ToString() 
    {
        return $"{Name.ToUpper()} ({Weight}oz): {Quantity}";
    }
}

4
Đây phải là câu trả lời được chấp nhận. Nó cung cấp lời giải thích thực tế (Nó không có hành vi) và cũng có một ví dụ để hiểu rõ hơn về POCO trông như thế nào.
Héctor Álvarez

Không phải phương thức ToString () trong ví dụ này là "hành vi" sao?
jdoer1997

Tôi sẽ tranh luận về một POCO không có hành vi. Nó chỉ đơn giản là một lớp không phụ thuộc vào khung / thư viện khác ngoài .Net. Tức là lớp File là POCO, nhưng DbContext không phải vì phụ thuộc vào Entity Framework.
dùng3285954

9

POCO là viết tắt của "Đối tượng CLR cũ đơn giản".


24
ooooook? Vậy điều đó có nghĩa gì trong bối cảnh hay thế giới thực?
positiveGuy

27
Và như giáo viên điện trường trung học của tôi sẽ nói, "... và cam có vị cam"
Ian Boyd

7
Đúng, nhưng bài đăng này trông giống như một bình luận hơn là một câu trả lời vì nó không hoàn toàn trả lời câu hỏi.
anar khalilov

7

Để thêm các câu trả lời khác, tất cả các thuật ngữ POxx đều xuất phát từ POTS ( Dịch vụ điện thoại cũ đơn giản ).

POX, được sử dụng để định nghĩa XML đơn giản (cũ đơn giản), thay vì các công cụ đa lớp phức tạp liên quan đến REST, SOAP, v.v., là một thuật ngữ hữu ích và mơ hồ. PO (ngôn ngữ chèn của sự lựa chọn) Các thuật ngữ O khá mặc cho trò đùa mỏng.


6

Trong .NET, POCO là 'Đối tượng CLR cũ đơn giản'. Nó không phải là một 'đối tượng C # cũ' ...


5

Trong vùng đất Java thường "PO" có nghĩa là "cũ đơn giản". Phần còn lại có thể khó, vì vậy tôi đoán rằng ví dụ của bạn (trong ngữ cảnh của Java) là "đối tượng lớp cũ đơn giản".

một số ví dụ khác

  • POJO (đối tượng java cũ đơn giản)
  • POJI (giao diện java cũ đơn giản)

3

Hấp dẫn. Điều duy nhất tôi biết phải làm với lập trình và có POCO trong đó là POCO C ++ .


2

Theo thuật ngữ MVVM của WPF, một lớp POCO là một lớp không kích hoạt các sự kiện thuộc tính được thay đổi


1

Mặc dù tôi chắc chắn POCO có nghĩa là Đối tượng lớp cũ đơn giản hoặc Đối tượng C cũ đơn giản đối với 99,9% người dân ở đây, POCO cũng là Animator Pro (Autodesk) được xây dựng bằng ngôn ngữ kịch bản.


0

POCO là một đối tượng CLR cũ đơn giản, đại diện cho trạng thái và hành vi của ứng dụng theo miền vấn đề của nó. nó là một lớp thuần túy, không có sự kế thừa, không có thuộc tính nào. Thí dụ:

public class Customer
{
    public int Id { get; set; }

    public string Name { get; set; }
}
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.