C#代码合同用户消息参数

3

我在使用C#中的Code Contracts,但是我有点好奇应该在 userMessage 参数中输入什么。以下是一个简短的示例。

我在代码中有以下断言:

Contract.Assert(IsValidReferenceData(refData));

这个信息不会被展示给用户,但是为了我和其他开发者/维护者更好地理解异常情况,最好提供一个英文信息描述。

一开始我认为

Contract.Assert(IsValidReferenceData(refData), "Payment Reference is not valid");

然后我想到,userMessage与布尔条件完全相反,所以我重新写成了:

Contract.Assert(IsValidReferenceData(refData), "Payment Reference is valid");

因此,消息和条件是相同的。然而,当人们看到异常报告时,这会让他们感到困惑,然后想:“等等,如果引用是有效的,为什么会抛出异常?” 最后,我可以想到为什么不发表一个中立的声明,说明必须是真实的:
Contract.Assert(IsValidReferenceData(refData), "Payment Reference must be valid");

以上哪种方式是最佳实践?我想要确保消息传递正确,因为我计划在各个地方使用断言来防止数据异常,并且我正在启用运行时检查。

3个回答

4

所以,我有一些.Net代码,想知道他们使用的是哪个参数,这是结果:

"hashcode >= 0"
"Race condition detected in usages of Hashtable - multiple threads appear to be writing to a Hashtable instance simultaneously!  Don't do that - use Hashtable.Synchronized."
"Invalid MaxPrimeArrayLength"
"Missing case in GetRandomizedEqualityComparer!"
"We increment our current index by 8, so our buffer size must be a multiple of 8"
"key shouldn't be null!"
"Size is not zero"
"Didn't set Console::_out or _error appropriately!"
"Setting the foreground color before we've read the default foreground color!"

更多内容请查看:http://pastebin.com/zPgU1ALe 基本上,答案是:随便写点什么,这条消息的目的是让你快速调试,而不是为了你的 API 用户。

3
代码契约(即断言、前置条件和不变量)用于检测您的代码无法处理的异常操作条件。它们不应该作为第一次验证使用,因此,Contracts 不应关注用户上下文消息。在表示/服务层中的上游验证应已识别出任何无效的用户或服务客户端输入。
由于消息仅在契约失败时显示,而理论上它不应发生在生产化代码中,这意味着目标“用户”受众将是或其他开发人员,因此消息应该针对您进行调试(如果需要消息-堆栈跟踪和行号通常足够,我认为)。参数名称 userMessage 可能是一个不幸的选择,我猜。

2
值得一提的是,虽然没有针对失败的代码合同的用户消息的指南,但是有一个名为“期望描述消息”的xUnit测试模式适用于您的最后一个示例。通过在断言消息中回答应该发生什么的问题,您可以实现两个目标:代码可读性+提供有用的、自我解释的调试消息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接