Маркировка собственных методов как устаревших/устаревших?
В .NET можно пометить некоторые методы как устаревшие, чтобы разработчики предупреждались, когда они пытаются использовать устаревший метод.
<Obsolete("Do not call this method.")> Private Sub FormerMethod()
Дело в том, что вы можете делать это только в пределах классов, которые вы контролируете. Что вы делаете, когда хотите, чтобы ваши разработчики избегали использования определенных методов в классах, предоставленных изначально в .NET или поставщиком?
Например, что делать, если вы хотите, чтобы ваш разработчик предпочел какой-то пользовательский метод расширения на DataTable
, а не Select
. Мне бы очень не хотелось этого делать. определите пользовательскую версию класса DataTable
только для того, чтобы исключить Select
. Это оставило бы нас в полиции, использовался ли пользовательский стол или нет.
Я знаю, что существуют инструменты, такие как (FxCop), которые помогают применять стандарты кодирования; однако мой вопрос заключается в том, можно ли это сделать без какого-либо стороннего инструмента.
2 ответа:
Хотя вам может не понравиться ответ, я думаю, что упаковка будет подходящим выбором.
Для кода стороннего поставщика обертывание должно быть обязательным только для получения уровня абстракции для модульного тестирования. И будучи оболочкой, вы, очевидно, можете пометить методы как
Obsolete
.Для объектов .NET это немного сложнее. Очевидно, кто-то может просто включить пространство имен и отправиться в город; я не верю, что существует "кодовое" решение этой проблемы, как вы хотите, другое чем, возможно, создание интеграционного теста, который ищет ваше решение и терпит неудачу, когда вызывается тот конкретный метод, который вам не нравится.
Если вы хотите отметить класс .Net Framework как устаревший, вы можете переопределить его в одном из классов shared\infrastructure, которые все используют.
Пример:
namespace System.ComponentModel { [Obsolete("Please do not use BackgroundWorker. Use class XXXX instead.")] public class BackgroundWorker { } }
Это может быть сделано также для конкретных методов путем расширения исходного класса .Net Framework, а затем переопределения конкретных методов, вызывающих базовый метод, но украшенных атрибутом
Obsolete
.Тем не менее, вам потребуется разрешить определение циклического класса (возможно, с помощью ссылки на сборку псевдоним).