Логотип ConstructiCat
CodeBust.
Навигация по разделу ▾

Лодочный якорь.

Лодочный якорь — код или оборудование, которые оставляют в системе, хотя они больше не нужны; они сбивают с толку сопровождающих и замедляют сборку.

В программной инженерии лодочный якорь (англ. 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; текст переведён и отредактирован, добавлены примеры.