¿Cómo llamas a las clases sin métodos?

10

¿Cómo llamas a las clases sin métodos?

Por ejemplo,

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

Arriba hay una clase sin ningún método. ¿Este tipo de clase tiene un nombre especial?

usuario52343
fuente
1
¿Una clase sin método?
ChaosPandion
11
El término técnico es registro o estructura .
Kilian Foth
44
Una "bolsa de propiedades"
Martin York
Kilian: Prefiero "estructura glorificada" por la connotación añadida.
Jason

Respuestas:

23

La mayoría de las veces: un anti patrón.

¿Por qué? Porque facilita la programación de procedimientos con clases "Operador" y estructuras de datos. Separa datos y comportamientos que no son exactamente buenos OOP.

Muchas veces: un DTO (objeto de transferencia de datos)

Estructuras de datos de solo lectura destinadas a intercambiar datos, derivados de un objeto de negocio / dominio.

A veces: solo estructura de datos.

Bueno, a veces, solo tienes que tener esas estructuras para contener datos que sean simples y simples y que no tengan operaciones. Pero entonces no usaría campos públicos sino accesores (captadores y establecedores).

Halcón
fuente
44
Desanimo a todos a hacer clases con solo captadores / setters públicos en Java, es una muerte cerebral y algunos contenedores ni siquiera ejecutarán el código setter / getter (mirando Glassfish ...), por lo que es el valor predeterminado o tienes un error. No creo que la encapsulación OOP fuera correcta, resulta que, la mayoría de las veces, en la mayoría de las aplicaciones, los DTO no solo son necesarios, sino que son las clases más utilizadas. Así que son cualquier cosa menos antipatrones, en su lugar usaría la palabra "bloques de construcción básicos".
Aadaam
8
Son tal vez un anti-patrón si se encuentra en un entorno estrictamente OO. Para todo el resto del mundo de la programación, tener estructuras de datos que son simples colecciones heterogéneas de campos es un claro beneficio sobre las alternativas, e incluso se fomenta en un pilar OO conocido .
Telastyn el
@Aadaam: No me entendiste bien. Un DTO no es un antipatrón. ¡A veces esos objetos están perfectamente bien si son DTO! Y cuando Glassfish no mira a los captadores y setters, eso solo significa que el glassfish no está bien escrito (aunque es difícil en Java sin accesores incorporados). Este código no está muerto, es útil.
Halcón
44
Rápido, @Aadaam. Alguien está configurando un campo a un valor no válido, causando estragos cuando se lee más tarde. Lanza una excepción para que puedas detectar al culpable. La primera vez que tenga que hacer algo así para un campo público utilizado en 1,000 lugares, deseará un setter. Los campos públicos tienen su lugar, pero el paradigma getter / setter es popular por una buena razón.
Karl Bielefeldt
@KarlBielefeldt: en una versión de glassfish, tuve una única excepción en un código setter como prueba (sin condiciones), que nunca se ejecutó. La propiedad tenía una variable privada y dos captadores y establecedores públicos. El contenedor simplemente evitó al colocador. Si algo realmente tiene un valor no válido, personalmente prefiero las clases de tipos en lugar de los valores primitivos, pero tal vez solo soy yo.
Aadaam
9

Lo llamaría structo recordporque se usa para el almacenamiento de datos y esto es muy común en lenguajes Ccomo se puede ver allí: struct (lenguaje de programación C) . Así que personalmente preferiría usar structuna clase en lugar de una que sea más adecuada y legible:

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

Por lo general, se usan como DTO (objeto de transferencia de datos) como se dijo en los demás.

Omar
fuente
44
El problema con struct es que "struct" es una palabra clave en muchos idiomas. C #, por ejemplo, trata las estructuras como tipos de valor que tienen una semántica diferente. Esto también es cierto para "registro" en algunos idiomas (PL / SQL).
Falcon
5

Estos se conocen como Objetos __ simples (PO_Os) donde el espacio en blanco es Java o C o CIL, o cualquier lenguaje que esté utilizando.

Si se están utilizando como simples bloques de datos para la comunicación, entonces pueden conocerse como Objetos de transferencia de datos (DTO).

Si representan algunos datos proporcionados externamente, pueden conocerse como Entidades .

Telastyn
fuente
66
Estás pensando en los POD, una idea muy diferente. Los POJO incluyen explícitamente "lógica de negocios", pero excluyen las dependencias de marcos particulares.
Tom Hawtin - tackline
Los POD pueden tener métodos, al menos en C ++. Solo tienen que tener constructores triviales, destructores, constructores de copias y constructores de asignación, solo miembros de datos públicos, sin clases base y sin funciones virtuales. Básicamente, solo tienen que ser compatibles con las estructuras C.
Dirk Holsopple
2

Llamaría a esa clase un titular de datos mutable, y a veces he usado un formulario genérico:

class DataHolder<T>
{
   public T dat;
}

Tenga en cuenta que el ajuste datdentro de una propiedad degradará el rendimiento y no ofrecerá ningún beneficio, ya que no hay nada que pueda hacer un descriptor de acceso a la propiedad (aparte de leer / escribir el campo) que no rompa algunas implementaciones. Además, puede ser necesario usar Interlockedmétodos con dat(o, si se trata de una estructura, con campos de los mismos), pero eso no sería posible si datestuviese envuelto en una propiedad.

Tenga en cuenta que si bien los titulares de datos mutables pueden ser útiles para los tipos (mutables o no) que necesitan contener datos, no se pueden usar de forma segura para el intercambio de datos de la misma manera que lo harían los tipos inmutables. Por ejemplo, una declaración como:

myData = myCollection.GetData(myKey);

tendría un significado claro si se GetDatadevuelve un tipo de clase inmutable o una estructura ("mutable" o no) que no contiene referencias a datos mutables. Sin embargo, si devuelve un objeto de clase mutable, no estaría claro si la colección subyacente ignoraría consistentemente cualquier cambio en ese objeto, si daría como resultado actualizaciones limpias o si causaría algún comportamiento molesto o impredecible que no cumpla con ninguna descripción.

Si se desea que una colección devuelva datos en un objeto mutable, el paradigma correcto a menudo sería algo como:

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

Usando ese enfoque, existe una clara implicación que GetDatahará myDataque se llenen de datos de la colección, pero myCollectionno se esperaría que mantuviera una referencia a ella una vez que se completara la función, ni la usaría para ningún otro propósito. StoreDataasimismo, copiaría información myDataa su propia estructura interna de datos sin mantener una referencia. Tenga en cuenta que una ventaja de este enfoque es que si el código del cliente leerá muchos elementos de datos dentro de un ciclo, puede crear de manera segura una instancia myDatafuera del ciclo y luego reutilizar esa misma instancia cada vez. Del mismo modo, myCollectionpuede reutilizar la instancia de objeto asociada con la clave (copiando datos de la instancia transferida) sin tener que crear una nueva instancia.

Super gato
fuente
0

Dependiendo del contexto, los llamo entidades. En mis aplicaciones comerciales aburridas, generalmente asignan 1: 1 a mi DER.

Machado
fuente
0

Yo lo llamaría a Schema.

Esto cubre múltiples usos, como la representación de una tabla de base de datos, o un registro deserializado, o un DTO, etc.

userSteve
fuente