我最近一直在考虑合同设计,我想知道人们认为在.NET中断言前置条件和后置条件的最佳方法是什么? 即验证方法的参数值。

有些人建议使用Debug.Assert,而其他人则讨论使用if语句加上抛出异常。各自的优点和缺点是什么?

您推荐哪些框架?

有帮助吗?

解决方案

我们最终会在.NET 4.0发布时使用代码合约。然而,在我们的生产代码中,我们已经取得了巨大的成功,其中一个“卫士” class以及生成异常的常用方法。

有关详细信息,请参阅我关于此的帖子

其他提示

另一个选项是 Spec#

Spec#是面向对象语言C#的扩展。它扩展了类型系统,以包括非null类型和已检查的异常。它以前置条件和后置条件以及对象不变量的形式提供方法契约。

我更喜欢断言的异常,因为如果它应该是这样而不是,我想知道它,所以我可以解决它,我们在调试模式下获得的覆盖范围远不及现实生活中的使用或覆盖范围,所以只使用Debug.Assert做得不够。

使用断言意味着您不会向发布代码添加膨胀,但这意味着只有在调试版本中捕获它们时才能看到这些合同何时以及为何被破坏。

使用异常意味着您可以在合同发生,调试或发布时看到合同中断,但这也意味着您的发布版本包含更多检查和代码。

您可以使用inbetween方法并使用Trace将您的前置和后置条件追溯到某种应用程序日志,您可以使用它来调试问题。但是,您需要一种收集这些日志的方法来了解您的用户遇到的问题。这也是将此与异常相结合的可能性,因此您可以获得更严重问题的例外情况。

我看到它的方式是,如果合同值得执行,那么它值得在它破坏时抛出异常。我认为这有点落后于意见和目标应用。如果你确实抛出了异常,你可能想要某种形式的事件报告系统,它在未处理引发异常时提供崩溃报告。

您可以在 http://conditions.codeplex.com/ 查看流畅的框架。 它的开源和免费。

Spec#是这样做的方式,它是C#的超集。现在你有“ Code Contracts ”,这是一种语言 - Spec#的不可知版本,所以现在你可以在VB.NET中拥有代码契约。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top