メソッドなしでクラスを何と呼びますか?


10

メソッドなしでクラスを何と呼びますか?

例えば、

class A
{
  public string something;
  public int a;
}

上記はメソッドのないクラスです。このタイプのクラスには特別な名前がありますか?


1
メソッドのないクラス?
ChaosPandion 2012

11
専門用語はレコードまたは構造です。
キリアンフォス

4
「プロパティバッグ」
マーティンヨーク

キリアン:追加された意味合いでは「美化された構造体」を好む。
Jason

回答:


23

ほとんどの場合、アンチパターンです。

どうして?「Operator」クラスとデータ構造を使用した手続き型プログラミングが容易になるためです。データと動作を分離しますが、これは正確なOOPではありません。

多くの場合、DTO(データ転送オブジェクト)

ビジネス/ドメインオブジェクトから派生した、データを交換するためのデータ構造のみを読み取ります。

時々:単なるデータ構造。

まあ、たまに、単純で単純なデータを保持するための構造がなくてはならず、何も操作しない場合もあります。しかし、私はパブリックフィールドではなく、アクセサー(ゲッターとセッター)を使用します。


4
私は誰もがJavaでパブリックゲッター/セッターのみを使用してクラスを実行することをお勧めします。それは頭が痛く、一部のコンテナーはセッター/ゲッターコード(Glassfishを見て...)も実行しないため、それがデフォルトであるか、バグ。OOPカプセル化が適切であったとは思いません。ほとんどの場合、ほとんどのアプリケーションで、DTOは必要なだけでなく、最も頻繁に使用されるクラスであることがわかりました。だから、それらはアンチパターン以外のものです。代わりに「基本的なビルディングブロック」という言葉を使用します。
Aadaam

8
厳密にオブジェクト指向の環境にいる場合、これらはおそらくアンチパターンです。プログラミングの世界の残りすべての場合、フィールドの単純な異種のコレクションであるデータ構造を持つことは、代替案よりも明らかにメリットがあり、有名なOOの主力の1つでさえ奨励されています。
Telastyn 2012

@Aadaam:あなたは私を正しく理解していませんでした。DTOはアンチパターンではありません。時には、それらのオブジェクトは、DTOである場合に限り完全に正常です。Glassfishがゲッターとセッターを調べない場合、それはGlassfishが適切に記述されていないことを意味します(組み込みのアクセサーがないJavaでは難しい)。このコードは頭の痛いものではなく、便利な定型文です。
Falcon

4
クイック、@ Aadaam。誰かがフィールドを無効な値に設定しているため、後で読み取ったときに混乱が生じています。例外をスローして、原因を検出できるようにします。1,000か所で使用される公共の場でそのようなことを初めて行う必要があるときは、セッターが必要になります。パブリックフィールドはその場所にありますが、ゲッター/セッターパラダイムは正当な理由で人気があります。
カールビーレフェルト

@KarlBielefeldt:Glassfishの1つのバージョンでは、テスト(条件なし)としてセッターコードに1つの例外があり、実行されませんでした。プロパティにはプライベート変数と2つのパブリックゲッターアンドセッターがありました。コンテナーは単にセッターを回避しました。何かが実際に無効な値を持っている場合、個人的にはプリミティブ値の代わりにタイプクラスを使用しますが、それはおそらく私だけです。
Aadaam

9

私はそれを呼び出すstructrecord、それがデータストレージに使用されているため、Cご覧のようにstruct(Cプログラミング言語)に非常に一般的です。したがって、個人的にstructは、より適切で読みやすいクラスの代わりにを使用したいと思います。

struct A
{
  public string something;
  public int a;
}

通常、他の人が言ったように、それらはDTO(データ転送オブジェクト)として使用されます。


4
structの問題は、 "struct"が多くの言語のキーワードであることです。たとえばC#は、構造体を異なるセマンティクスを持つ値型として扱います。これは、一部の言語(PL / SQL)の「レコード」にも当てはまります。
Falcon

5

これらは、Plain Old __ Objects(PO_Os)と呼ばれ、空白はJava、C、CIL、または使用している言語です。

通信用の単純なデータブロックとして使用されている場合、それらはデータ転送オブジェクト(DTO)と呼ばれます。

外部から提供されたデータを表す場合、それらはエンティティと呼ばれます。


6
あなたはPODについて考えている-非常に異なるアイデア。POJOは明示的に「ビジネスロジック」を含みますが、特定のフレームワークへの依存を除外します。
トムホーティン-12

PODは、少なくともC ++ではメソッドを持つことができます。必要なのは、簡単なコンストラクタ、デストラクタ、コピーコンストラクタ、割り当てコンストラクタ、パブリックデータメンバー、基本クラス、仮想関数のみです。基本的に、それらはC構造体と互換性がある必要があります。
Dirk Holsopple 2012

2

私はそのようなクラスを可変データホルダーと呼び、時々ジェネリックフォームを使用しました:

class DataHolder<T>
{
   public T dat;
}

datプロパティアクセサが実行できることは何もないため(フィールドの読み取り/書き込み以外)、一部の実装に影響を与えないため、プロパティ内でラップするとパフォーマンスが低下し、メリットがありません。さらに、(または、構造体の場合はそのフィールドを持つ)Interlockedメソッドを使用する必要datがある場合datがありますが、プロパティにラップされている場合は不可能です。

しばらく可変データ保有者は、(変更可能かどうか)のタイプのために有用である可能性があることに注意することはその必要性ホールドデータ、彼らが安全に不変型がするのと同じ方法でデータ交換のために使用することはできません。たとえば、次のようなステートメント:

myData = myCollection.GetData(myKey);

GetData変更可能なデータへの参照を含まない不変のクラス型または構造体(「ミュータブル」かどうか)が返された場合、明確な意味があります。ただし、変更可能なクラスオブジェクトを返した場合、そのオブジェクトへの変更が基になるコレクションによって一貫して無視されるか、一貫してクリーンな更新になるか、どちらの説明にも合わない厄介なまたは予測できない動作が発生するかどうかは不明です。

コレクションが可変オブジェクトでデータを返すことを望んだ場合、正しいパラダイムは多くの場合次のようになります。

var myData = new WhateverType();
myCollection.GetData(myKey, myData);
myData.ModifySomehow();
myCollection.StoreData(myKey, myData);

そのアプローチを使用すると、コレクションからのデータが入力されますが、関数が完了するとそれへの参照を保持することは期待されず、他の目的でそれを使用することもないという明確な意味GetDataがあります。 同様に、参照を保持せずに情報を独自の内部データ構造にコピーします。このアプローチの利点の1つは、クライアントコードがループ内で多くのデータ項目を読み取る場合、ループの外側に1つのインスタンスを安全に作成し、毎回同じインスタンスを再利用できることです。同様に、新しいインスタンスを作成しなくても、キーに関連付けられたオブジェクトインスタンスを(再渡されたインスタンスからデータをコピーして)再利用できる場合があります。myDatamyCollectionStoreDatamyDatamyDatamyCollection


0

コンテキストによっては、エンティティと呼びます。私の退屈なビジネスアプリケーションでは、通常、 1対1で私のDERにマッピングされます。


0

私はそれを呼ぶでしょうSchema

これは、データベーステーブル、デシリアライズされたレコード、DTOなどの複数の用途をカバーします。

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