В 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?
(defn wrapper [c text] (if (not c) (throw (AssertionError. text))))
, но да, нехорошо. - person soulcheck   schedule 07.06.2015