Я пишу (очень маленькую) структуру для проверки пред- и постусловий методов. точки входа (они могут быть легко быть методами, это не имеет значения):Возможно ли в .Net вызывать некоторый код только из отладочных сборников клиентских сборок?
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;
}
}
Конечно, я могу просто не обеспечить WhileDebuggingThat. Затем клиентский код будет выглядеть следующим образом:
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;
}
}
Это план запасного варианта, если ничего не работает, но он ломает DRY очень плохо.
Как я понимаю, маркировка WhileDebuggingThat
с [Conditional("DEBUG")]
будет излучать (или нет) этот метод в зависимости от того DEBUG определяется во время компиляции библиотеки, не из сборок, которые ссылаются на эту библиотеку. Итак, я мог бы сделать это, а затем написать документацию, сообщающую пользователям библиотеки связывать сборки отладки их кода с отладочной сборкой библиотеки и выпускать сборки с релизными сборками. Это не кажется мне лучшим решением.
Наконец, я мог бы сказать пользователям библиотеки, чтобы определить этот класс в своих проектах:
using ValidationLibrary;
public static class EnsuresWhileDebugging {
[Conditional("DEBUG")]
public static Validation That() {
return Ensures.That;
}
}
Это должно работать так же, насколько я вижу, но по-прежнему требует нарушения DRY принцип, если только слегка ,
Разве это не утверждение? –
Утверждения работают для проверки постусловий (и только в отладочных сборках, я хочу также разрешить оставлять проверки условий в сборках релизов), не проверяя предварительные условия. –