Estou trabalhando em um projeto de software em que precisamos criar três APIs. Um para o canal de home banking, um para o canal da agência e um terceiro para o canal móvel .
A API da agência é a mais completa, pois possui todas as funcionalidades. Depois, a API Home um pouco menor e a API móvel.
Os arquitetos aqui criaram uma camada comum (serviços EJB entre canais compartilhados por todas as APIs). Mas as APIs são diferentes.
Por enquanto, não há grande diferença entre as APIs. A grande equipe começou com o canal da agência e estamos adaptando-o agora para o canal doméstico. Estamos apenas enriquecendo objetos especificamente para nosso aplicativo doméstico. Caso contrário, o código é 95% semelhante entre APIs. As APIs são construídas sobre o Spring MVC e possuem (controladores, modelos e alguns utilitários).
Basicamente, os controladores estão fazendo o mapeamento do BO para o ChannelObject (parece-me que não é o lugar certo para fazer isso) e alguns utilitários e serializadores extras. Tudo está duplicado por enquanto. Eles estão dizendo que o motivo da duplicação é que desejam as APIs independentes. "Se amanhã quisermos um comportamento diferente em casa do que em agência ou celular, não teremos problemas !!"
Existe um caso em que devemos aceitar código duplicado?
Respostas:
Duplicação pode ser a coisa certa a se fazer, mas não por esse motivo.
Dizer "podemos querer que esses três lugares na base de código se comportem de maneira diferente, embora agora sejam idênticos" não é um bom motivo para duplicação em larga escala. Essa noção pode se aplicar a todos os sistemas e pode ser usada para justificar qualquer duplicação, o que obviamente não é razoável.
A duplicação deve ser tolerada apenas quando removê-la, no geral, seria mais cara agora por algum outro motivo (não se pode pensar em uma boa no momento, mas tenha certeza de que pode haver uma) - praticamente tudo na programação é uma troca e não um lei).
Para o que você está fazendo, a solução certa pode ser, por exemplo, extrair o comportamento duplicado agora para uma Estratégia ou algum outro padrão que modela o comportamento como classes e depois usa três instâncias da mesma classe. Dessa forma, quando você não quiser mudar o comportamento em um dos três lugares, você só tem que criar uma nova Estratégia e instanciar que em um só lugar. Dessa forma, você só precisa adicionar algumas classes e deixar o restante da base de código quase completamente intocado.
fonte
Sandi Metz, uma renomada engenheira de software e autora do ecossistema Ruby, tem um ótimo post e uma palestra em que também fala sobre a relação entre duplicação e abstração. Ela chega à seguinte conclusão
E eu concordo completamente com ela. Deixe-me dar mais contexto a esta citação. Às vezes, encontrar a abstração correta é muito difícil. Nesses casos, é tentador optar por qualquer abstração para reduzir a duplicação. Mais tarde, porém, você poderá descobrir que sua abstração não é válida para todos os casos. No entanto, é caro mudar tudo novamente e seguir um caminho diferente (para uma explicação muito melhor, observe-a falar!).
Então, sim, para mim, existem casos excepcionais em que aceitar a duplicação é a decisão certa, especialmente quando você não tem certeza do que está por vir e os requisitos provavelmente mudarão. Da sua postagem, entendo que há muita duplicação agora, mas seus colegas sugerem que isso pode mudar e não associar os aplicativos. Na minha opinião, este é um argumento válido e não pode ser desconsiderado em geral.
fonte
Se as pessoas começam a raciocinar sobre design com as palavras "se amanhã" , isso costuma ser um grande sinal de alerta para mim, especialmente quando o argumento é usado para justificar uma decisão que inclui trabalho e esforço extras, pelos quais ninguém realmente sabe se isso acontecerá. pagar, e que é mais difícil de mudar ou reverter do que a decisão oposta.
A duplicação de código reduz o esforço apenas por um curto período, mas aumentará os esforços de manutenção quase imediatamente, proporcional ao número de linhas de código duplicadas. Observe também que, uma vez que o código é duplicado, será difícil removê-lo quando for a decisão errada; enquanto, se não se duplicar o código agora, ainda é fácil introduzir a duplicação posteriormente, se ficar com o DRY. foi a decisão errada.
Disse que, em organizações maiores, às vezes é benéfico favorecer a independência de equipes diferentes em relação ao princípio DRY. Se remover a duplicação extraindo as partes comuns de 95% das APIs dois, um novo componente levará a um acoplamento de duas equipes independentes, mas talvez essa não seja a decisão mais sensata. Por outro lado, se você tiver recursos limitados e houver apenas uma equipe mantendo as duas APIs, tenho certeza de que será do seu interesse não criar um esforço duplo e evitar duplicação desnecessária de código.
Observe ainda que faz diferença se as APIs "Inicial" e "Agência" são usadas exclusivamente por aplicativos totalmente diferentes, ou se alguém pode tentar criar um componente construído sobre as APIs que também podem ser usadas no contexto "Inicial" como em um contexto de "Agência". Para essa situação, ter as partes comuns das APIs exatamente idênticas (o que você só pode garantir se as partes comuns não forem duplicadas) facilitará muito provavelmente o desenvolvimento desse componente.
Portanto, se houver sub-equipes realmente diferentes, cada uma responsável por cada uma das APIs, cada uma com uma agenda e recursos diferentes, é hora de duplicar o código, mas não "apenas por precaução".
fonte
Duplicação para evitar o acoplamento . Digamos que você tenha dois grandes sistemas e os force a usar a mesma biblioteca. Você pode estar acoplando o ciclo de liberação de ambos os sistemas. Isso pode não ser muito ruim, mas digamos que um sistema precise introduzir uma mudança. O outro precisa analisar a mudança e pode ser afetado. Às vezes, isso pode quebrar as coisas. Mesmo que ambas as partes sejam capazes de coordenar as mudanças, pode haver muitas reuniões, passando por gerentes, testes, dependências e o fim da pequena equipe autônoma.
Então você está pagando o preço do código duplicado para ganhar autonomia e independência.
fonte