Определение 'POCO'

238

Может кто-нибудь определить, что именно означает «POCO»? Я сталкиваюсь с этим термином все чаще и чаще, и мне интересно, если речь идет только о простых классах или это означает нечто большее?

Saku
источник
27
Также забавно, что «poco» - это испанское слово, означающее «мало, не много». Таким образом, это хорошо вписывается в этот контекст! en.wiktionary.org/wiki/poco
EnocNRoll - AnandaGopal Pardue
6
То же самое на итальянском означает то же самое :)
BlackBear
3
А по-португальски означает ошибку, потому что пишется: «pouco».
Исмаэль
3
Похоже, PocoHaram для меня :)
полезноBee
4
В польском «POCO» есть вопрос «Зачем его использовать»
titol

Ответы:

197

"Простой старый объект C #"

Просто обычный класс, без атрибутов, описывающих проблемы инфраструктуры или другие обязанности, которые не должны иметь ваши доменные объекты.

РЕДАКТИРОВАТЬ - как уже говорилось в других ответах, технически это «Простой старый объект CLR», но я, как и комментарии Дэвида Арно, предпочитаю «Простой старый объект класса», чтобы избежать связей с конкретными языками или технологиями.

УТОЧНИТЬ: Другими словами, они не являются производными от какого-то специального базового класса и не возвращают никаких специальных типов для своих свойств.

Ниже приведен пример каждого из них.

Пример 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 как простой старый класс, который не пытается быть частью модного набора паттернов. Однако мне тоже нравится ваш ответ.
Дэвид Арно
1
Согласен - не фанат названия C #, но это было то, что я впервые услышал, когда задавался вопросом об этом вопросе :) Класс подходит для POJO, POVBO POC # O, POC ++ O, PORO и т. Д.
David Mohundro
14
Это не дает хорошего ответа, по моему личному мнению, поскольку кому-то также любопытно. Итак, нет атрибутов, описывающих инфраструктуру (что вы подразумеваете под атрибутами и инфраструктурой ... например, соединение с БД? Что? Пример, пожалуйста). Какими обязанностями не должны обладать ваши доменные объекты? Итак, POCO - это доменный объект (BL-объект) в принципе? Так что на самом деле POCO - это просто еще одна аббревиатура для объекта бизнес-уровня / объекта домена, которые все означают одно и то же. POCO / объект бизнес-уровня / объект домена == одна и та же проклятая вещь, только 3 разных аббревиатуры для одной и той же концепции, верно?
PositiveGuy
4
этот ответ абсолютно ничего не говорит мне о том, что это такое в реальном мире ... просто определение, которое каждый может найти в Википедии. Как насчет примеров классов POCO? и почему они POCO в контексте.
PositiveGuy
1
Например, класс, который вы написали и наследует только от него, System.Objectявляется POCO. Если он наследует ExternalFramework.OrmMapperBaseили что-то в этом роде, это уже не POCO.
Дэвид Мохундро
47

Большинство людей сказали это - Простой старый объект CLR (в отличие от более раннего POJO - Простой старый объект Java)

POJO один вышел из EJB, который требовал от вас наследования от определенного родительского класса для таких вещей, как объекты-значения (что вы получаете от запроса в ORM или аналогичном), так что если вы когда-либо хотели перейти из EJB (например, в Весна), вы были чучела.

POJO - это просто классы, которые не вызывают наследование или разметку каких-либо атрибутов, чтобы заставить их «работать» в любой среде, которую вы используете.

POCO те же, за исключением .NET.

Как правило, он будет использоваться вокруг ORM - более старые (и некоторые текущие) требуют, чтобы вы наследовали от определенного базового класса, который связывает вас с этим продуктом. Более новых нет (nhibernate - вариант, который я знаю) - вы просто создаете класс, регистрируете его в ORM, и вы отключаетесь. Намного легче.

Ник Мудрый
источник
1
для полноты картины CLR использует Common Language Runtime - виртуальную машину .net.
Филант
4
Пример .Net 3.5 sp1 ORM: платформа Entity требует, чтобы классы наследовали от определенного класса инфраструктуры. LINQ to SQL не имеет этого требования. Поэтому LINQ to SQL работает с POCO, а платформа Entity - нет.
Лукас
23

Я могу ошибаться в этом ... но в любом случае, я думаю, что POCO - это CLR-объект простого старого класса, и он происходит из простого старого Java-объекта POJO. 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
Я бы поспорил о POCO, не имеющем поведения. Это просто класс, который не зависит от других фреймворков / библиотек, кроме .Net. Т.е. класс File - это POCO, но DbContext - не потому, что зависит от Entity Framework.
user3285954
9

POCO расшифровывается как «Простой старый объект CLR».

Роберт Гэмбл
источник
24
ooooook? так что это значит в контексте или в реальном мире?
PositiveGuy
27
И, как сказал бы мой учитель в старших классах по электричеству: «... и апельсины на вкус апельсиновые»
Ян Бойд,
7
Правильно, но этот пост выглядит скорее как комментарий, а не как ответ, так как он не полностью отвечает на вопрос.
Анар Халилов
7

Чтобы добавить другие ответы, все термины POxx, кажется, происходят из POTS ( простые старые телефонные услуги ).

POX, используемый для определения простого (простого старого) XML, а не сложного многослойного материала, связанного с REST, SOAP и т. Д., Был полезным и довольно забавным термином. П.О. (вставьте язык по выбору) О, термины довольно шумиха.

Дэвид Арно
источник
6

В .NET POCO - это «Простой старый объект CLR». Это не «Простой старый объект C #» ...

Hardgraf
источник
5

На земле Java, как правило, «PO» означает «простой старый». Остальное может быть сложным, поэтому я предполагаю, что ваш пример (в контексте Java) - «объект старого класса».

некоторые другие примеры

  • POJO (простой старый объект Java)
  • POJI (простой старый интерфейс Java)
basszero
источник
2

В терминах WPF MVVM класс POCO - это класс, который не генерирует события PropertyChanged.

Нулевой указатель
источник
1

Хотя я уверен, что POCO означает «Простой старый класс» или «Простой старый объект C» для 99,9% людей, POCO также является встроенным языком сценариев Animator Pro (Autodesk).

Мистер Мистери Гость
источник
0

POCO - это простой старый объект CLR, который представляет состояние и поведение приложения с точки зрения его проблемной области. это чистый класс, без наследования, без каких-либо атрибутов. Пример:

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

    public string Name { get; set; }
}
Мохаммед Камель
источник