Eu e um grupo de amigos estamos trabalhando em um projeto há algum tempo, e queríamos inventar uma maneira agradável de OOP de representar um cenário específico para o nosso produto. Basicamente, estamos trabalhando em um jogo de balas no estilo Touhou , e queríamos criar um sistema em que pudéssemos representar facilmente qualquer comportamento possível da bala que poderíamos imaginar.
Então foi exatamente isso que fizemos; fizemos uma arquitetura realmente elegante que nos permitiu separar o comportamento de um marcador em diferentes componentes que poderiam ser anexados a instâncias de marcador à vontade, como o sistema de componentes do Unity . Funcionou bem, era facilmente extensível, era flexível e cobria todas as nossas bases, mas havia um pequeno problema.
Nossa aplicação também envolve uma grande quantidade de geração processual, ou seja, geramos processualmente os comportamentos das balas. Por que isso é um problema? Bem, nossa solução OOP para representar o comportamento de uma bala, embora elegante, é um pouco complicada de se trabalhar sem um ser humano. Os seres humanos são inteligentes o suficiente para pensar em soluções para problemas que são lógicos e inteligentes. Os algoritmos de geração de procedimentos ainda não são inteligentes, e achamos difícil implementar uma IA que use nossa arquitetura OOP em todo o seu potencial. É certo que essa é uma falha da arquitetura: ela não é intuitiva em todas as situações.
Portanto, para solucionar esse problema, basicamente incluímos todos os comportamentos oferecidos por diferentes componentes na classe bullet, para que tudo o que possamos imaginar seja oferecido diretamente em cada instância do marcador, em oposição a outras instâncias do componente associadas. Isso torna um pouco mais fácil trabalhar com nossos algoritmos de geração de procedimentos, mas agora nossa classe bullet é um grande objeto divino . É facilmente a maior classe do programa até agora, com mais de cinco vezes mais código do que qualquer outra coisa. É um pouco difícil de manter também.
Tudo bem que uma de nossas classes se transformou em um objeto divino, apenas para facilitar o trabalho com outro problema? Em geral, não há problema em sentir o cheiro do código no código, se ele admitir uma solução mais fácil para um problema diferente?