Darei a você nossa experiência na refatoração do LedgerSMB. Decidimos fazer as coisas de maneira diferente desde o início e ainda estamos fazendo exatamente o que você descreve, mas sem muitos métodos de colagem (temos alguns métodos de colagem, mas não muito).
Vida com duas bases de código
O LedgerSMB sobreviveu com duas bases de código por cerca de 5 anos e serão várias mais antes que a antiga base de código seja eliminada. A antiga base de código é um verdadeiro horror de se ver. Com design ruim de banco de dados, o Perl constrói como IS->some_func(\%$some_object);
junto com o código que mostra exatamente por que a metáfora do espaguete às vezes é usada (caminhos de execução que vagam entre os módulos e as costas e entre os idiomas, sem rima ou razão). A nova base de código evita isso, movendo consultas db para procedimentos armazenados, tendo uma estrutura mais limpa para manipulação de solicitações e muito mais.
A primeira coisa que decidimos fazer foi tentar refatorar módulo por módulo. Isso significa mover todas as funcionalidades em uma área específica para um novo módulo e conectar o código antigo ao novo módulo. Se a nova API estiver limpa, isso não é grande coisa. Se a nova API não estiver complicada, é um convite para trabalhar um pouco mais com a nova API ...
A segunda coisa é que há muitas vezes em que o novo código precisa acessar a lógica no código antigo. Isso deve ser evitado na medida do possível, pois leva a métodos de cola feios, mas nem sempre é possível evitá-lo. Nesse caso, os métodos de cola devem ser minimizados e evitados na medida do possível, mas utilizados quando necessário.
Para fazer isso funcionar, você precisa se comprometer a reescrever todas as funcionalidades em uma área específica. Se você pode, por exemplo, reescrever todos os códigos de rastreamento de informações do cliente de uma só vez, isso significa que não é difícil trabalhar com o código que chama isso do código antigo e o envio para o código antigo a partir do novo código é minimizado.
A segunda coisa é que, se você tiver abstrações razoáveis, poderá escolher qual nível da API chamar e como mantê-la limpa. No entanto, você deve reescrever as partes que estão chamando sua API para que elas também sejam um pouco mais limpas.
Existem muitas áreas de ferramentas de negócios que são irredutivelmente complexas. Você não pode se livrar de toda complexidade. Mas você pode gerenciá-lo concentrando-se em APIs limpas, que fazem especificamente o que você precisa fazer, e em módulos que utilizam essa API construtivamente. A cola deve ser o último recurso somente depois de considerar que a reescrita do restante do código de chamada pode ser mais rápida.