您怎么称呼没有方法的类?


10

您怎么称呼没有方法的类?

例如,

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

上面是一个没有任何方法的类。这种类型的班级是否有特殊名称?


1
没有方法的课程?
ChaosPandion 2012年

11
技术术语是记录结构
Kilian Foth 2012年

4
一个“财产袋”
马丁·约克

Kilian:我更喜欢“华丽的结构”,以增加其含义。
杰森2012年

Answers:


23

大多数时候:反模式。

为什么?因为它有助于使用“ Operator”类和数据结构进行过程编程。您将数据和行为分开,这并不是完全好的OOP。

通常:DTO(数据传输对象)

只读数据结构,用于交换数据,该数据结构是从业务/域对象派生的。

有时:只是数据结构。

有时候,您只需要拥有那些结构即可保存简单明了且没有任何操作的数据。但是,那时我不会使用公共字段,而是使用访问器(获取器和设置器)。


4
我不鼓励每个人在Java中仅使用公共的getter / setter来上课,这很麻烦,有些容器甚至不会运行setter / getter的代码(看Glassfish ...),所以这是默认设置,或者您有一个错误。我不认为OOP封装是正确的,事实证明,在大多数情况下,在大多数应用程序中,不仅需要DTO,而且DTO是最常用的类。因此,它们不过是反模式而已,我会改用“基本构件”一词。
Aadaam

8
如果您在严格的OO环境中,它们可能是反模式。对于所有其他编程领域,拥有简单字段的异构集合的数据结构显然比其他方法有好处,甚至在一个众所周知的OO主体中也受到鼓励。
Telastyn 2012年

@Aadaam:你没让我正确。DTO不是反模式。有时,那些对象如果是DTO,就很好了!而且,当Glassfish不关注getter和setter时,这仅意味着glassfish编写得不好(尽管在Java中没有内置访问器很难)。这段代码不会死,是有用的样板。
猎鹰

4
快速,@ Aadaam。有人将字段设置为无效值,稍后读取时造成严重破坏。引发异常,以便您可以检测出罪魁祸首。第一次,对于在1000个地方使用的公共场所,您需要做这样的事情,您会希望有一个二传手。公共领域有自己的位置,但是有充分理由说明,getter / setter范例很受欢迎。
卡尔·比勒费尔特

@KarlBielefeldt:在一个glassfish版本中,我在setter代码中有一个异常作为测试(无条件),但从未执行。该物业有一个私人变量和两个公共获取者和设定者。容器只是绕过了塞特犬。如果某些东西实际上具有无效值,就我个人而言,我更喜欢类型类而不是原始值,但是也许就是我。
Aadaam

9

我会称其为它,struct或者record因为它用于数据存储,而这对于像C您在此处看到的语言来说是很常见的:struct(C编程语言)。因此,就我个人而言,我更喜欢使用a struct而不是更合适且更易读的类:

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

通常将它们用作DTO(数据传输对象),就像其他人所说的那样。


4
struct的问题在于,“ struct”是许多语言中的关键字。例如,C#将结构视为具有不同语义的值类型。对于某些语言(PL / SQL)中的“记录”也是如此。
猎鹰

5

这些被称为普通旧__对象(PO_O),其中空白是Java或C或CIL,或您使用的任何语言。

如果将它们用作简单的数据块进行通信,则可以将它们称为数据传输对象(DTO)。

如果它们表示某些外部提供的数据,则可以称为Entities


6
您正在考虑POD-一个非常不同的想法。POJO明确包含“业务逻辑”,但不包括对特定框架的依赖。
汤姆·哈汀

至少在C ++中,允许POD具有方法。它们只需要具有琐碎的构造函数,析构函数,副本构造函数和赋值构造函数,只有公共数据成员,没有基类,也没有虚函数。基本上,它们只需要与C结构兼容。
德克·霍尔索普

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会导致myData使用集合中的数据填充数据,但是myCollection一旦功能完成,就不会保留对其的引用,也不会将其用于任何其他目的。 StoreData同样会myData在不保留引用的情况下将信息复制到其自身的内部数据结构中。请注意,此方法的一个优点是,如果客户端代码将在循环中读取许多数据项,则它可以安全地myData在循环外部创建一个实例,然后每次重复使用同一实例。同样,myCollection可能能够重用与键关联的对象实例(从传入的实例复制数据),而无需创建新实例。


0

根据上下文,我称它们为实体。在我无聊的业务应用程序上,它们通常将1:1映射到我的DER。


0

我称它为Schema

这涵盖了多种用途,例如代表数据库表,反序列化记录或DTO等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.