TL;DR
- Clojure ではオブジェクトの代わりにベクタやマップなどのシンプルなデータ型を関数に渡すことが多いので、関数の中でデータの整合性をチェックする必要がある。
- 事前条件(
:pre)や事後条件(:post)に Spec を使う。
内容
Clojure では一般に、オブジェクトを関数に渡す代わりに、ベクタやマップ、集合などのシンプルなデータ型を渡すことが好まれる。そのため、関数の中でデータの整合性をチェックする必要があり、そこで Spec がとても役に立つ。具体的には、事前条件(:pre)や事後条件(:post)として Spec を使う。
(defn add-two-numbers [a b]
{:pre [{s/valid? number? a
s/valid? number? b}]}
(+ a b))
(add-two-numbers 1 2) ; 3
(add-two-numbers 3 "5")
;; java.lang.ClassCastException:
;; class java.lang.String cannot be cast to class java.lang.Number