Использование устаревшего атрибута

Недавно мне сказали, что помечать несколько методов в нашем коде атрибутом [Obsolete] — плохая практика. Эти методы были внутренними для нашей кодовой базы, а не в API. Методы обрабатывали более старую функцию шифрования.

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

Другие считали, что я должен был полностью удалить методы, переписав или рефакторинг существующего кода по мере необходимости. Кроме того, считалось, что слишком легко игнорировать предупреждения компилятора.

Существует ли «лучшая практика» для пометки кода как устаревшего, когда он не используется третьими лицами? Или это во многом субъективно?


person g t    schedule 18.08.2010    source источник
comment
Звучит как причина заставить предупреждения быть ошибками   -  person Matt Ellen    schedule 18.08.2010
comment
@Мэтт - Верно; мы внесли это изменение, чтобы предотвратить использование [Obsolete] в будущем, среди прочего   -  person g t    schedule 19.08.2010
comment
В этом случае нет ничего плохого в использовании [Obsolete]. Тот факт, что вы создали лучший виджет, не означает, что у вас есть время просмотреть и удалить все места, где используется плохой виджет. По крайней мере, пометив его как устаревший, вы указали, что люди не должны использовать его в будущем и удалять его, когда это возможно.   -  person Michael Richardson    schedule 10.04.2014


Ответы (5)


Шаг 1. Отметьте участника или класс как [Устаревший]

Шаг 2. Обновите все внутренние варианты использования члена или класса, чтобы либо использовать новый подход, который заменяет устаревший подход, либо пометить этот член или класс как [Устаревший].

Шаг 3. Если вы пометили новый материал как [Устаревший] на шаге 2, повторите этот шаг по мере необходимости.

Шаг 4. Удалите все устаревшие члены и классы, которые не являются общедоступными и не используются устаревшим открытым членом или классом.

Шаг 5. Обновите документацию, чтобы дать более четкое описание подхода, рекомендуемого для замены любых общедоступных устаревших членов или классов.

В конце этого у вас не будет устаревшего кода, который используется исключительно внутренним кодом. Однако нельзя сказать, что вы должны сделать все это за один раз; на каждом этапе вы добились прогресса. Время между началом шага 1 и завершением шага 5 может составлять 5 секунд или 5 лет, в зависимости от многих факторов (большинство из них связано со сложностью).

Между прочим, если кому-то легко игнорировать предупреждения компилятора, проблема не в [Obsolete]. Тем не менее, одна из причин не оставлять такие вызовы в коде надолго (то есть делать до шага 2 как можно скорее) состоит в том, чтобы убедиться, что люди не привыкнут к предупреждениям компилятора, поскольку они являются частью кода. привычная реакция на компиляцию кода.

person Jon Hanna    schedule 18.08.2010
comment
+1 за отличный ответ. Очень хорошо описывает техническую реализацию, а также психологический (с точки зрения разработчика) аспект этой проблемы. - person Shiva; 09.07.2014
comment
новый С# запрещает сериализацию, поэтому будьте осторожны. - person deadManN; 18.10.2015

Я бы подумал, что это субъективно. Если это внутренний процесс и это довольно быстрый процесс, я бы выполнил изменение.

Однако у меня также была ситуация, когда соответствующий рефакторинг занимал намного больше времени (много вызовов по всей кодовой базе), и в этом случае я использовал атрибут [Obsolete]. В этом случае новая разработка будет использовать новые функции, а те, у кого есть время, выполнят рефакторинг, пока не исчезнут все вызовы, а это значит, что метод можно будет удалить.

person flq    schedule 18.08.2010
comment
если вы вводите атрибут [Obsolete], вы должны самостоятельно исправить все возникающие предупреждения компиляции. В противном случае вы просто засоряете свой собственный исходный код. - person Boris Lipschitz; 30.03.2011
comment
Вы вообще читали, что я написал. Это временная мера для более крупного рефакторинга. А потом минусуете? Ц... - person flq; 30.03.2011
comment
Мне не нравилось, и кто успел, выполнял рефакторинги, пока не пропали все звонки. Я иногда вижу это в больших проектах. Некоторые люди помещают устаревшие атрибуты и закрепляют там основную проблемную область. Затем подождите, пока кто-нибудь еще успеет исправить другие способы использования. - person Boris Lipschitz; 31.03.2011

