在clojure中我正在使用:pre like this
user=> (defn cannot-take-empty [x] {:pre [((complement empty?) x)]} 1)
#'user/cannot-take-empty
user=> (cannot-take-empty #{})
AssertionError Assert failed: ((complement empty?) x) user/cannot-take-empty (NO_SOURCE_FILE:186)
这很好,但它没有解释商业原因为什么传递空集合没有意义。 (或者包含五个以上元素的集合,或者存在两个密钥而不是另一个密钥的集合,或者当天的规则是什么。)如果前置条件使用私有函数,这对用户来说可能更加混乱。 / p>
使用时,有没有办法向用户提供更有用的反馈,例如错误消息:pre和:post?
答案 0 :(得分:4)
显然,前置和后置条件是针对用户使用而设计的,其中报告条款向开发者提供了足够的信息,即它是不言自明的。如果您希望提供更多说明,请务必使用assert
。
但你可以滥用这样一个事实,即总是报告整个情况,例如:像这样:
{:pre [(do "It can't be empty because of..."
(seq x))]}
它会报告类似
的内容断言错误断言失败:(执行“由于...不能为空” (seq x))......