Уведомить Разработчика о Методе “НЕ ИСПОЛЬЗОВАТЬ”
-
09-06-2019 - |
Вопрос
Хорошо, я знаю, о чем вы думаете: "Зачем писать метод, которым вы не хотите, чтобы люди пользовались?" Верно?
Ну, короче говоря, у меня есть класс, который нужно сериализовать в XML.Для того, чтобы XmlSerializer
чтобы творить свое волшебство, класс должен иметь пустой конструктор по умолчанию:
public class MyClass
{
public MyClass()
{
// required for xml serialization
}
}
Итак, мне это нужно, но я не хочу, чтобы люди использование это, так есть ли какой-либо атрибут, который можно использовать, чтобы пометить метод как "НЕ ИСПОЛЬЗОВАТЬ"?
Я подумывал об использовании Устаревший атрибут (поскольку это может остановить сборку), но это просто кажется "неправильным", есть ли какой-нибудь другой способ сделать это, или мне нужно идти дальше и стиснуть зубы?:)
Обновить
Хорошо, я принял ответ Кита, поскольку, наверное, в глубине души я полностью согласен.Вот почему я вообще задал этот вопрос, мне не нравится идея иметь Устаревший атрибут.
Однако...
Там является все еще остается проблема, пока мы получаем уведомления в intellisense, в идеале мы хотели бы прервать сборку, так есть ли какой-нибудь способ сделать это?Может быть, создать пользовательский атрибут?
Был создан более целенаправленный вопрос здесь.
Решение
Если класс является [Serialisable]
(т.е.он может быть скопирован по всему месту по мере необходимости) для десериализации необходим конструктор без параметров.
Я предполагаю, что вы хотите принудительно использовать доступ вашего кода для передачи значений по умолчанию для ваших свойств параметризованному конструктору.
По сути, вы говорите, что это нормально для XmlSerializer
чтобы сделать копию, а затем задать свойства, но вы не хотите, чтобы ваш собственный код это делал.
В какой-то степени я думаю, что это чрезмерный дизайн.
Просто добавьте XML-комментарии, в которых подробно описывается, какие свойства необходимо инициализировать (и для чего).
Не используйте [Obsolete]
, потому что это не так.Приберегите это для действительно устаревших методов.
Другие советы
Вы можете использовать:
[Система.Компонентмодель.Редактируемый браузер(System.ComponentModel.EditorBrowsableState.Никогда)]
чтобы это не отображалось в Intellisence.Если потребитель все еще хочет использовать его, он может это сделать, но это будет не так легко обнаружить.
Тем не менее, точка зрения Китса о чрезмерной инженерии все еще остается в силе.
Я прочитал заголовок и сразу подумал "устаревший атрибут".Как насчет
/// <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) {
....
На самом деле я был бы склонен не согласиться со всеми, кто выступает за использование ObsoleteAttribute
как говорится в документации MSDN, что:
Пометка элемента как устаревшего информирует пользователей о том, что этот элемент будет удален в будущих версиях продукта.
Поскольку универсальные конструкторы для сериализации XML не должны быть удалены из приложения, я бы не стал применять это на тот случай, если будущий разработчик технического обслуживания не знаком с тем, как работает сериализация XML.
Я действительно использовал У Кита метод просто отметить, что конструктор используется для сериализации в XML-документации, чтобы он отображался в Intellisense.
Вы могли бы создать свой собственный Attribute
производный класс, скажем NonCallableAttribute
чтобы определить методы, а затем добавьте в свою задачу анализа кода сборки / CI проверку, чтобы отслеживать, использует ли какой-либо код эти методы.
На мой взгляд, вы действительно не можете заставить разработчиков не использовать этот метод, но вы могли бы как можно скорее обнаружить, когда кто-то нарушил правило, и исправить это.
Ух ты, эта проблема и меня беспокоит.
Вам также нужны конструкторы по умолчанию для NHibernate, но я хочу заставить людей НЕ использовать инициализаторы объектов C # 3.0, чтобы классы проходили через код конструктора.
throw new ISaidDoNotUseException();
Отделите ваш сериализуемый объект от вашего доменного объекта.
То, что вы ищете, - это ObsoleteAttribute
класс:
using System;
public sealed class App {
static void Main() {
// The line below causes the compiler to issue a warning:
// 'App.SomeDeprecatedMethod()' is obsolete: 'Do not call this method.'
SomeDeprecatedMethod();
}
// The method below is marked with the ObsoleteAttribute.
// Any code that attempts to call this method will get a warning.
[Obsolete("Do not call this method.")]
private static void SomeDeprecatedMethod() { }
}
ObsoleteAttribute
вероятно, это сработает в вашей ситуации - вы даже можете привести к прерыванию сборки, если будет использован этот метод.
Поскольку устаревшие предупреждения появляются во время компиляции, а отражение, необходимое для сериализации, происходит во время выполнения, пометка этого метода устаревшим не приведет к прерыванию сериализации, но предупредит разработчиков о том, что метод не предназначен для использования.
Я использую ObsoleteAttribute
.
Но, конечно, у вас также могут быть некоторые комментарии.
И, наконец, удалите его полностью, если сможете (не обязательно поддерживать совместимость с чем-то старым).Это самый лучший способ.
Да, есть.
Я написал об этом в своем блоге Работа с дизайнером.
И вот этот код:
public class MyClass
{
[Obsolete("reason", true)]
public MyClass()
{
// required for xml serialization
}
}