Definicja „POCO”


238

Czy ktoś może zdefiniować, co dokładnie oznacza „POCO”? Coraz częściej spotykam się z tym terminem i zastanawiam się, czy chodzi tylko o zwykłe klasy, czy może coś więcej?


27
Zabawne jest również to, że „poco” to hiszpańskie słowo oznaczające „mało, niewiele”. A więc dobrze pasuje do tego kontekstu! en.wiktionary.org/wiki/poco
EnocNRoll - AnandaGopal Pardue

6
Oznacza to dokładnie to samo po włosku :)
BlackBear

3
A w języku portugalskim oznacza błąd, ponieważ jest napisane: „pouco”.
Ismael,

3
Brzmi jak PocoHaram dla mnie :)
przydatneBe

4
W języku polskim „POCO” to pytanie „Po co go używać”
titol

Odpowiedzi:


197

„Zwykły stary obiekt C #”

Po prostu normalna klasa, brak atrybutów opisujących problemy z infrastrukturą lub inne obowiązki, których nie powinny mieć obiekty Twojej domeny.

EDYCJA - jak podają inne odpowiedzi, technicznie jest to „Plain Old CLR Object”, ale ja, podobnie jak David Arno, wolę „Plain Old Object Class”, aby uniknąć powiązań z konkretnymi językami lub technologiami.

ABY WYJAŚNIĆ: Innymi słowy, nie wywodzą się z jakiejś specjalnej klasy bazowej ani nie zwracają żadnych specjalnych typów ze względu na swoje właściwości.

Poniżej znajduje się przykład każdego z nich.

Przykład POCO:

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

    public int Age { get; set; }
}

Przykład czegoś, co nie jest POCO:

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

    public int Age { get; set; }
}

Powyższy przykład dziedziczy po specjalnej klasie, aby nadać mu dodatkowe zachowanie, a także używa niestandardowego atrybutu do zmiany zachowania… te same właściwości istnieją w obu klasach, ale jedna nie jest już zwykłym starym obiektem.


15
Uważałbym POCO za zwykłą starą klasę, która nie próbuje być częścią modnego zestawu wzorów. Jednak podoba mi się również twoja odpowiedź.
David Arno

1
Zgadzam się - nie jestem fanem nazwy C #, ale to właśnie usłyszałem, kiedy zastanawiałem się nad pytaniem :) Klasa następnie pasuje do POJO, POVBO POC # O, POC ++ O, PORO itp.
David Mohundro

14
To nie jest dobra odpowiedź w mojej osobistej opinii, ponieważ ktoś też jest ciekawy. Ok, więc brak atrybutów opisujących infrastrukturę (co rozumiesz przez atrybuty i infrastrukturę ... na przykład połączenie DB? Co? Przykład proszę). Jakie obowiązki nie powinny mieć obiekty Twojej domeny? Więc POCO to w zasadzie obiekt domeny (obiekt BL)? Tak naprawdę POCO to po prostu kolejny akronim od Business Layer Object / Domain Object, które wszystkie oznaczają to samo cholerstwo. POCO / Business Layer Object / Domain Object == ta sama cholerna rzecz, tylko 3 różne akronimy dla tej samej koncepcji, prawda?
PositiveGuy,

4
ta odpowiedź nie mówi mi absolutnie nic o tym, co to jest w prawdziwym świecie ... tylko definicja, którą każdy może sprawdzić na Wikipedii. Co powiesz na kilka przykładowych klas POCO? i dlaczego są POCO w kontekście.
PositiveGuy

1
Na przykład napisana przez ciebie klasa, która dziedziczy tylko od, System.Objectto POCO. Jeśli dziedziczy po ExternalFramework.OrmMapperBaseczymś takim, nie jest już POCO.
David Mohundro,

47

Większość ludzi to powiedziała - Plain Old CLR Object (w przeciwieństwie do wcześniejszego POJO - Plain Old Java Object)

