使用 :pre 和 :post 可读性更强?
More readable messages with :pre and :post?
在 clojure 中,我像这样使用 :pre
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)
很好,但它没有解释业务原因为什么传递一个空集合没有意义。 (或者一个包含五个以上元素的集合,或者一个存在两个键但没有另一个键的集合,或者无论今天的规则是什么。)如果前提条件使用私有函数,这可能会让用户更加困惑。
有没有办法在使用 :pre 和 :post 时向用户提供更有用的反馈,例如错误消息?
显然 pre 和 post 条件是为报告条款为开发人员提供足够信息的用例而设计的,即它是不言自明的。如果您想提供更多解释,惯用的做法是使用 assert
.
但是您可以滥用这样一个事实,即始终报告整个情况,例如像这样:
{:pre [(do "It can't be empty because of..."
(seq x))]}
它会报告类似
的内容
AssertionError Assert failed: (do "It can't be empty because of..."
(seq x)) ...
在 clojure 中,我像这样使用 :pre
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)
很好,但它没有解释业务原因为什么传递一个空集合没有意义。 (或者一个包含五个以上元素的集合,或者一个存在两个键但没有另一个键的集合,或者无论今天的规则是什么。)如果前提条件使用私有函数,这可能会让用户更加困惑。
有没有办法在使用 :pre 和 :post 时向用户提供更有用的反馈,例如错误消息?
显然 pre 和 post 条件是为报告条款为开发人员提供足够信息的用例而设计的,即它是不言自明的。如果您想提供更多解释,惯用的做法是使用 assert
.
但是您可以滥用这样一个事实,即始终报告整个情况,例如像这样:
{:pre [(do "It can't be empty because of..."
(seq x))]}
它会报告类似
的内容AssertionError Assert failed: (do "It can't be empty because of..." (seq x)) ...