「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

回答:


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; }
}

特別クラスの両方から継承上記の例では、それに追加の行動だけでなく、用途変更の動作にカスタム属性を与えること...同じプロパティが両方のクラスに存在しますが、1があるではないもはや単なる古いオブジェクト。


15
私はPOCOをトレンディなパターンセットの一部にしようとしないプレーンな古いクラスと見なします。しかし、私もあなたの答えが好きです。
David Arno、

1
同意しました-C#の名前のファンではありませんが、質問について不思議に思っていたときに私が最初に聞いたのはそれです:)クラスは次にPOJO、POVBO POC#O、POC ++ O、POROなどに適合します
David Mohundro

14
誰かも好奇心が強いので、これは私の個人的な意見では本当に良い答えを与えません。わかりましたので、インフラストラクチャを説明する属性はありません(属性とインフラストラクチャとはどういう意味ですか?たとえば、DB接続?何ですか?例を教えてください)。ドメインオブジェクトが持つべきではない責任は何ですか?POCOは基本的にドメインオブジェクト(BLオブジェクト)ですか?つまり、POCOはビジネスレイヤーオブジェクト/ドメインオブジェクトの別の頭字語にすぎません。POCO /ビジネスレイヤーオブジェクト/ドメインオブジェクト==いまいましいこと、同じコンセプトの3つの異なる頭字語だけですか?
PositiveGuy

4
この返信は、それが現実の世界で何であるかについてはまったく何も教えてくれません...ウィキペディアで誰でも検索できる定義です。POCOクラスの例はどうですか?そして、なぜそれらが文脈でPOCOであるのか。
PositiveGuy

1
例として、継承するだけのクラスSystem.ObjectはPOCOです。それから継承するExternalFramework.OrmMapperBaseか、そのようなものであれば、もはやPOCOではありません。
David Mohundro

47

ほとんどの人はそれを言っています-プレーンオールドCLRオブジェクト(以前のPOJO-プレーンオールドJavaオブジェクトとは対照的)

POJOはEJBから生まれたものであり、値オブジェクト(ORMなどのクエリから取得したもの)などの特定の親クラスから継承する必要があるため、EJBから(たとえば、春)、あなたはぬいぐるみでした。

POJOは、継承や属性マークアップを強制せずに、使用しているフレームワークで「機能」するクラスです。

.NETを除いて、POCOは同じです。

一般的にORMの周りで使用されます-古い(および現在のいくつかの)は、特定の基本クラスから継承する必要があり、その製品に関連付けられています。新しいものはいけません(nhibernateは私が知っているバリアントです)-クラスを作成し、それをORMに登録するだけで、オフになります。はるかに簡単です。


1
完全を期すために、CLRは共通言語ランタイム(.net仮想マシン)を強化しています。
フィランテ、2008年

4
.Net 3.5 sp1 ORMの例:Entityフレームワークでは、クラスが特定のフレームワーククラスから継承する必要があります。LINQ to SQLにはこの要件はありません。したがって、LINQ to SQLはPOCOで機能し、エンティティフレームワークは機能しません。
ルーカス

23

私はこれについて間違っているかもしれません。しかし、とにかく、POCOはプレーンオールドクラス CLRオブジェクトであり、POJOプレーンオールド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

私はPOCOに行動がないと主張します。.Net以外のフレームワーク/ライブラリに依存しないクラスです。つまり、FileクラスはPOCOですが、DbContextはEntity Frameworkに依存しているため、そうではありません。
user3285954

9

POCOは「Plain Old CLR Object」の略です。


24
おおおお?では、それは文脈や現実の世界で何を意味するのでしょうか?
PositiveGuy

27
そして、私の高校の電気の先生が言うように、「...そしてオレンジはオレンジ味がする」
Ian Boyd

7
正解ですが、この投稿は質問に完全に回答するわけではないため、回答というよりはコメントのように見えます。
anar khalilov 2013

7

他の回答を追加すると、POxx用語はすべてPOTS(プレーンな古い電話サービス)に由来するように見えます

REST、SOAPなどに関連する複雑な多層構造のものではなく、単純な(プレーンな)XMLを定義するために使用されるPOXは、便利で漠然と面白い用語でした。PO(選択した言語を挿入する)O用語は、冗談を薄めています。


6

.NETでは、POCOは「プレーンな古いCLRオブジェクト」です。「プレーンな古いC#オブジェクト」ではありません...


5

ジャワ島では通常、「PO」は「普通」を意味します。残りは注意が必要な場合があるので、(Javaのコンテキストでの)例は「プレーンな古いクラスオブジェクト」であると思います。

他のいくつかの例

  • POJO(プレーンな古いJavaオブジェクト)
  • POJI(プレーンな古いJavaインターフェース)



1

POCOとは、ここでは99.9%の人にとって、Plain Old Class ObjectまたはPlain Old C Objectを意味すると確信していますが、POCOは、Animator Pro(Autodesk)に組み込まれたスクリプト言語でもあります。


0

POCOはプレーンな古いCLRオブジェクトであり、問​​題ドメインの観点からアプリケーションの状態と動作を表します。それは、継承も属性もない純粋なクラスです。例:

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

    public string Name { get; set; }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.