Farsa da programação Orientada a Objetos
Acredito que todos concordamos que a programação Orientada a Objetos torna nosso código mais le...
For further actions, you may consider blocking this person and/or reporting abuse
Eu passei por algumas fases no meio do processo de tentar entender programação orientada a objetos. Escrevi um post sobre isso. No começo a gente acha que está usando objetos de verdade e mal sabe a profundidade dos assuntos.
Excelente reflexão, Vinícius. Obrigado por compartilhar conhecimento ;- )
Curioso em ~ouvir~ ler você sobre: Se a classe
Pessoa
tivesse +40 atributos, você não acha que o__construct
ficaria longo demais?Opa, obrigado demais pelo feedback.
Existe uma "regra" no conceito de Object Calisthenics que diz que um método não deve possuir mais de 2 parâmetros.
Embora eu acredite ser um exagero, a sugestão de solução poderia ser aplicada a esse caso.
Muito provavelmente desses 40 atributos, vários deles seriam relacionados e passíveis de extração para uma nova classe.
Exemplo simples. Antes:
Depois:
Assim ganhamos ainda mais em coesão, tirando possíveis responsabilidades de validação desses atributos da classe
Pessoa
.Entendeu a ideia? O que acha?
Penso eu que quando uma classe chega a ter esse tando de atributos, ela foi mal pensanda; é uma classe que tem muitas responsabilidades.
Muito provavelmente, sim!
Uhmmm sim! Até aqui todos concordamos plenamente ;- ) Quando o assunto são classes de negócios, +40 atributos é algo altamente doloroso. É muita "gente" envolvida para a mesma classe. Exemplo:
EnvieEmailDeAniversario
. Quebra SRP completamente.O lance "desafiador" aqui é a ampla interpretação do problema... O que gostaria de saber é em relação a classes de "entidades"... Veja
Pessoa
,Corretor
,Jogador
,Cliente
. Obviamente, podemos extrair e distribuir os atributos em diferentes responsabilidades. No entanto, é possível que mesmo após uma boa distribuição de responsabilidades, e um cuidado imenso em quais responsabilidades cada classe deve ter, tenhamos classes com muitos atributos. Vamos dizer que de ~60 atributos requisitados consigamos enxugar para 25, em algumas outras entidades. Ainda sim temos um número considerável de atributos no__construct
. Essa foi a ideia inicial.O que acham? Gostaria de ouvir vocês.
Entendi seu ponto, mas continuaria sendo um caso de má abstração uma classe ter esse número de atributos.
Você consegue compartilhar um gist com um exemplo real pra poder analisar um ponto mais concreto?
:-D
Opa, tem como sim! Obrigado pela resposta.
Poderíamos ter uma discussão altamente filosófica por mais de 30 anos a fim de chegar a um senso comum se "um ou outro" atributo deveria de fato pertencer a classe
Pedido
ou não. No entanto, com o intuito de tornar o exemplo mais fácil de ser compreendido, poderíamos assumir que esses atributos tem minimamente alguma relação com a classePedido
?Eu listei rapidamente
24 atributos
que me vieram a mente. Por outro lado, eu acredito que uma grande empresa com 500/1.000/10.000 colaboradores, possuidora de um processo rico em detalhes e com abundantes regras de negócio poderia "facilmente" incrementar, pelo menos, uns 10 atributos na lista seguinte.Segue a lista: pastebin.com/raw/8G4HxsE1
Alguma sugestão de abstração? Como podemos diluir esses
24 atributos
em outras responsabilidades? Podemos chegar em 2-4 dependências?Muito obrigado por seu tempo e pela thread, Vinicius!!!!!
Eu que agradeço pela thread. Levanta pontos bem interessantes.
Então, concordo que todos os atributos possuem relação com a classe, mas isso não muda o fato de que ela pode estar mal abstraída. Eu preciso partir de algumas premissas pra poder pensar em algumas soluções... Só um expert de negócios poderia confirmar essas minhas premissas, mas vamos a alguns "chutes". hehehe
Data de criação e atualização são informações de persistência, não de domínio, logo não entram na entidade. São "atributos virutais", como alguns ORMs chamam.
Loja
muito provavelmente seria o Aggregate Root que tornaria o acesso aPedido
possível, logo seria redundante ter esse atributo emPedido
.Todos esses acima, se entendi corretamente o conceito do domínio, se enquadram em
DetalhesPedido
ou algo do tipo, mas pode ser mais discutido, claro. Posso ter entendido errado.Subtotal
etotal
são valores calculados baseando-se nos produtos. Uma estrutura deComposite
poderia ser aplicada até para ter "pedidos aninhados".Pedido
pode significar muita coisa dependendo do domínio. Às vezes pode ter umaCompra
que possui vários pedidos. Às vezes um cliente pode realizar apenas um pedido por data. Se esses forem os casos, oAggregate Root
muda, retirando alguns outros atributos da classe.Aí teriamos que entrar numa discussão bem mais aprofundada sobre o caso.
Mas ainda assim, se existe uma classe com antos atributos, chances são grandes de nem todos serem obrigatórios. Aí, a criação fica completa, o que normalmente pede uma espécie de
Creation Method
(que o DDD chama de Factory),Builder
ou algo do tipo.:-D
Insights massa, top!!! 👍👍👍👍👍👍👍
Obrigado pela discussão. Realmente me fez refletir aqui sobre algumas decisões que tomamos corriqueiramente.