'POCO'-Definition


238

Kann jemand definieren, was genau "POCO" bedeutet? Ich begegne dem Begriff immer öfter und frage mich, ob es nur um einfache Klassen geht oder ob es etwas mehr bedeutet?


27
Es ist auch lustig, dass "poco" ein spanisches Wort ist, das "wenig, nicht viel" bedeutet. Es passt also gut zu diesem Kontext! en.wiktionary.org/wiki/poco
EnocNRoll - AnandaGopal Pardue

6
Es bedeutet genau dasselbe auch auf Italienisch :)
BlackBear

3
Und auf Portugiesisch bedeutet ein Fehler, weil es geschrieben ist: "pouco".
Ismael

3
Klingt für mich nach PocoHaram :)
nützlichBee

4
Auf Polnisch ist "POCO" die Frage "Warum es benutzen"
Titol

Antworten:


197

"Einfaches altes C # -Objekt"

Nur eine normale Klasse, keine Attribute, die Infrastrukturprobleme oder andere Verantwortlichkeiten beschreiben, die Ihre Domänenobjekte nicht haben sollten.

BEARBEITEN - wie andere Antworten angegeben haben, handelt es sich technisch gesehen um "einfaches altes CLR-Objekt", aber ich bevorzuge, wie David Arno kommentiert, "einfaches altes Klassenobjekt", um Verbindungen zu bestimmten Sprachen oder Technologien zu vermeiden.

ZU KLARIFIZIEREN: Mit anderen Worten, sie stammen weder von einer speziellen Basisklasse ab, noch geben sie spezielle Typen für ihre Eigenschaften zurück.

Unten finden Sie jeweils ein Beispiel.

Beispiel eines POCO:

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

    public int Age { get; set; }
}

Beispiel für etwas, das kein POCO ist:

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

    public int Age { get; set; }
}

Das obige Beispiel erbt beide von einer speziellen Klasse, um ihr zusätzliches Verhalten zu verleihen, und verwendet ein benutzerdefiniertes Attribut, um das Verhalten zu ändern. Für beide Klassen sind dieselben Eigenschaften vorhanden, aber eines ist nicht mehr nur ein einfaches altes Objekt.


15
Ich würde einen POCO als eine einfache alte Klasse betrachten, die nicht versucht, Teil des trendigen Mustersets zu sein. Ihre Antwort gefällt mir jedoch auch.
David Arno

1
Einverstanden - kein Fan des C # -Namens, aber das habe ich zum ersten Mal gehört, als ich mich über die Frage gewundert habe :) Klasse passt dann zu POJO, POVBO POC # O, POC ++ O, PORO usw.
David Mohundro

14
Dies gibt meiner persönlichen Meinung nach als jemand, der auch neugierig ist, keine wirklich gute Antwort. Ok, also keine Attribute, die die Infrastruktur beschreiben (was meinst du mit Attributen und Infrastruktur ... zum Beispiel eine DB-Verbindung? Was? Beispiel bitte). Welche Verantwortlichkeiten sollten Ihre Domain-Objekte nicht haben? POCO ist also im Grunde ein Domain-Objekt (BL-Objekt)? POCO ist also wirklich nur ein weiteres Akronym für ein Business-Layer-Objekt / Domain-Objekt, die alle dasselbe bedeuten. POCO / Business Layer Object / Domain Object == dasselbe verdammte Ding, nur 3 verschiedene Akronyme für dasselbe Konzept, oder?
PositiveGuy

4
Diese Antwort sagt mir absolut nichts darüber aus, was es in der realen Welt ist ... nur eine Definition, die jeder auf Wikipedia nachschlagen kann. Wie wäre es mit einigen Beispiel-POCO-Klassen? und warum sie im Kontext POCO sind.
PositiveGuy

1
Eine Klasse, die Sie geschrieben haben und von der Sie nur erben, System.Objectist beispielsweise ein POCO. Wenn es von ExternalFramework.OrmMapperBaseoder so etwas erbt , ist es kein POCO mehr.
David Mohundro

47

Die meisten Leute haben es gesagt - einfaches altes CLR-Objekt (im Gegensatz zum früheren POJO - einfaches altes Java-Objekt)

