Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
clojure中的数据格式安全_Clojure - Fatal编程技术网

clojure中的数据格式安全

clojure中的数据格式安全,clojure,Clojure,来自Java背景的我非常喜欢静态类型安全,并且想知道clojure程序员如何处理数据格式定义的问题(可能不仅仅是类型,而是一般不变量,因为类型只是其中的一个特例) 这类似于一个现有的问题“Clojure中的类型安全”,但其中一个问题更侧重于如何在编译时检查类型,而我更感兴趣的是如何实际解决这个问题 作为一个实际的例子,我正在考虑一个处理特定文档格式的编辑器应用程序。每个文档由多种不同的元素(图形元素、字体元素等)组成。不同元素类型的编辑器,当然还有将文档转换为本地磁盘格式的字节流的功能 我感兴趣

来自Java背景的我非常喜欢静态类型安全,并且想知道clojure程序员如何处理数据格式定义的问题(可能不仅仅是类型,而是一般不变量,因为类型只是其中的一个特例)

这类似于一个现有的问题“Clojure中的类型安全”,但其中一个问题更侧重于如何在编译时检查类型,而我更感兴趣的是如何实际解决这个问题

作为一个实际的例子,我正在考虑一个处理特定文档格式的编辑器应用程序。每个文档由多种不同的元素(图形元素、字体元素等)组成。不同元素类型的编辑器,当然还有将文档转换为本地磁盘格式的字节流的功能

我感兴趣的基本问题是,编辑器和读/写函数必须就通用数据格式达成一致。在Java中,我将文档的数据建模为对象图,例如,一个类表示一个文档,每个元素类型一个类。这样,我就可以在编译时保证数据的结构是什么样的,并且图形元素的字段“宽度”是整数而不是浮点。它不保证宽度为正-但是使用getter/setter接口将允许相应的类添加这样的不变保证

能够依赖于此,可以使处理此数据的代码更简单,并且可以在编译时或运行时早期捕获格式冲突(其中一些代码尝试修改可能违反不变量的数据)

如何在Clojure中实现类似的“数据格式可靠性”?据我所知,没有办法执行编译时检查,而且在函数接口后面隐藏域数据似乎被认为是非惯用的(或者我可能误解了?),那么Clojure开发人员如何才能对传递到其函数中的数据格式感到安全呢?当“保存”功能注意到由于编辑器错误而在字体列表中存在图形元素时,如何让代码尽快出错,而不是在用户编辑了20多分钟并尝试保存到磁盘之后


请注意,我对Clojure和learning很感兴趣,但还没有用它编写任何实际的软件,所以我可能只是感到困惑,答案很简单——如果是的话,很抱歉浪费了您的时间:)。

我认为使用验证API来构造和操作数据(如下所示)没有任何错误或不规范之处

(defn text-box [text height width]
  {:pre [(string? text) (integer? height) (integer? width)]}
  {:type 'text-box :text text :height height :width width})

(defn colorize [thing color]
  {:pre [(valid-color? color)]}
  (assoc thing :color color))

... (colorize (text-box "Hi!" 20 30) :green) ...

此外,引用(vars、refs、atoms、agents)可以有一个关联的变量,可以用来确保始终处于有效状态。

好问题-我还发现,从静态类型的语言到动态类型的语言需要更加关注类型安全。幸运的是,TDD技术在这方面帮助很大

我通常编写一个“验证”函数,用于检查您对数据结构的所有假设。我经常在Java中这样做是为了不变的假设,但在Clojure中,这更重要,因为您还需要检查thinks-like类型

然后,您可以通过以下几种方式使用验证功能:

  • 在REPL:
    (validate foo)
  • 在单元测试中:
    (is(验证(来自模板abc的新foo))
  • 作为关键功能的运行时检查,例如检查
    (读取foo some foo输入流)
    是否有效

如果您有一个复杂的数据结构,它是由多个不同组件类型组成的树,那么您可以为每个组件类型编写一个验证函数,并为整个文档调用验证函数,从而递归地验证每个子组件。一个很好的技巧是使用协议或多种方法使验证函数对每种组件类型都具有多态性。

感谢您迄今为止的回答。因为这是一个相当开放的问题,所以我会再等一会儿再接受。validator函数听起来像是一个有趣的解决方案,但是(继续使用示例)如果您有一个大文档作为您的状态,那么每次进行一个小的更改时完全验证它似乎是低效的-在这样的模型中,我想使用验证操纵函数更可取。