Schema
for Clojure Data Shape

Declaration
and Validation



1.何为schema

schema是描写叙述数据形式的一种clojure数据结构,可用于文件、校验函数和数据。

以下举个样例让大家对schema有个整体认识.

例:

(ns schema-examples

(:require [schema.core :as s]))

(def  s-type s/Str)

(s/validate  s-type  "123")  ;; Success!

(s/validate  s-type  123)   ;; Exception -- Value does not match schema:...

2.schema在clojure中的使用

(1)project.clj的:dependencies中加入“[prismatic/schema
"0.3.1"]”包。

(2)在命名空间的:require中增加“[schema.core :as s]”。

3.定义数据类型

(1)支持java所定义的全部数据类型(包含基本数据类型和复杂数结构),schema封装了好多Java的数据类型,如Int
Str等。

[详见](http://prismatic.github.io/schema/schema.core.html)

例:(def data long)

(def map-shape java.util.Map)

(2)支持schema.core定义的数据类型

例:(def s-data s/Int)

(def s-str s/Str)

(def s-keyword s/Keyword)

(3)支持自己定义数据类型

例:

(def Data

{:a {:b s/Str

:c s/Int}

:d [{:e s/Keyword

:f [s/Num]}]})

(4)能够利用schema提供的工具函数来定义类型

例:

定义一个数据必须是奇数且为长整形的:

(def OddLong (s/both long (s/pred odd? 'odd?

)))

(都不用你再写一个检查函数了,非常方便啊。有木有!!)

(5)对于Map的schema。在定义的时候还能够设定可选项

如:

(def FancyMap

{(s/optional-key :foo) s/Keyword

s/Str s/Str})

(s/validate FancyMap {"a" "b"})

(s/validate FancyMap {:foo :f "c" "d" "e" "f"})

注意:key 和 value应该是成对出现或消失的。

(s/validate
FancyMap {:foo "c" "d" "e" "f"})  ;; Exception -- Value does not match schema:...

(6)你能够用s/validate函数来检測你定义的数据是否满足你定义的类型。

还能够用s/explain函数来检查某个类型的定义。

如:

(s/validate FancyMap {"a" "b"})

(s/explain FancyMap)

4.定义变量

能够用schema.core中的def来定义一个变量, 如:

(s/def foo :- long 2)

要求用于变量初始化的值必须满足定义的schema.

5.定义函数

schema.core中封装了好多函数, 我们能够利用s/defn或s/fn来定义我们的函数,和用clojure的defn是一样样的.

例:

(s/defn deposite :- (s/maybe s/Int)

[order-id :- (s/maybe s/Int) pay-type :- s/Str]

...)

(1)假设想要对函数做类型检查,必须使用schema中封装的defn 或 fn来定义函数。这是运行类型检查的基础。可是是否进行类型检查,还有“开关”进行控制。

(2)參数和返回值:能够用":-"符号来指定一个參数和返回值的类型(能够是自己定义类型)。

(3)假设数据可能为nil时,能够用maybe函数来修饰。

(4)假设想要对某个函数或者多个函数进行类型检查,能够用with-fn-validation来运行这些函数。如:

(s/with-fn-validation

(deposite
1 "yidong")

(function2
...)

(function3
...))

* 这个相当于类型检查的“开关”,在測试代码中很实用。

我们能够在測试的时候开启类型检查。而公布的时候则不须要开启。

(5)假设想要一个函数总是运行类型检查,能够使用“^:always-validate”。如:

(s/defn ^:always-validate finish-order :- Map

[order-id :- s/Int pay-type :- s/Str pay-result :- s/Bool]

*对于那些和用户输入相关的函数,能够使用该方法。

6.schema的优点:

(1)可自己定义数据类型。

(2)可自由控制检測开关。

比方,可在測试时打开类型检測。公布时关闭.

(3)明白输入输出, 提高代码可读性。

不须要为函数參数和返回值写一堆凝视:凝视和代码不同步,自然语言描写叙述的不明白、不一致,在每一个使用该数据的地方都要写一次凝视.

7.schema的不足:

(1)不能对数组的个数做限定,假设想定义仅仅有两个元素的数组"[Long Long]".

个人想法:这不能算是不足。由于schema主要是做类型检測的,不是编译器。

(2)不能定义某些复杂的类型。如想要给以下的数据结构定义一个类型:

[[1 1.0] [2 2.0]]

你可能会定义成:

(def
a [[s/Int double]])

结果执行(s/validate a [[1 1.0] [2 2.0]])出错.

定义成[[s/Num]]则执行正常.

个人想法:数组中存放的元素的类型应该是一致的(C/C++/JAVA等语言中,数组中元素的类型不都是一致的么?),
你能够把它们封装在一个map或者类里。再来定义。

8.schema支持的clojure版本号。

文档上说是1.5.1 and 1.6.x,实际測试发现1.7.0-alpha也支持。

*还支持ClojureScript(有须要的时候再研究,欢迎大家补充).

以上是依据个人实践和查阅资料所总结出来的, 有不足或者错误之处,请大家补充和指正.


版权声明:本文博主原创文章,博客,未经同意不得转载。

schema for clojure的更多相关文章

  1. clojure with postgres

    主要关注访问pg.不关心其他db 1 clojure.java.jdbc https://github.com/clojure/java.jdbc http://clojure-doc.org/art ...

  2. JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

  3. [MySQL Reference Manual] 23 Performance Schema结构

    23 MySQL Performance Schema 23 MySQL Performance Schema 23.1 性能框架快速启动 23.2 性能框架配置 23.2.1 性能框架编译时配置 2 ...

  4. Referenced file contains errors (http://www.springframework.org/schema...错误

    Referenced file contains errors (http://www.springframework.org/schema...错误 Referenced file contains ...

  5. jBPM4.4 no jBPM DB schema: no JBPM4_EXECUTION table. Run the create.jbpm.schema target first in the install tool.

    jBPM4.4 no jBPM DB schema: no JBPM4_EXECUTION table. Run the create.jbpm.schema target first in the ...

  6. 高性能MySQL(四):schema陷阱

    一.schema陷阱 二.缓存表和汇总表 三.范式和反范式

  7. XmlValidationHelper XSD、Schema(XmlSchemaSet)、XmlReader(XmlValidationSettings)、XmlDocument、XDocument Validate

    namespace Test { using Microshaoft; using System; using System.Xml; using System.Xml.Linq; class Pro ...

  8. solr schema.xml文档节点配置

    首先,讲解一下/usr/local/solr/collection1/conf/schema.xml的配置,此文档功能类似于配置索引数据库. Field:类似于数据库字段的属性(此文统一使用用“字段” ...

  9. clojure基础入门(一)

    最近在看storm的源码,就学习分享下clojure语法. 阅读目录: 概述 变量 运算符 流程控制 总结 概述 clojure是一种运行在JVM上的Lisp方言,属于函数式编程范式,它和java可以 ...

随机推荐

  1. poj 3399 Product(数学)

    主题链接:http://poj.org/problem?id=3399 Product Time Limit: 1000MS   Memory Limit: 65536K Total Submissi ...

  2. Oracle Hints详细解释

    特别介绍给大家Oracle Hints之前,让我们知道下Oracle Hints什么,然后好Oracle Hints,我们希望实际.基于成本的优化器是很聪明,在大多数情况下,将选择正确的优化,减少DB ...

  3. Windows IOT

    Windows IOT 开发入门(准备工作)   终于抽出空来了,将最近研究的东西记录下来,物联网,万物皆可联网.然后可以做到智能家居,智能生活,智能城市....一大堆.吹牛的就不说了. 在实际应用中 ...

  4. Hive ERROR: Out of memory due to hash maps used in map-side aggregation

    什么时候hive在运行大数据量的统计查询语句时.常常会出现以下OOM错误.详细错误提演示样例如以下: Possible error: Out of memory due to hash maps us ...

  5. Swing中弹出对话框的几种方式(转)

    http://www.cnblogs.com/mailingfeng/archive/2011/12/28/2304289.html 在swing中,基于业务的考量,会有对话框来限制用户的行为及对用户 ...

  6. MapReduce(十五): 从HDFS阅读本文的源代码分析

    以Map任务读取文本数据为例: 1)   LineRecordReader负责对文件切割的定位,以及对读取每一行内容的封装供用户Map任务使用.每次在定位在文件里不为0的位置时,多读取一行,由于前一个 ...

  7. 实验数据结构——KMP算法Test.ming

    翻译计划     小明初学者C++,它确定了四个算术.关系运算符.逻辑运算.颂值操作.输入输出.使用简单的选择和循环结构.但他的英语不是很好,记住太多的保留字,他利用汉语拼音的保留字,小屋C++,发明 ...

  8. Solr在结果返回函数值

    如果你有一个服务,你的用户能够搜索不同的公司.用户输入一个简单的keyword,能够返回匹配keyword的公司,可是有一天,用户要求返回的公司列表中能够显示公司跟用户的距离,这是该怎么做呢? 1.如 ...

  9. NET开发者部署React-Native

    NET开发者部署React-Native 前情摘要 众所周知,有人说.net可以用Xamrian,呵呵,不习惯收费的好么?搞.Net的人设置一次java的环境变量,可能都觉得实在太麻烦了,可能是因为这 ...

  10. WebAPI通过multipart/form-data方式同时上传文件以及数据(含HttpClient上传Demo)

    简单的Demo,用于了解WebAPI如何同时接收文件及数据,同时提供HttpClient模拟如何同时上传文件和数据的Demo,下面是HttpClient上传的Demo界面 1.HttpClient部分 ...