Ancre de bateau.
Une ancre de bateau est du code ou du matériel conservé dans un système alors qu'il ne sert plus, ce qui égare les mainteneurs et ralentit la compilation.
En génie logiciel, une ancre de bateau (en anglais boat anchor) désigne un morceau de code — ou, plus rarement, un matériel — conservé dans un système alors qu'il ne sert plus à rien. Le nom est une métaphore de quelque chose d'obsolète, d'inutile et d'encombrant, dont le seul usage productif serait d'être jeté à l'eau comme corps-mort pour un bateau. Le terme a d'abord désigné de vieux équipements radio et informatiques lourds ; des termes comme brique, butoir de porte et presse-papiers sont similaires.
Dans le logiciel
Le terme ancre de bateau a été étendu au code logiciel laissé dans la base de code d’un système, généralement au cas où il serait nécessaire plus tard. C’est un exemple d’anti-patron et cela peut donc causer de nombreux problèmes aux personnes qui tentent de maintenir le programme contenant le code obsolète. Le problème majeur vient du fait que les programmeurs auront du mal à distinguer le code obsolète, qui ne fait rien, du code fonctionnel, qui fait quelque chose.
Par exemple, un programmeur peut enquêter sur un bogue dans le système de gestion des entrées du programme ; il parcourt donc le code à la recherche de code relié à l’API de gestion des entrées. Évidemment, si le programmeur tombe sur du code obsolète de gestion des entrées, il risque fort de se mettre à le modifier et à le déboguer, perdant un temps précieux avant de se rendre compte que le code sur lequel il travaille n’est jamais exécuté et ne fait donc pas partie du problème qu’il essaie de résoudre. Parmi les autres problèmes figurent l’allongement des temps de compilation et le risque que les programmeurs relient accidentellement du code fonctionnel au code défunt, le ressuscitant par inadvertance.
Une solution recommandée pour traiter les ancres de bateau dans le code source consiste à les retirer de la base de code et à les placer dans un emplacement distinct, de sorte qu’on puisse s’y référer si nécessaire, mais qu’elles ne soient ni compilées ni prises pour du code « fonctionnel ». (Par exemple, les supprimer en sachant qu’elles sont conservées dans la gestion de versions du projet)
Exemple
L'envoi par fax a été désactivé il y a des années, mais le champ contenant la passerelle et la méthode qui l'utilisait sont toujours dans la classe. Chaque lecteur doit découvrir que sendByFax n'est jamais appelée, et la classe traîne encore une dépendance vers LegacyFaxGateway.
class InvoiceService {
// l'envoi par fax a été désactivé en 2019
private final LegacyFaxGateway faxGateway = new LegacyFaxGateway();
String send(Invoice invoice) {
return EmailSender.send(invoice);
}
// gardé « au cas où » ; personne ne l'appelle
String sendByFax(Invoice invoice) {
return faxGateway.transmit(invoice.toFaxPage());
}
}
Le code inutilisé est supprimé plutôt que commenté ; s'il redevient un jour nécessaire, on peut le récupérer dans le gestionnaire de versions (voir aussi Code mort).
class InvoiceService {
String send(Invoice invoice) {
return EmailSender.send(invoice);
}
}
Adapté de l’article Wikipédia “Boat anchor (metaphor)” (révision 1258854358), disponible sous licence CC BY-SA 4.0 ; le texte a été traduit et modifié, et des exemples ont été ajoutés.