Há um arquivo de origem em um projeto bastante grande, com várias funções extremamente sensíveis ao desempenho (chamadas milhões de vezes por segundo). De fato, o mantenedor anterior decidiu escrever 12 cópias de uma função, cada uma com uma diferença muito pequena, para economizar o tempo que seria gasto verificando as condicionais em uma única função.
Infelizmente, isso significa que o código é uma PITA para manter. Gostaria de remover todo o código duplicado e escrever apenas um modelo. No entanto, a linguagem Java não oferece suporte a modelos e não tenho certeza de que os genéricos sejam adequados para isso.
Meu plano atual é escrever um arquivo que gere as 12 cópias da função (um expansor de modelo de uso único, praticamente). É claro que eu forneceria uma explicação abundante sobre por que o arquivo deve ser gerado programaticamente.
Minha preocupação é que isso levaria à confusão de futuros mantenedores e talvez introduza erros desagradáveis se eles esquecerem de regenerar o arquivo após modificá-lo ou (ainda pior) se eles modificarem o arquivo gerado por programação. Infelizmente, além de reescrever tudo no C ++, não vejo como corrigir isso.
Os benefícios dessa abordagem superam as desvantagens? Em vez disso, devo:
- Aceite o desempenho e use uma função única e sustentável.
- Adicione explicações sobre por que a função deve ser duplicada 12 vezes e aceite a carga de manutenção.
- Tente usar os genéricos como modelos (eles provavelmente não funcionam dessa maneira).
- Grite com o antigo mantenedor por tornar o código tão dependente do desempenho em uma única função.
- Outro método para manter o desempenho e a capacidade de manutenção?
PS Devido ao mau design do projeto, a criação de perfil da função é bastante complicada ... no entanto, o ex-mantenedor me convenceu de que o desempenho atingido é inaceitável. Suponho que ele queira dizer mais de 5%, embora isso seja um palpite completo da minha parte.
Talvez eu deva elaborar um pouco. As 12 cópias fazem uma tarefa muito semelhante, mas têm pequenas diferenças. As diferenças estão em vários lugares em toda a função, então, infelizmente, existem muitas, muitas, instruções condicionais. Existem efetivamente 6 "modos" de operação e 2 "paradigmas" de operação (palavras compostas por mim). Para usar a função, especifica-se o "modo" e o "paradigma" da operação. Isso nunca é dinâmico; cada pedaço de código usa exatamente um modo e paradigma. Todos os 12 pares de paradigmas de modo são usados em algum lugar do aplicativo. As funções são nomeadas apropriadamente func1 a func12, com números pares representando o segundo paradigma e números ímpares representando o primeiro paradigma.
Estou ciente de que esse é o pior design de todos os tempos, se a manutenção for o objetivo. Mas parece ser "rápido o suficiente" e esse código não precisa de alterações há um tempo ... Também vale a pena notar que a função original não foi excluída (embora seja um código morto, tanto quanto eu posso dizer) , portanto, a refatoração seria simples.
Makefile
" (ou de qualquer sistema que você use) e remova-o logo após a compilação terminar . Dessa forma, eles simplesmente não têm a chance de modificar o arquivo de origem errado.