Como você chama classes sem métodos?

10

Como você chama classes sem métodos?

Por exemplo,

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

Acima está uma classe sem nenhum método. Esse tipo de classe tem um nome especial?

user52343
fonte
11
Uma classe sem método?
precisa saber é o seguinte
11
O termo técnico é registro ou estrutura .
precisa saber é o seguinte
4
Um "saco de propriedades"
Martin York
Kilian: Prefiro "estrutura glorificada" para a conotação adicionada.
Jason

Respostas:

23

Na maioria das vezes: um anti-padrão.

Por quê? Porque facilita a programação processual com classes "Operador" e estruturas de dados. Você separa dados e comportamento, o que não é exatamente bom OOP.

Muitas vezes: um DTO (objeto de transferência de dados)

Leia apenas estruturas de dados destinadas a trocar dados, derivados de um objeto de negócios / domínio.

Às vezes: apenas estrutura de dados.

Bem, às vezes, você só precisa ter essas estruturas para armazenar dados simples e simples e sem operações. Mas então eu não usaria campos públicos, mas acessadores (getters e setters).

Falcão
fonte
4
Eu desencorajo todo mundo a fazer aulas apenas com getters / setters públicos em java, com morte cerebral e alguns contêineres nem executam o código setter / getter (olhando para o Glassfish ...), então é o padrão ou você tem um erro. Não acredito que o encapsulamento OOP esteja correto, na maioria das vezes, na maioria dos aplicativos, os DTOs não são apenas necessários, mas são as classes mais usadas. Portanto, eles são tudo menos antipadrão, eu usaria a palavra "blocos de construção básicos".
Aadaam 13/08/12
8
Eles são talvez um anti-padrão se você estiver em um ambiente estritamente OO. Para todo o resto do mundo da programação, ter estruturas de dados que são simples coleções heterogêneas de campos é um benefício claro sobre as alternativas, e até mesmo incentivado em uma base OO conhecida .
Telastyn
@Aadaam: Você não me entendeu direito. Um DTO não é um antipadrão. Às vezes, esses objetos são perfeitamente bons se forem DTOs! E quando o Glassfish não olha para getters e setters, isso significa apenas que o glassfish não é bem escrito (embora seja difícil em java sem acessadores embutidos). Este código não é um desastre, é uma clichê útil.
Falcon
4
Rápido, @Aadaam. Alguém está definindo um campo para um valor inválido, causando estragos quando é lido mais tarde. Lance uma exceção para detectar o culpado. A primeira vez que você precisar fazer algo assim em um campo público usado em 1.000 lugares, desejará um levantador. Os campos públicos têm seu lugar, mas o paradigma getter / setter é popular por um bom motivo.
Karl Bielefeldt
@KarlBielefeldt: em uma versão glassfish, tive uma única exceção em um código setter como teste (sem condições), que nunca foi executado. A propriedade possuía uma variável privada e dois getters-and-setters públicos. O contêiner simplesmente contornou o levantador. Se algo realmente tem um valor inválido, pessoalmente prefiro classes de tipos em vez de valores primitivos, mas talvez seja apenas eu.
Aadaam
9

Eu chamaria isso structou recordporque é usado para armazenamento de dados e isso é muito comum em linguagens como Cvocê pode ver lá: struct (linguagem de programação C) . Então, pessoalmente, eu preferiria usar structuma classe em vez de uma classe mais adequada e legível:

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

Geralmente eles são usados ​​como DTOs (Data Transfer Object), como os demais.

Omar
fonte
4
O problema com o struct é que "struct" é uma palavra-chave em vários idiomas. O C #, por exemplo, trata estruturas como tipos de valor que possuem semânticas diferentes. Isso também se aplica ao "registro" em alguns idiomas (PL / SQL).
Falcon
5

Eles são conhecidos como Objetos Antigos Simples (PO_Os), onde o espaço em branco é Java ou C ou CIL ou qualquer outro idioma que você esteja usando.

Se estiverem sendo usados ​​como blocos de dados simples para comunicação, eles poderão ser conhecidos como DTOs ( Data Transfer Objects ).

Se eles estão representando alguns dados fornecidos externamente, eles podem ser conhecidos como Entidades .

Telastyn
fonte
6
Você está pensando em PODs - uma ideia muito diferente. Os POJOs incluem explicitamente "lógica de negócios", mas excluem dependências em estruturas específicas.
Tom Hawtin - tackline
Os PODs podem ter métodos, pelo menos em C ++. Eles apenas precisam ter apenas construtores triviais, destruidores, construtores de cópia e construtores de atribuição, apenas membros de dados públicos, sem classes base e sem funções virtuais. Basicamente, eles apenas precisam ser compatíveis com estruturas C.
Dirk Holsopple
2

Eu chamaria essa classe de detentor de dados mutáveis ​​e, às vezes, usava um formulário genérico:

class DataHolder<T>
{
   public T dat;
}

Observe que o encapsulamento datem uma propriedade prejudicará o desempenho e não oferecerá nenhum benefício, pois não há nada que um acessador de propriedade possa fazer (exceto ler / gravar o campo) que não interrompa algumas implementações. Além disso, pode ser necessário usar Interlockedmétodos com dat(ou, se for uma estrutura, com seus campos), mas isso não seria possível se datestivesse envolvido em uma propriedade.

Observe que, embora os titulares de dados mutáveis ​​possam ser úteis para tipos (mutáveis ​​ou não) que precisam reter dados, eles não podem ser usados ​​com segurança para o intercâmbio de dados da mesma maneira que os tipos imutáveis. Por exemplo, uma declaração como:

myData = myCollection.GetData(myKey);

teria um significado claro se GetDataretornasse um tipo de classe imutável ou uma estrutura ("mutável" ou não) que não contivesse referências a dados mutáveis. Se ele retornasse um objeto de classe mutável, no entanto, não seria claro se alguma alteração nesse objeto seria consistentemente ignorada pela coleção subjacente, resultaria consistentemente em atualizações limpas ou causaria algum comportamento incômodo ou imprevisível que não encontraria nenhuma descrição.

Se alguém desejasse que uma coleção retornasse dados em um objeto mutável, o paradigma correto geralmente seria algo como:

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

Usando essa abordagem, há uma implicação clara que GetDatafará myDatacom que os dados da coleção sejam preenchidos, mas myCollectionnão seria esperado que ele mantivesse uma referência a ela assim que a função estivesse concluída, nem a utilizaria para qualquer outro propósito. StoreDatada mesma forma, copiava as informações myDatapara sua própria estrutura de dados interna sem manter uma referência. Observe que uma vantagem dessa abordagem é que, se o código do cliente estiver lendo muitos itens de dados em um loop, ele poderá criar com segurança uma instância myDatafora do loop e, em seguida, reutilizá-la sempre. Da mesma forma, myCollectionpode ser possível reutilizar a instância do objeto associada à chave (copiando dados da instância passada) sem precisar criar uma nova instância.

supercat
fonte
0

Dependendo do contexto, eu os chamo de Entidades. Nos meus aplicativos de negócios chatos, eles geralmente mapeiam 1: 1 para o meu DER.

Machado
fonte
0

Eu chamaria isso de Schema.

Isso abrange vários usos, como representar uma tabela de banco de dados, um registro desserializado ou um DTO, etc.

userSteve
fonte