Jeden POJO wyszedł z EJB, który wymagał dziedziczenia od określonej klasy nadrzędnej dla rzeczy takich jak obiekty wartości (to, co otrzymujesz z zapytania w ORM lub podobnym), więc jeśli kiedykolwiek chciałeś przejść z EJB (np. Wiosna), byłeś wypchany.

POJO to tylko klasy, które nie wymuszają dziedziczenia ani żadnych znaczników atrybutów, aby działały w dowolnym używanym frameworku.

POCO są takie same, z wyjątkiem .NET.

Zasadniczo będzie on używany wokół ORM - starsze (i niektóre obecne) wymagają dziedziczenia od określonej klasy podstawowej, która wiąże cię z tym produktem. Nowsze nie (nhibernate jest wariantem, który znam) - po prostu tworzysz klasę, rejestrujesz ją w ORM i jesteś wyłączony. Dużo łatwiej.


1
tylko ze względu na kompletność, CLR stabds dla Common Language Runtime - wirtualnej maszyny .net.
filant

4
Przykład. ORM .Net 3.5 sp1: Framework Entity wymaga, aby klasy dziedziczyły po określonej klasie frameworka. LINQ to SQL nie ma tego wymagania. Dlatego LINQ to SQL działa z POCO, a struktura Entity nie.
Lucas

23

Mogę się mylić w tej kwestii ... ale w każdym razie myślę, że POCO to zwykły obiekt CLR starej klasy i pochodzi on od zwykłego starego obiektu Java POJO. POCO to klasa, która przechowuje dane i nie zachowuje się.

Oto przykład napisany w 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
To powinna być zaakceptowana odpowiedź. Zapewnia rzeczywiste wyjaśnienie (nie ma zachowań), a także ma przykład dla lepszego zrozumienia, jak wygląda POCO.
Héctor Álvarez

Czy metoda ToString () w tym przykładzie nie jest „zachowaniem”?
jdoer1997

Spierałbym się o to, że POCO nie zachowuje się. Jest to po prostu klasa, która nie zależy od innych frameworków / bibliotek niż .Net. Czyli klasa File to POCO, ale DbContext nie jest, ponieważ zależy od Entity Framework.
user3285954

9

POCO oznacza „Plain Old CLR Object”.


24
oooo co to znaczy w kontekście lub w realnym świecie?
PositiveGuy,

27
I jak powiedziałby mój nauczyciel elektryczności w liceum: „... a pomarańcze smakują pomarańczowo”
Ian Boyd

7
Zgadza się, ale ten post wygląda raczej na komentarz, niż odpowiedź, ponieważ nie odpowiada w pełni na pytanie.
anar khalilov

7

Aby dodać pozostałe odpowiedzi, wszystkie warunki POxx wydają się wynikać z POTS ( zwykłe stare usługi telefoniczne ).

POX, używany do definiowania prostego (zwykłego) XML, zamiast złożonych wielowarstwowych rzeczy związanych z REST, SOAP itp., Był użytecznym i nieco zabawnym terminem. PO (wstaw wybrany język) O terminy raczej zużyły dowcip.


6

W .NET POCO to „Zwykły stary obiekt CLR”. To nie jest „zwykły stary obiekt C #” ...


5

Na ziemi Java zwykle „PO” oznacza „zwykły stary”. Reszta może być trudna, więc zgaduję, że twoim przykładem (w kontekście Javy) jest „zwykły obiekt starej klasy”.

kilka innych przykładów

  • POJO (zwykły stary obiekt Java)
  • POJI (zwykły stary interfejs Java)



1

Chociaż jestem pewien, że POCO oznacza Plain Old Object lub Plain Old C Object dla 99,9% ludzi tutaj, POCO jest również wbudowanym językiem skryptowym Animator Pro (Autodesk).


0

POCO to zwykły stary obiekt CLR, który reprezentuje stan i zachowanie aplikacji pod względem jej problematycznej dziedziny. jest to klasa czysta, bez dziedziczenia, bez żadnych atrybutów. Przykład:

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

    public string Name { get; set; }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.