ヘルステックチームの近藤です。みなさんバリデーションしていますか?病めるときも健やかなるときも、アプリケーションサービスを書くときもドメインモデルを書くときも、バリデーションはなんだかんだでせざるを得ないですよね?当然私も日々バリデーションしているわけですが、いろいろと思うところがあり、自分でバリデーション用のライブラリを書きました。今回はそれを紹介します。clarifyのコンセプトそのバリデーションライブラリはclarifyという名前で、とあるコンセプトに沿って作られています。それは「値を与えたらバリデーション結果を返す」というものです。当たり前のことなんですが、じゃあ反対にやりたくなかったのは:とあるtraitを継承しDSLにてバリデーションの内容を定義したりvalidateメソッドでそのオブジェクトが妥当かどうかを確かめるみたいなやつです。具体的な例で言うとActiveModel::Validationsのようなものです。ドメイン編でも触れた「ドメインにフレームワークを持ち込みたくない」という事情に起因します。ドメインにおける表現の自由度をバリデーションによって奪いたくありません。バリデーションは「外側の値(ユーザが入力したもの、APIにて受け取ったものなど)が内側のルールに即しているか」を確かめるものです。故にどこにでも現れる処理だと思います。アプリケーションサービスではクライアントから与えられた値が妥当かどうか、ドメインモデルではドメインに沿っているかどうか......。冒頭で言った「アプリケーションサービスを書くときもドメインモデルを書くときも」というのはただノリで言ったわけではなく、本当にそうだと思っています。いうことなので、取り回しが利きやすい「値を与えたらバリデーション結果を返す」という単なる「関数」である形を目指しています。インストールじゃあ実際にどう使うのかを紹介します。言えこのライブラリ、とりあえず私自身が使えるようにしたかったものなので、ドキュメントは雑ですし、テストもなく、配布もただ.jarファイルを置いただけという代物です。いうものがあるんだーーーぐらいのものです。.jarは下記の場所にあります。https://takkkun.github.io/clarify/org/usagram/clarify_2.11/0.0.4/clarify_2.11-0.0.4.jarsbtを使用している場合はlibraryDependenciesに下記を加えてあげればOKです。"https://takkkun.github.io/clarify/org/usagram/clarify_2.11/0.0.4/clarify_2.11-0.0.4.jar"Validatorclarifyは「値を与えたらバリデーション結果を返す」に終始していると言いましたが、その最小単位はValidatorと呼ばれるものです。Validatorは数値がとある数値以上かどうかを確かめるものです。Validatorなんてのもあります。(Errorはclarifyで定義しているtrait)を実装しているだけです。オリジナルのValidatorを作ることも出来ます。メソッドを実装する必要がある。Tagsはバリデーションした値に付与されたメタデータ。値に名前を割り振るためのlabelなどがある。}}どうでしょう?十分にシンプルかなーと思います。Validator同士を合成して大きなValidatorを作るValidatorたったひとつでは現実世界の要望を満たせないことが多いと思います。文字列においても大体「空ではなく、かつ20文字以内」みたいなのがほとんどじゃないでしょうか?というわけで、関数合成のようにValidator同士を合成することでその要望に応えています。いうメソッドがそれです。論理演算のそれをイメージしてもらえればと思います。いうメソッドもあるのですが、個人的にあまり使う機会がないため動作をやや決め切れてなかったりします*1。ComplexValidatorN「値を与えたらバリデーション結果を返す」についてはValidatorで十分実現できています。とある値の集合にたいしてバリデーションを行い、すべてのバリデーションを実行後、ひとつでもエラーとなった場合はバリデーション失敗にしたい、というのはよくあります。Validatorだけでそれを行うことは不可能ではありませんが、ひとつひとつValidatorに値を与え、最後にまとめるのを何度も書くのはしんどいものがあります。それを解決するのがComplexValidatorNというものです。Nには1から22までの数字が入ります。いうメソッドで繋ぐことでComplexValidatorNを作ることが出来ます。下記のケースではValidatorを3つ繋いでいるので、ComplexValidator3が作られます。