По-разному. Да, вы МОЖЕТЕ реорганизовать код. МОГЛИ БЫ ВЫ?

Проблема в том, что вы МОЖЕТЕ провести рефакторинг ВНУТРИ ОДНОЙ ПРОГРАММЫ. Это намного сложнее, если API находится в открытом доступе, и вы просто НЕ МОЖЕТЕ провести рефакторинг кода, используя свой API. Это то, для чего создан Obsolete.

если API является внутренним для вашего кода, то рефакторинг — это путь. Очистите код, не оставляйте беспорядок.

Но если общедоступный API изменится, это следует, по возможности, делать медленно.

Остальное пока субъективно. Мне не нравится «Устаревший» для внутренних API.

person TomTom    schedule 18.08.2010
comment
+1 Разумно. Существуют инструменты (ReSharper), которые могут систематически рефакторить внутренний код, зависящий от API, и если у вас есть покрытие модульными тестами, то такой рефакторинг должен быть безопасным. (Если у вас нет покрытия юнит-тестами, то стоит ли вообще менять этот код?) - person Tim Robinson; 18.08.2010
comment
Спасибо за ваши мысли - кто-то еще, кто думает об этом атрибуте как о «беспорядке» при внутреннем использовании. (Обратите внимание, что рассматриваемый код не был доступен через API, он находился во внутренней библиотеке.) - person g t; 18.08.2010
comment
Я бы определенно провел рефакторинг. Дело в том, что это устраняет код. Двойной код = дорого ;) - person TomTom; 18.08.2010
comment
@ Тим Робинсон. К сожалению, ReSharper нам не разрешен/не доверен. В данном случае, как вы говорите, это, безусловно, помогло бы. Также были связаны модульные тесты, хотя при работе с шифрованием может быть сложнее быть уверенным, что каждый случай полностью охвачен тестами. - person g t; 18.08.2010
comment
Позор — ReSharper сделал меня намного лучшим разработчиком. - person Tim Robinson; 18.08.2010

Я использовал его раньше как своего рода временное положение дел, когда у нас есть старый код, который нужно рефакторить в конечном счете, но не срочно. Чаще всего это тот случай, когда был написан какой-то новый код, который выполняет работу лучше, чем тот, что был до него, но ни у кого в команде нет времени вернуться и заменить много старого кода в данный момент. Очевидно, это подразумевает ситуацию, когда простая вставная замена невозможна немедленно (иногда новый код делает почти все, что делал старый код, но есть небольшая часть функций, которые еще не реализованы). ).

Тогда наличие всех этих предупреждений компилятора является постоянным напоминанием кому-то вернуться и закончить рефакторинг, когда у него появится немного свободного времени.

Действительно ли это хорошо или плохо, довольно субъективно. Это инструмент, как и любой другой.

person Dan Tao    schedule 18.08.2010
comment
Довольно! Атрибут, казалось, служил напоминанием о том, что этот код следует рассмотреть для удаления в будущем без необходимости принимать это решение при приближении к выпуску. - person g t; 18.08.2010

Это не прямой случай. Если вы удаляете методы из работающего приложения и реорганизуете код, вы создаете вероятность того, что вы внесете новые ошибки и сломаете работающее приложение. Если это приложение является критически важным, влияние может быть огромным и стоить компании больших денег, такие изменения необходимо тщательно планировать и тестировать. В этом случае может быть целесообразно пометить методы как устаревшие, это должно помочь предотвратить их использование людьми в дальнейшей разработке, что облегчит возможный рефакторинг. Однако, если приложение не критично для выполнения задач или вероятность возникновения ошибок невелика, возможно, лучше провести рефакторинг, если у вас есть время. В конечном итоге добавление атрибута [Obsolete] немного похоже на задачу, и его использование зависит от многих факторов.

person Ben Robinson    schedule 18.08.2010