Das POJO stammt aus EJB, sodass Sie von einer bestimmten übergeordneten Klasse für Dinge wie Wertobjekte erben mussten (was Sie von einer Abfrage in einem ORM oder ähnlichem zurückerhalten), wenn Sie also jemals von EJB wechseln wollten (z. B. zu Frühling), du warst vollgestopft.

POJOs sind nur Klassen, die keine Vererbung oder Attributmarkierungen erzwingen, damit sie in dem von Ihnen verwendeten Framework "funktionieren".

POCOs sind bis auf .NET identisch.

Im Allgemeinen wird es für ORMs verwendet - ältere (und einige aktuelle) erfordern, dass Sie von einer bestimmten Basisklasse erben, die Sie an dieses Produkt bindet. Neuere nicht (nhibernate ist die Variante, die ich kenne) - Sie erstellen einfach eine Klasse, registrieren sie beim ORM und schon geht es los. Viel einfacher.


1
Nur der Vollständigkeit halber greift CLR auf Common Language Runtime zurück - die virtuelle .net-Maschine.
Philant

4
.Net 3.5 sp1 ORM-Beispiel: Das Entity-Framework erfordert, dass Klassen von einer bestimmten Framework-Klasse erben. Für LINQ to SQL ist diese Anforderung nicht erforderlich. Daher funktioniert LINQ to SQL mit POCOs und das Entity-Framework nicht.
Lucas

23

Ich kann mich irren, aber ich denke, POCO ist Plain Old Class CLR-Objekt der und es stammt von einem einfachen alten POJO-Java-Objekt. Ein POCO ist eine Klasse, die Daten enthält und kein Verhalten aufweist.

Hier ist ein Beispiel in 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
Dies sollte die akzeptierte Antwort sein. Es enthält die eigentliche Erklärung (es hat kein Verhalten) und ein Beispiel, um besser zu verstehen, wie ein POCO aussieht.
Héctor Álvarez

Ist die ToString () -Methode in diesem Beispiel nicht ein "Verhalten"?
jdoer1997

Ich würde darüber streiten, dass ein POCO kein Verhalten hat. Es ist einfach eine Klasse, die nicht von einem anderen Framework / einer anderen Bibliothek als .Net abhängt. Das heißt, die File-Klasse ist POCO, DbContext jedoch nicht, da dies vom Entity Framework abhängt.
user3285954

9

POCO steht für "Plain Old CLR Object".


24
ooooook? Was bedeutet das im Kontext oder in der realen Welt?
PositiveGuy

27
Und wie mein Elektrizitätslehrer an der High School sagen würde: "... und Orangen schmecken orange"
Ian Boyd

7
Richtig, aber dieser Beitrag sieht eher nach einem Kommentar als nach einer Antwort aus, da er die Frage nicht vollständig beantwortet.
Anar Khalilov

7

Um die anderen Antworten hinzuzufügen, scheinen alle POxx-Begriffe von POTS ( Plain old phone services ) zu stammen.

Der POX, der verwendet wurde, um einfaches (einfaches altes) XML zu definieren, und nicht das komplexe mehrschichtige Material, das mit REST, SOAP usw. verbunden ist, war ein nützlicher und vage amüsanter Begriff. PO (Sprache der Wahl einfügen) O Begriffe haben den Witz eher dünn getragen.


6

In .NET ist ein POCO ein 'einfaches altes CLR-Objekt'. Es ist kein 'einfaches altes C # -Objekt' ...


5

In Java bedeutet "PO" normalerweise "einfach alt". Der Rest kann schwierig sein, daher vermute ich, dass Ihr Beispiel (im Kontext von Java) "einfaches altes Klassenobjekt" ist.

einige andere Beispiele

  • POJO (einfaches altes Java-Objekt)
  • POJI (einfache alte Java-Schnittstelle)


2

In WPF MVVM-Begriffen ist eine POCO-Klasse eine Klasse, die keine PropertyChanged-Ereignisse auslöst


1

Während ich sicher bin, dass POCO für 99,9% der Menschen hier ein einfaches altes Klassenobjekt oder ein einfaches altes C-Objekt bedeutet, ist POCO auch Animator Pro (Autodesk), das in Skriptsprache erstellt wurde.


0

POCO ist ein einfaches altes CLR-Objekt, das den Status und das Verhalten der Anwendung in Bezug auf ihre Problemdomäne darstellt. Es ist eine reine Klasse, ohne Vererbung, ohne Attribute. Beispiel:

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

    public string Name { get; set; }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.