Маркировка собственных методов как устаревших/устаревших?


В .NET можно пометить некоторые методы как устаревшие, чтобы разработчики предупреждались, когда они пытаются использовать устаревший метод.

<Obsolete("Do not call this method.")> Private Sub FormerMethod()
Дело в том, что вы можете делать это только в пределах классов, которые вы контролируете. Что вы делаете, когда хотите, чтобы ваши разработчики избегали использования определенных методов в классах, предоставленных изначально в .NET или поставщиком?

Например, что делать, если вы хотите, чтобы ваш разработчик предпочел какой-то пользовательский метод расширения на DataTable, а не Select. Мне бы очень не хотелось этого делать. определите пользовательскую версию класса DataTable только для того, чтобы исключить Select. Это оставило бы нас в полиции, использовался ли пользовательский стол или нет.

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

2 4

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.

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