Подтвердить что ты не робот

Как написать код с датой истечения срока действия?

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

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

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

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

Спасибо!

[EDIT]: Вау - никогда не ожидал, что этот вопрос вызовет столько интереса:) Спасибо всем за ваши ответы и за то, что вы превратили это в интересную дискуссию. Я знаю, что это трудно оправдать с помощью чего-либо подобного - и я, вероятно, не буду его использовать, но иногда, когда вам нужно отправить версию YESTERDAY, и вместо этого вы обнаружите, что компрометируете исправленное исправление - вы хотите заставить себя исправить это в ближайшем будущем.

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

4b9b3361

Ответ 1

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

// Expires on 2011/07/01

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

#error Code expired on 2011/07/01

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

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

Ответ 2

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

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

Альтернативно.,.

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

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

Ответ 3

oooohhh - это "orrible. попробуйте это для хихикания:

[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!!

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

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

Ответ 4

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

\\ TODO: Fix this spaghetti by 01APR11

и он будет отображаться следующим образом

Task List Pane.

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

Task List Options

Ответ 5

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

// Alert the developer after 01/07/2011
Debug.Assert(Date.Now < new DateTime(2011, 7, 1))

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

Я надеюсь, что смогу помочь с этим. возьмите 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");
{
}

Ответ 11

Как ВРЕМЯ, так и DATE выделяют строки, и, насколько мне известно, нет способа их разбора на этапе предварительной обработки.

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