Âncora de barco.
Uma âncora de barco é código ou hardware mantido no sistema mesmo sem utilidade, o que confunde quem faz manutenção e deixa a compilação mais lenta.
Na engenharia de software, uma âncora de barco (em inglês, boat anchor) é um trecho de código — ou, mais raramente, um equipamento — que permanece em um sistema embora não tenha mais nenhuma utilidade. O nome é uma metáfora para algo obsoleto, inútil e desajeitado, cujo único uso produtivo seria ser jogado na água como poita de um barco. O termo foi aplicado primeiro a equipamentos de rádio e computadores antigos e pesados; termos como tijolo, trava-porta e peso de papel são similares.
Em software
O termo âncora de barco foi estendido para o código de software que é deixado na base de código de um sistema, normalmente para o caso de ser necessário mais tarde. Isso é um exemplo de antipadrão e, portanto, pode causar muitos problemas para quem tenta manter o programa que contém o código obsoleto. O problema principal vem do fato de que os programadores terão dificuldade em diferenciar entre código obsoleto, que não faz nada, e código funcional, que faz.
Por exemplo, um programador pode estar investigando um bug no sistema de tratamento de entrada do programa, então ele vasculha o código em busca de código que se conecta à API de tratamento de entrada. Obviamente, se o programador se deparar com código de tratamento de entrada obsoleto, ele pode muito bem começar a editá-lo e depurá-lo, desperdiçando um tempo valioso antes de perceber que o código com o qual está trabalhando nunca é executado e, portanto, não faz parte do problema que ele está tentando resolver. Outros problemas incluem tempos de compilação mais longos e o risco de os programadores acidentalmente conectarem código funcional ao código defunto, ressuscitando-o sem querer.
Uma solução recomendada para lidar com âncoras de barco no código-fonte é removê-las da base de código e colocá-las em um local separado, para que possam ser consultadas se necessário, mas não sejam compiladas nem confundidas com código "funcional". (Por exemplo, excluí-las, sabendo que estão armazenadas no controle de versão do projeto)
Exemplo
O envio por fax foi desativado há anos, mas o campo com o gateway e o método que o usava continuam na classe. Cada leitor precisa descobrir que sendByFax nunca é chamado, e a classe ainda carrega a dependência de LegacyFaxGateway.
class InvoiceService {
// o envio por fax foi desativado em 2019
private final LegacyFaxGateway faxGateway = new LegacyFaxGateway();
String send(Invoice invoice) {
return EmailSender.send(invoice);
}
// mantido "por via das dúvidas"; ninguém chama
String sendByFax(Invoice invoice) {
return faxGateway.transmit(invoice.toFaxPage());
}
}
O código sem uso é excluído em vez de comentado; se um dia voltar a ser necessário, pode ser recuperado do controle de versão (veja também Código Morto).
class InvoiceService {
String send(Invoice invoice) {
return EmailSender.send(invoice);
}
}
Adaptado do artigo da Wikipédia “Boat anchor (metaphor)” (revisão 1258854358), disponível sob a licença CC BY-SA 4.0; o texto foi traduzido e editado, e exemplos foram adicionados.