Définition de «POCO»


238

Quelqu'un peut-il définir ce que signifie exactement «POCO»? Je rencontre le terme de plus en plus souvent, et je me demande s'il ne s'agit que de classes simples ou s'il signifie quelque chose de plus?


27
C'est aussi drôle que "poco" est un mot espagnol qui signifie "peu, pas beaucoup". Donc, cela correspond bien à ce contexte! en.wiktionary.org/wiki/poco
EnocNRoll - AnandaGopal Pardue

6
Cela signifie exactement la même chose en italien aussi :)
BlackBear

3
Et en portugais signifie une erreur car il s'écrit: "pouco".
Ismael

3
Cela ressemble à PocoHaram pour moi :)
utileBee

4
En polonais "POCO" est la question "Pourquoi l'utiliser"
titol

Réponses:


197

"Plain Old C # Object"

Juste une classe normale, aucun attribut décrivant des problèmes d'infrastructure ou d'autres responsabilités que vos objets de domaine ne devraient pas avoir.

EDIT - comme d'autres réponses l'ont indiqué, il s'agit techniquement de "Plain Old CLR Object", mais comme le commente David Arno, je préfère "Plain Old Class Object" pour éviter les liens avec des langages ou technologies spécifiques.

POUR CLARIFIER: En d'autres termes, ils ne dérivent pas d'une classe de base spéciale et ne renvoient aucun type spécial pour leurs propriétés.

Voir ci-dessous pour un exemple de chacun.

Exemple d'un POCO:

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

    public int Age { get; set; }
}

Exemple de quelque chose qui n'est pas un POCO:

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

    public int Age { get; set; }
}

L'exemple ci-dessus hérite à la fois d'une classe spéciale pour lui donner un comportement supplémentaire et utilise un attribut personnalisé pour changer de comportement… les mêmes propriétés existent sur les deux classes, mais l'une n'est plus seulement un vieil objet ordinaire.


15
Je considérerais un POCO comme une vieille classe ordinaire qui n'essaie pas de faire partie de l'ensemble de modèles à la mode. Mais j'aime aussi votre réponse.
David Arno

1
D'accord - pas un fan du nom C #, mais c'est ce que j'ai entendu pour la première fois quand je me posais la question :) La classe correspond alors à POJO, POVBO POC # O, POC ++ O, PORO, etc.
David Mohundro

14
Cela ne donne pas vraiment une bonne réponse à mon avis personnel en tant que quelqu'un aussi curieux. Ok, donc pas d'attributs décrivant l'infrastructure (qu'entendez-vous par attributs et infrastructure ... une connexion DB par exemple? Quoi? Exemple s'il vous plaît). Quelles responsabilités vos objets de domaine ne devraient-ils pas avoir? Donc, POCO est fondamentalement un objet de domaine (objet BL)? Donc vraiment POCO est juste un autre acronyme pour un objet de couche métier / objet de domaine qui signifie tous la même putain de chose. POCO / Business Layer Object / Domain Object == même fichu truc, juste 3 acronymes différents pour le même concept n'est-ce pas?
PositiveGuy

4
cette réponse ne me dit absolument rien de ce que c'est dans le monde réel ... juste une définition que n'importe qui peut consulter sur Wikipédia. Que diriez-vous de quelques exemples de classes POCO ?? et pourquoi ils sont POCO dans leur contexte.
PositiveGuy

1
À titre d'exemple, une classe que vous avez écrite et qui n'hérite que d' System.Objectun POCO. S'il hérite ExternalFramework.OrmMapperBaseou quelque chose comme ça, ce n'est plus un POCO.
David Mohundro

47

La plupart des gens l'ont dit - Plain Old CLR Object (par opposition à l'ancien POJO - Plain Old Java Object)

Le POJO est sorti d'EJB, ce qui vous obligeait à hériter d'une classe parent spécifique pour des choses comme les objets de valeur (ce que vous récupérez d'une requête dans un ORM ou similaire), donc si vous avez toujours voulu passer d'EJB (par exemple à Printemps), vous étiez en peluche.

Les POJO ne sont que des classes qui ne forcent pas l'héritage ou tout balisage d'attribut pour les faire "fonctionner" dans le cadre que vous utilisez.

Les POCO sont les mêmes, sauf en .NET.

Généralement, il sera utilisé autour des ORM - les anciens (et certains actuels) nécessitent que vous héritiez d'une classe de base spécifique, qui vous lie à ce produit. Les plus récents ne le font pas (nhibernate étant la variante que je connais) - il vous suffit de créer une classe, de l'enregistrer auprès de l'ORM, et c'est parti. Beaucoup plus facile.


1
juste pour être complet, CLR stabds pour Common Language Runtime - la machine virtuelle .net.
philant

4
Exemple ORM .Net 3.5 sp1: le framework Entity requiert que les classes héritent d'une certaine classe de framework. LINQ to SQL n'a pas cette exigence. Par conséquent, LINQ to SQL fonctionne avec les POCO et pas le framework Entity.
Lucas

23

Je peux me tromper à ce sujet .. mais de toute façon, je pense que POCO est un objet CLR Plain Old Class et il vient de POJO plain old Java Object. Un POCO est une classe qui contient des données et n'a aucun comportement.

Voici un exemple écrit en 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
Ce devrait être la réponse acceptée. Il fournit l'explication réelle (il n'a aucun comportement) et a également un exemple pour mieux comprendre à quoi ressemble un POCO.
Héctor Álvarez

La méthode ToString () dans cet exemple n'est-elle pas un "comportement"?
jdoer1997

Je dirais qu'un POCO n'a pas de comportement. C'est simplement une classe qui ne dépend pas d'un autre framework / bibliothèque que .Net. C'est-à-dire que la classe File est POCO, mais DbContext ne l'est pas car dépend d'Entity Framework.
user3285954

9

POCO signifie "Plain Old CLR Object".


24
ooooook? alors qu'est-ce que cela signifie dans le contexte ou dans le monde réel?
PositiveGuy

27
Et comme dirait mon professeur d'électricité au lycée, "... et les oranges ont un goût d'orange"
Ian Boyd

7
C'est vrai, mais ce post ressemble plus à un commentaire qu'à une réponse car il ne répond pas complètement à la question.
anar khalilov

7

Pour ajouter les autres réponses, les termes POxx semblent tous provenir de POTS ( Plain old telephone services ).

Le POX, utilisé pour définir un XML simple (ancien), plutôt que les éléments complexes à plusieurs couches associés à REST, SOAP, etc., était un terme utile et vaguement amusant. PO (insérer la langue de choix) Les termes O ont plutôt usé la plaisanterie.


6

Dans .NET, un POCO est un «ancien objet CLR simple». Ce n'est pas un 'ancien objet C # ordinaire' ...


5

En Java, la terre "PO" signifie "tout simplement vieux". Le reste peut être délicat, donc je suppose que votre exemple (dans le contexte de Java) est un "objet de classe ancienne".

quelques autres exemples

  • POJO (simple vieil objet java)
  • POJI (simple vieille interface java)


2

En termes WPF MVVM, une classe POCO est une classe qui ne déclenche pas les événements PropertyChanged


1

Bien que je sois sûr que POCO signifie Objet Plain Old Class ou Plain Old C Object pour 99,9% des gens ici, POCO est également Animator Pro (Autodesk) construit en langage de script.


0

POCO est un vieil objet CLR simple, qui représente l'état et le comportement de l'application en termes de domaine problématique. c'est une classe pure, sans héritage, sans aucun attribut. Exemple:

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

    public string Name { get; set; }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.