Как написать код с датой истечения срока действия? - PullRequest
36 голосов
/ 07 марта 2011

У меня только что была идея для чего-то, что я бы хотел использовать:

Допустим, мне нужно исправить ошибку, и я решил написать некрасивую строку кода, которая решает непосредственную проблему - но только потому, что я обещаю себе, что скоро найду время для правильного рефакторинга.

Я хочу иметь возможность каким-то образом пометить эту строку кода как «Истек срок действия» и добавить дату, чтобы, если код был скомпилирован через некоторое время после этой даты, возникла ошибка / предупреждение компиляции с соответствующим сообщением.

Есть предложения? Должно быть возможно выполнить - может быть, использовать какой-то сложный #IF или некоторые опции в visual studio? Я использую VS 2005 - в основном для C #.

Спасибо!

[РЕДАКТИРОВАТЬ]: Wow - никогда не ожидал, что этот вопрос вызовет такой большой интерес :) Спасибо всем за ваши ответы и за то, что превратили это в интересную дискуссию. Я знаю, что трудно оправдать использование чего-либо подобного - и я, вероятно, не буду его использовать, - но иногда, когда вам приходится поставлять версию YESTERDAY, и вместо этого вы обнаруживаете, что идете на компромисс по исправлению - вы хотите заставить себя исправить это в ближайшее время.

Я выбрал предложение MartinStettner в качестве ответа, потому что он отвечал моим потребностям - нет ошибок во время выполнения - только во время компиляции, нет необходимости определять новые типы только для этой цели - и это не ограничивается областью применения всего метода. Ура! * * 1013

Ответы [ 11 ]

32 голосов
/ 07 марта 2011

Пометьте код атрибутом System.ObsoleteAttribute, вы получите предупреждение компилятора, которое заставит вас исправить код

[Obsolete("You've an ugly hack here")]
public void MyUglyHack()
{
...
}

В качестве альтернативы.,.

Напишите свой собственный атрибут, передав ему дату истечения срока действия в конструкторе, в конструктор сгенерируйте исключение, если DateTime.Now >= expirationDate.

Компиляция не будет выполнена, пока вы не исправите код (или болеевероятно, увеличит дату истечения срока действия, или гораздо вероятнее вы просто удалите Атрибут.

27 голосов
/ 07 марта 2011

ооооооо - это ужасно.попробуйте это для смеха:

[AttributeUsage(AttributeTargets.All)]
public class BugExpiryAttribute : System.Attribute
{
    // don't tell 'anyone' about this hack attribute!!
    public BugExpiryAttribute(string bugAuthor, string expiryDate)
    {
        DateTime convertedDate = DateTime.Parse(expiryDate);
        Debug.Assert(DateTime.Now <= convertedDate, 
            string.Format("{0} promised to remove this by {1}", 
                bugAuthor, convertedDate.ToString("dd-MMM-yyyy")));
    }
}

затем, украсьте свой метод / класс и т. д.:

[BugExpiryAttribute("Jack Skit", "2011-01-01")]
public static void Main(string[] args)
{
...
}

... противный: -)

[ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ] - создано от имени академического интереса, а не производственного кода finese !!

[править] - просто для пояснения, код, скомпилированный и находящийся в работе, будет продолжать работать/ после 'bugExpriryDate'.только когда код будет запущен в компиляторе (в / после даты), появится предупреждение (debug.assert).Просто подумал, что стоит провести такое различие - ура МартинСтеттнер.

[предостережение] - при использовании в классах / методах и т. Д. Необходимо будет читать с помощью отражения.однако (и это интересно) будет работать сразу в компиляторе, если используется на sub Main().как странно!!(спасибо за поклон Ганс ...)

17 голосов
/ 07 марта 2011

Я думаю, именно поэтому в Visual Studio есть список задач. Добавить комментарий:

\\ TODO: Fix this spaghetti by 01APR11

и оно будет отображаться так

Task List Pane.

ключевые слова настраиваются из опций

Task List Options

16 голосов
/ 07 марта 2011

Вы можете написать комментарий в виде

// Expires on 2011/07/01

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

#error Code expired on 2011/07/01

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

Этот шаг также может быть выполнен макросом VS, который обеспечивает более легкий доступ ко всем файлам решения, но имеет тот недостаток, что его необходимо устанавливать и запускать на всех установках VS, где компилируется ваш проект.

7 голосов
/ 07 марта 2011

Ну, это не делает именно то, что вы просите, но вы можете использовать вызов метода Debug.Assert (), который предупредит вас (только в Debug), что код истек. Одним из преимуществ будет то, что он не будет непреднамеренно влиять на ваш производственный код (компиляция или выполнение), но будет достаточно раздражающим в Debug, чтобы вы захотели исправить его.

// Alert the developer after 01/07/2011
Debug.Assert(Date.Now < new DateTime(2011, 7, 1))
5 голосов
/ 07 марта 2011

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

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

2 голосов
/ 07 марта 2011

Без управления компилятором (возможно, в период 5.0 с компилятором в качестве службы?) Срок действия вашего кода не истечет. Вы можете пометить код как устаревший, или использовать атрибут «Устаревший» или аналогичный, чтобы сработать предупреждение, но люди могут игнорировать предупреждения (многие разработчики, с которыми я встречался, не узнали правила, что предупреждения являются ошибками).

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

1 голос
/ 07 марта 2011

Вместо того, чтобы встраивать бомбу замедленного действия, возможно, стоит подумать о применении BUGBUG: комментарий ?

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

0 голосов
/ 17 января 2019

Я надеюсь, что смогу помочь с этим. возьмите 2 datetimepicker на ящик для инструментов. И просто конвертировать 1 datetimepicker.

private void expired()
{
DateTime expired = DateTime.Parse(Convert.ToDateTime(datetimepicker1.Text).ToString());
DateTime compare = DateTime.Parse(Convert.ToDateTime(datetimepicker2.Text).ToString());

if(expired < compare)
{
MessageBox.Show("This product is expired!");
}
else
}
MessageBox.Show("This product is not expired");
{
}
0 голосов
/ 05 апреля 2011

Вместо этого отследите ошибку.Тогда это может быть правильно запланировано и расставлено по приоритетам с другими работами по рефакторингу.

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

...