Лодочный якорь.
Лодочный якорь — код или оборудование, которые оставляют в системе, хотя они больше не нужны; они сбивают с толку сопровождающих и замедляют сборку.
В программной инженерии лодочный якорь (англ. boat anchor) — это фрагмент кода, а реже оборудование, которое остаётся в системе, хотя больше не приносит никакой пользы. Название — метафора чего-то устаревшего, бесполезного и громоздкого, чьё единственное полезное применение — быть брошенным в воду в качестве якоря для лодки. Сначала так называли старое тяжёлое радио- и компьютерное оборудование; похожи по смыслу термины кирпич, дверной упор и пресс-папье.
В программном обеспечении
Термин лодочный якорь был расширен и на программный код, который оставляют в кодовой базе системы, обычно на случай, если он понадобится позже. Это пример антипаттерна, и поэтому он может создать множество проблем для тех, кто пытается сопровождать программу, содержащую устаревший код. Ключевая проблема в том, что программистам будет трудно отличить устаревший код, который ничего не делает, от рабочего кода, который работает.
Например, программист может разбираться с ошибкой в системе обработки ввода программы, поэтому он ищет в коде те фрагменты, которые связаны с API обработки ввода. Очевидно, что если программист наткнётся на устаревший код обработки ввода, он вполне может начать его править и отлаживать, тратя ценное время, прежде чем поймёт, что код, с которым он работает, никогда не выполняется и потому не является частью проблемы, которую он пытается решить. К другим проблемам относятся увеличенное время компиляции и риск того, что программисты случайно свяжут рабочий код с заброшенным, непреднамеренно его воскресив.
Рекомендуемое решение для работы с «лодочными якорями» в исходном коде — удалить их из кодовой базы и поместить в отдельное место, чтобы при необходимости к ним можно было обратиться, но они не компилировались и не принимались за «рабочий» код. (Например, удалить их, зная, что они хранятся в системе контроля версий проекта.)
Пример
Отправку факсов давно отключили, но поле со шлюзом и использовавший его метод по-прежнему остаются в классе. Каждому читателю приходится выяснять, что sendByFax нигде не вызывается, а класс всё так же тянет за собой зависимость от LegacyFaxGateway.
class InvoiceService {
// отправку факсов отключили в 2019 году
private final LegacyFaxGateway faxGateway = new LegacyFaxGateway();
String send(Invoice invoice) {
return EmailSender.send(invoice);
}
// оставлено «на всякий случай»; никто не вызывает
String sendByFax(Invoice invoice) {
return faxGateway.transmit(invoice.toFaxPage());
}
}
Неиспользуемый код удалён, а не закомментирован; если он когда-нибудь снова понадобится, его можно восстановить из системы контроля версий (см. также Мёртвый код).
class InvoiceService {
String send(Invoice invoice) {
return EmailSender.send(invoice);
}
}
Адаптировано по статье Википедии “Boat anchor (metaphor)” (версия 1258854358), распространяется по лицензии CC BY-SA 4.0; текст переведён и отредактирован, добавлены примеры.