在.NET中断言参数和值的前置条件和后置条件的最佳方法?
我最近一直在考虑通过合同进行设计,我想知道人们认为在.NET中断言值的前提和后继条件的最佳方法是什么?
即验证方法的参数值。
有人建议使用Debug.Assert,而另一些人则建议使用if语句并引发异常。各自的优缺点是什么?
我们推荐哪些可用的框架?
解决方案
与断言相比,我更喜欢使用异常,因为如果不是这样,我想了解它,以便对其进行修复,而我们在调试模式下获得的覆盖率远不及实际使用率或者覆盖率,使用Debug.Assert还不够。
使用断言意味着我们不会在发布代码中添加膨胀,但这意味着,如果我们在调试版本中发现这些合同,则只会看到何时以及为什么这些合同被破坏。
使用异常意味着我们可以在合同发生,调试或者发布时看到合同的破裂,但这也意味着发布版本包含更多的检查和代码。
我们可以采用中间方法,并使用"跟踪"来将前后条件跟踪到某种类型的应用程序日志中,以用于调试问题。但是,我们需要一种收集这些日志的方法来了解用户遇到的问题。也可以将其与异常结合使用,以便针对更严重的问题获得异常。
我的看法是,如果合同值得执行,那么它就值得在合同破裂时抛出异常。我认为这在一定程度上取决于意见和目标应用。如果确实抛出异常,则可能需要某种形式的事件报告系统,以在未处理引发的异常时提供崩溃报告。
另一种选择是Spec#。
专门说明了面向对象语言C#的扩展。它将类型系统扩展为包括非null类型和检查的异常。它以前置条件和后置条件以及对象不变式的形式提供方法协定。
指定执行此操作的方法,它是C#的超集。现在,我们有了"代码合同",这是Spec#的语言不可知版本,因此,例如,现在我们可以在VB.NET中拥有代码合同。
最终将在.NET 4.0发行时使用代码合同。但是,现在在我们的生产代码中,使用" Guard"类以及生成异常的常用方法,我们已经取得了巨大的成功。
有关更多详细信息,请参阅我的相关文章。