Когда не рекомендуется и когда нужно удалить в Java

11

Как часть процесса рефакторинга или просто продолжающейся разработки, конкретный метод или, может быть, целый класс может в некотором смысле устареть. Java поддерживает @Deprecatedаннотацию, чтобы указать, что, вероятно, есть лучший способ справиться с рассматриваемой функциональностью. Я полагаю, что это особенно полезно в общедоступных API, где последствия удаления частей API могут быть неизвестны. Для непубличного API и проекта, который использует системы контроля версий (таким образом, удаление может быть отменено в некотором смысле), когда целесообразно не использовать устаревший элемент (ы), а удалить?

Майкл МакГоуэн
источник

Ответы:

18

Является ли ваш API общедоступным API? Это диктует, следует ли вам осудить или удалить. Если API предназначен исключительно для вашей выгоды (т. Е. Используется только в вашей компании), то лучше всего просто удалить нарушающий код. Это намного чище и вызовет меньше головных болей обслуживания в долгосрочной перспективе.

Однако, если API общедоступен, простое удаление метода может привести к тому, что код, который работал с более старыми версиями вашей библиотеки, перестал работать. Вот где все становится грязно. Ниже приведены некоторые рекомендации:

  • Внутренний API: удаляйте, а не осуждайте. Если какой-либо клиент использует внутренний класс или метод, он ошибается, если инструмент ломается.
  • Внешний API: сначала устареть, потом удалить. Устаревание - это признак того, что что-то будет удалено позже. Позже зависит от того, что вы считаете разумным. По крайней мере, дайте 2-3 версии, прежде чем фактически удалить устаревший код.
Берин Лорич
источник
6

Вероятно, хорошей идеей будет создать напоминание, когда вы @deprecate класса или метода. Вы делаете это, чтобы способствовать его устареванию. Так что догадайтесь, сколько времени потребуется, в свободное время, как задача, которую вы получаете, чтобы устранить все ссылки. Отметьте его как @deprecated и поместите напоминание в свой календарь. Когда вы получите напоминание, проверьте. Если он больше не используется, удалите его. Если осталось несколько ссылок, которые можно быстро обновить, сделайте это и удалите элемент. Если остается более значительная работа, немного приподнимите напоминание.

Делайте это достаточно раз, и вы почувствуете, сколько времени потребуется, чтобы избавиться от класса или метода в ваших проектах.

Карл Манастер
источник
1
+1, а не ваш календарь, возможно, будет более уместным технический график погашения задолженности команды?
Гэри Роу
5

ИМХО, если вы можете гарантировать, что никто не использует его и никогда не будет, просто удалите его. (Это может быть сложно при наличии отражения или внешних компонентов, таких как макросы Velocity - современные IDE, такие как IntelliJ, могут найти ссылки, например, в JSP, но не через отражение или в Velocity.)

Если есть лучшая альтернатива, но старая все еще используется во многих местах, и в настоящее время у вас нет времени на рефакторинг всего клиентского кода, достаточно @deprecate устаревшего класса / метода (с адекватным комментарием о удачная альтернатива).

Петер Тёрёк
источник