“ POCO”的定义


238

有人可以定义“ POCO”的确切含义吗?我越来越频繁地遇到这个词,我想知道这是仅关于普通类还是意味着更多?


27
同样有趣的是,“ poco”是西班牙语单词,意思是“很小,不多”。因此,它非常适合此上下文!en.wiktionary.org/wiki/poco
EnocNRoll-AnandaGopal Pardue 2010年

6
这也意味着意大利语也完全相同:)
BlackBear 2012年

3
在葡萄牙语中表示错误,因为它的拼写为:“ pouco”。
Ismael 2012年

3
对我来说听起来像是PocoHaram :)
有用的蜜蜂

4
在波兰语中,“ POCO”是问题“为什么要使用它”
titol

Answers:


197

“普通的旧C#对象”

只是一个普通的类,没有任何属性描述基础架构问题或您的域对象不应该承担的其他责任。

编辑-正如其他答案所说,从技术上讲,它是“普通的旧CLR对象”,但我像David Arno的评论一样,更喜欢“普通的旧类对象”,以避免与特定语言或技术的联系。

要澄清:换句话说,它们不是从某些特殊的基类派生的,也不是为其属性返回任何特殊的类型。

请参阅下面的示例。

POCO的示例:

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

    public int Age { get; set; }
}

非POCO的示例:

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

    public int Age { get; set; }
}

上面的示例都继承自一个特殊的类,以赋予其其他行为,并使用自定义属性来更改行为……两个类中都存在相同的属性,但现在不再仅仅是一个普通的旧对象。


15
我认为POCO是普通的老类,不会尝试成为时髦模式集的一部分。但是我也喜欢你的回答。
David Arno,

1
同意-不喜欢C#名称,但是那是我在想这个问题时首先听到的:)然后,类适合POJO,POVBO POC#O,POC ++ O,PORO等
David Mohundro

14
以我个人的观点来看,这确实不能给出很好的答案,因为有人也很好奇。好的,因此没有描述基础结构的属性(请问属性和基础结构是什么意思……例如一个数据库连接?什么?示例)。您的领域对象不应该承担什么责任?那么POCO基本上是领域对象(BL对象)吗?所以说真的,POCO只是业务层对象/域对象的另一个缩写,它们都意味着相同的东西。POCO /业务层对象/域对象==相同的东西,对于相同的概念只有3个不同的缩写对吗?
PositiveGuy 2010年

4
这个答复完全没有告诉我现实世界中的一切……这是任何人都可以在Wikipedia上查找的定义。一些示例POCO类怎么样?以及为什么它们在上下文中是POCO。
PositiveGuy 2010年

1
例如,您编写的仅继承自的类System.Object是POCO。如果它继承自ExternalFramework.OrmMapperBase或类似的东西,那就不再是POCO。
David Mohundro 2014年

47

大多数人都说过-Plain Old CLR Object(与早期的POJO相反-Plain Old Java Object)

POJO是从EJB产生的,它要求您从特定的父类继承诸如值对象(从ORM或类似查询中获取的内容)之类的东西,因此,如果您想从EJB迁移(例如春天),你被塞满了。

POJO只是不强制继承或任何属性标记以使其在您使用的任何框架中“起作用”的类。

POCO相同,但.NET中除外。

通常,它将在ORM周围使用-较旧的(和一些当前的)需要您从特定的基类继承,该基类将您绑定到该产品。较新的不会(休眠是我所知道的变体)-您只需创建一个类,并向ORM注册,然后退出。容易得多。


1
仅出于完整性考虑,CLR刺穿了公共语言运行库-.net虚拟机。
philant

4
.Net 3.5 sp1 ORM示例:实体框架要求类从某个框架类继承。LINQ to SQL没有此要求。因此,LINQ to SQL可以与POCO一起使用,而Entity Framework则不能。
卢卡斯2009年

23

我对此可能是错的。但是无论如何,我认为POCO是Plain Old Class CLR对象,它来自POJO Plain老Java对象。POCO是保存数据且没有行为的类。

这是用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
这应该是公认的答案。它提供了实际的解释(没有行为),还提供了一个示例以更好地了解POCO的外观。
埃克托·阿尔瓦雷斯

在此示例中,ToString()方法不是“行为”吗?
jdoer1997 '19

我会争论POCO没有行为。它只是一个类,不依赖于.Net以外的其他框架/库。即File类是POCO,但DbContext不是因为依赖于Entity Framework。
user3285954

9

POCO代表“普通的旧CLR对象”。


24
喔?那么在上下文或现实世界中这意味着什么?
PositiveGuy 2010年

27
正如我的高中电力老师会说的那样:“……橙子尝起来是橙子的”
Ian Boyd

7
是的,但是由于该帖子无法完全回答问题,因此看起来更像是评论,而不是答案。
anar khalilov 2013年

7

要添加其他答案,POxx术语似乎都源于POTS(普通的旧电话服务)。

POX用来定义简单的(纯老式的)XML,而不是与REST,SOAP等相关的复杂的多层东西,是一个有用的,含糊不清的术语。PO(选择插入的语言)O术语使这个笑话变得轻描淡写。


6

在.NET中,POCO是“普通的旧CLR对象”。它不是“普通的旧C#对象” ...


5

在Java土地上,“ PO”通常表示“普通”。其余的可能很棘手,所以我猜测您的示例(在Java上下文中)是“普通的旧类对象”。

其他一些例子

  • POJO(普通的旧Java对象)
  • POJI(普通的Java旧界面)


2

用WPF MVVM术语来说,POCO类是不会触发PropertyChanged事件的类。


1

虽然我确定POCO对99.9%的人意味着普通旧类对象或普通旧C对象,但POCO还是使用脚本语言构建的Animator Pro(Autodesk)。


0

POCO是一个普通的旧CLR对象,从问题域的角度表示应用程序的状态和行为。它是一个纯类,没有继承,没有任何属性。例:

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

    public string Name { get; set; }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.