Отмечать нативные методы как устаревшие? - PullRequest
4 голосов
/ 22 августа 2011

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

<Obsolete("Do not call this method.")> Private Sub FormerMethod()

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

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

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

Ответы [ 2 ]

2 голосов
/ 02 января 2014

Если вы хотите пометить класс .Net Framework как устаревший, вы можете переопределить его в одном из классов общего доступа / инфраструктуры, которые все используют.

Пример:

namespace System.ComponentModel
{
    [Obsolete("Please do not use BackgroundWorker. Use class XXXX instead.")]    
    public class BackgroundWorker
    {

    }
}

Возможно,Это также можно сделать для конкретных методов, расширив исходный класс .Net Framework, а затем переопределив конкретные методы, которые вызывают базовый метод, но украшены атрибутом Obsolete.

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

2 голосов
/ 22 августа 2011

Хотя вам может не понравиться ответ, я думаю, что обертка будет правильным выбором.

Для кода стороннего поставщика упаковка должна быть обязательной, чтобы обеспечить уровень абстракции для модульного тестирования. И, будучи оболочкой, вы, очевидно, можете пометить методы как Obsolete.

Для объектов .NET это немного сложнее. Очевидно, кто-то может просто включить пространство имен и отправиться в город; Я не верю, что есть решение «только код» для этой проблемы, как вы хотите, за исключением, возможно, создания интеграционного теста, который ищет ваше решение и дает сбой при вызове того конкретного метода, который вам не нравится.

...