Уведомить разработчика о методе «НЕ ИСПОЛЬЗОВАТЬ» - PullRequest
26 голосов
/ 26 августа 2008

Хорошо, я знаю, о чем вы думаете: «Зачем писать метод, который вы не хотите, чтобы люди использовали?» Правильно?

Короче говоря, у меня есть класс, который нужно сериализовать в XML. Для того, чтобы XmlSerializer сотворил магию, класс должен иметь пустой конструктор по умолчанию:

public class MyClass
{
  public MyClass()
  {
    // required for xml serialization
  }
}

Итак, мне нужно иметь его, но я не хочу, чтобы люди использовали , поэтому есть какой-либо атрибут, который можно использовать для пометки метода как "НЕ ИСПОЛЬЗУЙТЕ"

Я думал об использовании атрибута Устаревший (поскольку это может остановить сборку), но это просто кажется "неправильным", есть ли другой способ сделать это, или мне нужно идти вперед и прикусить пулю? :)

Обновление

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

Однако ...

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

Был создан более сфокусированный вопрос здесь .

Ответы [ 12 ]

22 голосов
/ 27 августа 2008

Вы можете использовать:

[<a href="https://msdn.microsoft.com/en-us/library/system.componentmodel.editorbrowsableattribute%28v=vs.110%29.aspx" rel="noreferrer">System.ComponentModel.EditorBrowsable</a>(<a href="https://msdn.microsoft.com/en-us/library/system.componentmodel.editorbrowsablestate%28v=vs.110%29.aspx" rel="noreferrer">System.ComponentModel.EditorBrowsableState.Never</a>)]

чтобы он не отображался в Intellisence. Если потребитель все еще хочет использовать его, он может, но это не будет так легко обнаружить.

Кейтс говорит о том, что инженерия все еще стоит.

14 голосов
/ 26 августа 2008

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

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

По сути, вы говорите, что XmlSerializer может делать копию, а затем задавать свойства, но вы не хотите, чтобы ваш собственный код делал это.

В какой-то степени я думаю, что это чрезмерное проектирование.

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

Не используйте [Obsolete], потому что это не так. Зарезервируйте это для действительно устаревших методов.

2 голосов
/ 26 августа 2008

На самом деле я был бы склонен не согласиться со всеми, кто выступает за использование ObsoleteAttribute, поскольку документация MSDN гласит:

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

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

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

2 голосов
/ 26 августа 2008

Я прочитал заголовок и сразу подумал "устаревший атрибут". Как насчет

    /// <summary>
    /// do not use
    /// </summary>
    /// <param name="item">don't pass it anything -- you shouldn't use it.</param>
    /// <returns>nothing - you shouldn't use it</returns>
    public bool Include(T item) { 
    ....
1 голос
/ 27 августа 2008

Вы можете создать свой собственный Attribute производный класс, скажем NonCallableAttribute для квалификации методов, а затем добавить в свою задачу анализа кода сборки / CI проверку, чтобы отслеживать, использует ли какой-либо код эти методы .

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

0 голосов
/ 27 августа 2008

Отделите ваш сериализуемый объект от вашего доменного объекта.

0 голосов
/ 27 августа 2008
throw new ISaidDoNotUseException();
0 голосов
/ 26 августа 2008

Ух ты, эта проблема меня тоже беспокоит.

Вам также нужны конструкторы по умолчанию для NHibernate, но я хочу заставить людей НЕ использовать инициализаторы объектов C # 3.0, чтобы классы проходили через код конструктора.

0 голосов
/ 26 августа 2008

Я использую ObsoleteAttribute.

Но вы также можете оставить несколько комментариев.

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

0 голосов
/ 26 августа 2008

Да, есть.

Я написал этот пост об этом Работа с дизайнером .

А вот и код:

<code>
public class MyClass
{
  [Obsolete("reason", true)]
  public MyClass()
  {
    // required for xml serialization
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...