我正在写一个(非常小的)框架来检查方法的前置和后置条件。入口点是(他们可以很容易地方法,这并不重要):.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原则,如果只是轻微。
这不是什么断言? – 2008-12-27 13:29:17
断言适用于检查后置条件(仅适用于调试版本;我希望允许在发布版本中保留后续检查),而不验证前置条件。 – 2008-12-27 14:05:24