Este artigo afirma que uma classe de dados é um "cheiro de código". O motivo:
É normal quando uma classe recém-criada contém apenas alguns campos públicos (e talvez até um punhado de getters / setters). Mas o verdadeiro poder dos objetos é que eles podem conter tipos de comportamento ou operações em seus dados.
Por que é errado um objeto conter apenas dados? Se a principal responsabilidade da classe é representar dados, não adicionaria métodos que operam com os dados violem o Princípio de Responsabilidade Única ?
Respostas:
Não há absolutamente nada de errado em ter objetos de dados puros. O autor da peça, francamente, não sabe do que está falando.
Esse pensamento decorre de uma idéia antiga e falida de que "verdadeiro OO" é a melhor maneira de programar e que "verdadeiro OO" tem tudo a ver com "modelos de dados ricos", onde se misturam dados e funcionalidade.
A realidade nos mostrou que, na verdade, o oposto é verdadeiro, especialmente neste mundo de soluções multithread. Funções puras, combinadas com objetos de dados imutáveis, são uma maneira comprovadamente melhor de codificar.
fonte
Não há absolutamente nada de errado em ter objetos de dados puros. O autor tem uma opinião não compartilhada pelos desenvolvedores de software que conheço.
Especialmente para mapeamento de banco de dados, em geral, você tem classes de entidade que contêm apenas os campos armazenados na base de dados e nos getters e setters. Wikipedia Hibernate (estrutura)
A idéia básica dos Java beans usados por muitas ferramentas / estruturas é baseada em classes de dados chamadas beans que contêm apenas campos e os getters e setters relacionados. Wikipediadia JavaBeans
Fazit:
Se alguém afirma que algo é 'ruim' ou 'um cheiro de código', você deve sempre procurar os motivos apresentados. Se os motivos não o convencerem, pergunte a alguém por outros motivos ou uma opinião diferente. (Como você fez neste fórum)
fonte
Um bom argumento por Martin Fowler:
"O Tell-Don't-Ask é um princípio que ajuda as pessoas a lembrar que a orientação a objetos trata de agrupar dados com as funções que operam nesses dados. Isso nos lembra que, em vez de solicitar dados a um objeto e agir sobre esses dados, em vez disso, deve dizer a um objeto o que fazer. Isso incentiva a mudar o comportamento para um objeto para acompanhar os dados ".
https://martinfowler.com/bliki/TellDontAsk.html
fonte
baz
como parâmetro para um método estático, mas para fazer isso, primeiro você precisa pedir ao objeto. Talvez em um paradigma de programação em que os métodos sejam primários (como, por exemplo, a programação funcional), isso faça sentido, mas em um ambiente OO, absolutamente não, porque os objetos são primários e devem conter os dados e as funções para agir sobre ele. Sua afirmação de que a remoção do método do objeto aumentou o encapsulamento também é exatamente ao contrário , pelo que sei, porque significa que agora vocêbaz
aparece fora do objeto.O que você precisa entender é que existem dois tipos de objetos:
Objetos que possuem comportamento . Eles devem abster-se de dar acesso público à maioria / a qualquer um de seus membros de dados. Espero apenas muito poucos métodos de acesso definidos para esses.
Um exemplo seria uma regex compilada: O objeto é criado para fornecer um determinado comportamento (para corresponder uma cadeia de caracteres a uma regex específica e relatar as correspondências (parciais)), mas como a regex compilada faz seu trabalho não é do usuário. o negócio.
A maioria das aulas que escrevo estão nessa categoria.
Objetos que são realmente apenas dados . Eles devem apenas declarar todos os seus membros públicos (ou fornecer o conjunto completo de acessadores para eles).
Um exemplo seria uma classe
Point2D
. Não existe absolutamente invariável que precise ser garantido para os membros dessa classe, e os usuários devem poder acessar os dados apenas viamyPoint.x
emyPoint.y
.Pessoalmente, não uso muito essas classes, mas acho que não escrevi um pedaço maior de código que não use essa classe em algum lugar.
Tornar-se proficiente na orientação a objetos inclui perceber que essa distinção existe e aprender a classificar a função de uma classe em uma dessas duas categorias.
Se você codificar em C ++, poderá explicitar essa distinção usando
class
a primeira categoria de objetos estruct
a segunda. Obviamente, os dois são equivalentes, exceto que issoclass
significa que todos os membros são privados por padrão, enquantostruct
declara todos os membros públicos por padrão. Qual é exatamente o tipo de informação que você deseja comunicar.fonte