Um amigo meu está trabalhando para uma pequena empresa em um projeto que todo desenvolvedor odiaria: ele é pressionado a liberar o mais rápido possível, ele é o único que parece se importar com dívidas técnicas, o cliente não tem formação técnica etc.
Ele me contou uma história que me fez pensar sobre a adequação dos padrões de design em projetos como este. Aqui está a história.
Tivemos que exibir produtos em locais diferentes no site. Por exemplo, os gerentes de conteúdo podem visualizar os produtos, mas também os usuários finais ou os parceiros por meio da API.
Às vezes, faltavam informações nos produtos: por exemplo, muitos deles não tinham preço quando o produto foi criado, mas o preço ainda não foi especificado. Alguns não tinham uma descrição (a descrição é um objeto complexo com históricos de modificação, conteúdo localizado etc.). Alguns estavam carecendo de informações sobre remessas.
Inspirado pelas minhas recentes leituras sobre padrões de design, achei que essa era uma excelente oportunidade para usar o padrão mágico de Objeto Nulo . Então eu fiz, e tudo estava liso e limpo. Bastava ligar
product.Price.ToString("c")
para exibir o preço ouproduct.Description.Current
mostrar a descrição; não é necessário material condicional. Até que, um dia, a parte interessada pediu para exibi-lo de maneira diferente na API, exibindonull
JSON. E também de maneira diferente para os gerenciadores de conteúdo, mostrando "Preço não especificado [Alterar]". E tive que matar meu amado padrão de Objeto Nulo, porque não havia mais necessidade dele.Da mesma forma, tive que remover algumas fábricas abstratas e alguns construtores, acabei substituindo meu belo padrão de fachada por chamadas diretas e feias, porque as interfaces subjacentes mudavam duas vezes por dia durante três meses, e até o Singleton me deixava quando os requisitos informavam que o objeto em questão tinha que ser diferente, dependendo do contexto.
Mais de três semanas de trabalho consistiram em adicionar padrões de design e depois separá-los um mês depois, e meu código finalmente se tornou espaguete suficiente para ser impossível de manter por qualquer pessoa, inclusive eu. Não seria melhor nunca usar esses padrões em primeiro lugar?
Na verdade, eu tive que trabalhar nesses tipos de projetos em que os requisitos estão mudando constantemente e são ditados por pessoas que realmente não têm em mente a coesão ou a coerência do produto. Nesse contexto, não importa o quão ágil você seja, você encontrará uma solução elegante para um problema e, quando finalmente o implementa, aprende que os requisitos mudaram tão drasticamente, que sua solução elegante não se encaixa não mais.
Qual seria a solução nesse caso?
Não está usando nenhum padrão de design, para de pensar e escreve código diretamente?
Seria interessante fazer uma experiência em que uma equipe está escrevendo código diretamente, enquanto outra está pensando duas vezes antes de digitar, correndo o risco de jogar fora o design original alguns dias depois: quem sabe, talvez as duas equipes tenham o mesma dívida técnica. Na ausência de tais dados, eu apenas afirmaria que não parece correto digitar código sem pensar antes ao trabalhar em um projeto de 20 meses por homem.
Mantenha o padrão de design que não faz mais sentido e tente adicionar mais padrões para a situação recém-criada?
Isso também não parece certo. Padrões são usados para simplificar o entendimento do código; coloque muitos padrões e o código se tornará uma bagunça.
Comece a pensar em um novo design que inclua os novos requisitos e refatorie lentamente o antigo para o novo?
Como um teórico e aquele que favorece o Agile, eu gosto muito dele. Na prática, quando você sabe que precisará voltar ao quadro branco toda semana e refazer grande parte do design anterior e que o cliente simplesmente não tem fundos suficientes para pagar por isso, nem tempo suficiente para esperar , isso provavelmente não vai funcionar.
Então, alguma sugestão?