2015-06-06 5 views
5

In clojure sto usando: pre come questoMessaggi più leggibili con: pre e: post?

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) 

che è grande, ma non spiega il motivo per cui affari che non ha senso passare in un insieme vuoto. (O una collezione con più di cinque elementi, o una collezione che ha due chiavi presenti ma non un'altra, o qualunque sia la regola del giorno.) Questo è potenzialmente ancora più confuso per l'utente se la precondizione utilizza una funzione privata.

C'è un modo per fornire un feedback più utile all'utente come un messaggio di errore, quando si utilizza: pre e: post?

+0

dai un'occhiata a [questa risposta] (http://stackoverflow.com/a/24874961/642340) È un po 'brutto ma dovrebbe funzionare. – soulcheck

+0

@soulcheck Speravo di evitare di lanciare eccezioni in modo esplicito, sembra piuttosto java-esque. –

+0

si può sempre racchiuderlo in una funzione/macro '(defn wrapper [c text] (if (not c) (throw (AssertionError. Text))))' ma sì, non bello. – soulcheck

risposta

4

Apparentemente le condizioni pre e post sono progettate per gli use case in cui riportare le clausole fornisce informazioni sufficienti allo sviluppatore, vale a dire che è auto-esplicativo. Se si desidera fornire ulteriori spiegazioni, è idiomatico utilizzare assert.

Ma si può abusare del fatto che l'intera condizione viene sempre riportata ad es. in questo modo:

{:pre [(do "It can't be empty because of..." 
      (seq x))]} 

E riporterà qualcosa come

AssertionError Assert non riuscita: (fare "non può essere vuoto perchè di ..." (ss x)) ...