Digamos que eu tenha uma classe Person
que tem as variáveis de instância age
, weight
e height
, e outra classe Fruit
que tem as variáveis de instância sugarContent
e texture
. A Person
classe não possui métodos, exceto setters e getters, enquanto a Fruit
classe possui setters e getters e métodos lógicos, como calculateSweetness
. A Fruit
classe é o tipo de classe que é a melhor prática que a Person
classe? O que quero dizer com isso é que a Person
classe parece que não tem muito objetivo; existe apenas para organizar dados, enquanto a Fruit
classe organiza dados e, na verdade, contém métodos para lógica.
8
Respostas:
Se sua pessoa não está realmente fazendo nada, não há necessidade de executar nenhuma ação. É possível ter classes que apenas coletam dados e, em seguida, haverá classes que operam com esses dados. No seu caso, pode ser possível que você não tenha nenhuma ação em uma única pessoa, mas pode haver ação em um grupo de pessoas, como CalculateAverageHeight (). Nesse caso, faz sentido ter apenas Pessoa sem ação e, em seguida, ter outra classe (pode ser amiga) que trabalha nisso.
fonte
CalculateAverageHeight()
ser um método estático noPerson
qual leva uma coleção dePerson
objetos. Dessa forma, mesmo queCalculateAverageHeight()
não seja aplicável a uma instância individualPerson
, você ainda a mantém próxima dos dados em que opera.É difícil adotar uma regra dizendo que todas as classes devem ter alguma lógica. Em geral, classes sem nenhuma lógica são consideradas AnemicDomainModel .
Mesmo assim, é melhor organizar os dados se as informações relacionadas estiverem aumentando. Por exemplo, neste caso, você ainda pode precisar de uma coleção de Pessoa do que muitas coleções não relacionadas.
fonte
O DataTransferObject é um bom exemplo de uma classe que não tem lógica, apenas dados. Esse é o seu propósito; é explicitamente uma exceção à regra geral que todas as classes implementem a lógica de negócios que afeta seu estado interno. Ter uma classe cujo estado interno é alterado pela lógica externa geralmente é um cheiro de design. Nem sempre está errado, mas quase sempre é algo que você deve considerar refatorar.
fonte
Inverta a questão, olhe para o outro lado. Se você tem uma coleção de informações que obviamente pertencem uma à outra, você deve mantê-las separadas apenas porque não existem métodos que você possa adicionar a essa classe? Você deve ser forçado a inventar métodos arbitrários apenas para justificar a classe?
fonte
Os modelos não têm fim para si mesmos - você deve adicionar funcionalidades a uma classe quando realmente precisar delas em seu programa, sem adivinhar que provavelmente precisará delas no futuro. Portanto, é natural que, em um determinado momento, você tenha classes sem métodos "reais" e, posteriormente, quando você determinar que faz sentido adicionar métodos à classe, faça exatamente isso. A qualidade de um modelo não é medida por "eu tenho métodos aqui e não existem métodos" - a qualidade é medida por "eu tenho todos os métodos que meu aplicativo realmente precisa lá".
Por exemplo, quando seu aplicativo na versão 1.0 precisar de algo como
calculateSweetness
aFruit
, mas não executar operações,Person
exceto obter e definir os atributos, seu modelo deverá refletir exatamente isso, não tendo nenhuma lógica na classePerson
. Na versão 2.0, pode fazer sentido adicionar alguma lógica a umPerson
também; portanto, quando você estiver nesse ponto, adicione os métodos em questão.fonte
Eu acho que isso depende do idioma e de como você está usando o idioma.
No caso trivial, algumas linguagens insistem em que tudo esteja em uma classe; portanto, por exemplo, coleções de constantes precisam entrar em uma classe que então pode ou não ter lógica, em outras linguagens elas podem acabar em um espaço para nome.
Em linguagens multiparadigmas, também pode depender de qual paradigma você deseja que seu design adira. Tomando emprestado o exemplo de CalculateAverageHeight (), como provavelmente deve residir em uma classe PersonCollection, no entanto, isso pressupõe uma solução OOP. em um design mais funcional, você pode usar uma função de ordem superior com uma coleção genérica, por exemplo, em C #
e a lógica não está no PersonCollection ou mesmo estaticamente no Person. De fato, funções de ordem superior e tipos de dados genéricos em geral significam que é mais provável que você acabe com objetos que são apenas pacotes de dados, pois a lógica está operando em um nível de abstração mais alto que o seu modelo de dados específico .
fonte
Parece que você está falando sobre um POD (dados antigos simples). Linguagens diferentes podem representá-las de diferentes maneiras - pode ser uma classe com membros públicos, por exemplo, ou uma estrutura com apenas membros públicos em C ++.
A organização de dados é uma razão perfeitamente válida para a existência de uma classe - geralmente pode tornar o código mais limpo e fácil de ler.
std::pair
no STL do C ++, é um bom exemplo de uma estrutura que existe apenas para organizar dados - simplesmente uma estrutura que contém dois valores de qualquer tipo chamadofirst
esecond
. Provavelmente uma das classes mais úteis em todo o STL (na minha opinião de qualquer maneira :))fonte