Onde, em um sistema orientado a objetos, você deve escolher estruturas (estilo C) em vez de classes?

9

C e provavelmente muitas outras linguagens fornecem uma structpalavra - chave para criar estruturas (ou algo semelhante). Estes são (pelo menos em C), de um ponto de vista simplificado, como classes, mas sem polimorfismo, herança, métodos e assim por diante.

Pense em uma linguagem orientada a objetos (ou com vários paradigmas) com estruturas no estilo C. Onde você os escolheria em relação às aulas? Agora, não acredito que eles devam ser usados ​​com OOP, pois as classes parecem substituir seus propósitos, mas me pergunto se há situações em que elas poderiam ser preferidas às classes em programas orientados a objetos e em que tipo de situações. Existem tais situações?

Anto
fonte
Qual idioma você está usando? O que você está publicando? A maioria das linguagens OO modernas, exceto Java, suporta propriedades de uma maneira ou de outra.
Kevin Cline

Respostas:

16

Há uma distinção que eu já vi em alguns livros entre objetos portadores de estado e objetos que fornecem funcionalidade. Os termos exatos diferem de fonte para fonte. Mas de um modo geral, os primeiros se distinguem por ter um monte de campos e um monte de pares simples de getters-setters (e talvez um construtor).

Isso é particularmente comum em Java, para classes explicitamente marcadas como "serializáveis".

Eu argumentaria que esse tipo de classe faz mais sentido como estruturas, se você sentir que não há necessidade de ocultar diretamente os membros (por exemplo, no caso de tipos aninhados).

Uri
fonte
11
Robert C Martin os chama de "objetos de transferência de dados" no Código Limpo .
user16764
5

Em C, não há classes, assim structé o caminho para agrupar dados. Em C ++, structé o mesmo que classexceto que o acesso à herança e aos membros é publicpor padrão e não private. C # também tem uma espécie de struct, mas não sei C # suficiente para comentar. O Common Lisp tem a defstructforma, que funciona da maneira mais semelhante a Cs struct, considerando a diferença de idioma, e é diferente de uma classe Common Lisp Object System.

Há, no entanto, uma diferença conceitual entre um pacote de dados relacionado e uma classe real, e em C ++ structé freqüentemente usado para um pacote de dados, enquanto classé usado para objetos que deveriam ter seu próprio comportamento. Como diretriz, eu diria que a classrepresenta algo sobre o qual você pode dizer algo útil, como uma classe invariável, enquanto a structseria mais vagamente acoplada a valores de dados que não dependem muito dos outros.

David Thornley
fonte
6
A diferença entre a structe a classé mais significativa em C # - o principal é que a structé um tipo de valor e a classé um tipo de referência. A Microsoft recomenda não usar a structse o conteúdo for maior que 16 bytes ou mais.
precisa saber é o seguinte
0

Em um nível muito básico, qual é a diferença entre uma estrutura e uma classe de dados pura (uma que não possui funcionalidade além dos acessadores de propriedade)?

Nada além da pegada de memória realmente.

Biziclop
fonte
0

A resposta aceita é boa. Eu gostaria de adicionar ...

Às vezes, é melhor colocar um método dentro de uma classe. Outras vezes, é melhor ter uma função externa onde a estrutura / classe é passada como parâmetro (mesmo se você estiver usando o estilo OOP).

exemplo de quando colocar um método dentro da classe: Rectangle.CaclulateArea ()

exemplo de quando colocar uma função fora da classe: Canvas.Draw (Rectangle rect)

você poderia colocar Draw () dentro do retângulo e funcionaria. Mas o desenho é uma operação dependente da camada. Você não desenharia no lado do servidor, mas no lado do cliente. Draw () não faria sentido sequer existir no servidor. No entanto, "CalculateArea ()" é independente da camada e é um atributo verdadeiro do retângulo, portanto, é melhor incluí-lo como método de membro.

mike30
fonte
0

Para mim, a grande diferença é se existe uma classe invariável ou não.

Ou, em outras palavras: sou livre para alterar qualquer campo para qualquer valor a qualquer momento? Se sim, é uma estrutura; Caso contrário, é uma aula.

O exemplo usual de uma estrutura é um ponto 2D, com apenas um membro X e Y, que pode ter qualquer valor e é totalmente independente um do outro. O acesso público é aceitável.

Um exemplo de classe é a combinação de um ponteiro para uma matriz de caracteres e um campo de comprimento: o comprimento depende do valor do ponteiro e, portanto, não deve ser uma estrutura. Os campos devem ser privados e o acesso deve passar por setters e getters para garantir a classe invariável.

Sjoerd
fonte
0

1) Rede structs: estruturas que são transmitidas através do fio.

De maneira mais geral e formal, qualquer classe que você precise ser POD, trivial, layout padrão ou um conceito relacionado. Para uma excelente discussão desses conceitos, com exemplos, consulte esta resposta (é para C ++ 11).

2) Functors (predicados em particular), que você passaria para funções como std::remove_if. Em outras palavras, classes semelhantes / herdadas std::binary_functionou similares.

3) Conceitos de metaprogramação, que podem conter apenas constexprs públicos e / ou typedefs.

Editar: Nota: Esta resposta se aplica a classes C ++ e estruturas.

haelix
fonte