Я пишу (очень маленький) фреймворк для проверки предварительных и постусловий методов. Точки входа (они могут быть легко методами; это не имеет значения):
public static class Ensures {
public static Validation That {
get { ... }
}
}
public static class Requires {
public static Validation That {
get { ... }
}
}
Очевидно, что проверка постусловий может быть дорогой и на самом деле не нужна, если метод не содержит ошибок. Поэтому я хочу метод, который работает следующим образом:
public static class Ensures {
[ConditionalCallingCode("DEBUG")]
public static Validation ThatDuringDebug {
get { ... }
}
}
где ConditionalCallingCodeAttribute
означает, что этот метод должен запускаться только тогда, когда вызывающий код компилируется с определенным символом DEBUG. Возможно ли это?
Я хочу, чтобы код клиента выглядел так:
public class Foo {
public void Bar() {
... // do some work
Ensures.That // do these checks always
.IsNotNull(result)
.IsInRange(result, 0, 100);
Ensures.WhileDebuggingThat // only do these checks in debug mode
.IsPositive(ExpensiveCalculation(result));
return result;
}
}
Конечно, я просто не могу предоставить пока отладку, что. Тогда код клиента будет выглядеть так:
public class Foo {
public void Bar() {
... // do some work
Ensures.That // do these checks always
.IsNotNull(result)
.IsInRange(result, 0, 100);
#ifdef DEBUG
Ensures.That // only do these checks in debug mode
.IsPositive(ExpensiveCalculation(result));
#endif
return result;
}
}
Это запасной план, если больше ничего не получается, но он действительно сильно нарушает СУХОЙ.
Насколько я понимаю, маркировка WhileDebuggingThat
знаком [Conditional("DEBUG")]
будет генерировать (или нет) этот метод в зависимости от того, определен ли DEBUG во время компиляции библиотеки, , а не сборок, которые ссылаются на это библиотека. Таким образом, я мог бы сделать это, а затем написать документацию, в которой пользователям библиотеки предлагалось бы связывать отладочные сборки их кода с отладочной сборкой библиотеки и выпускать сборки с выпусками сборки. Это не кажется мне лучшим решением.
Наконец, я мог бы попросить пользователей библиотеки определить этот класс в своих проектах:
using ValidationLibrary;
public static class EnsuresWhileDebugging {
[Conditional("DEBUG")]
public static Validation That() {
return Ensures.That;
}
}
Насколько я понимаю, это также должно работать, но все же требует нарушения принципа СУХОЙ, хотя бы немного.