gpt4 book ai didi

clojure - Clojure 中的数据格式安全

转载 作者:行者123 更新时间:2023-12-03 00:26:20 27 4
gpt4 key购买 nike

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

这类似于现有的问题“Clojure 中的类型安全”,但该问题更关注如何在编译时检查类型方面,而我更感兴趣的是如何务实地解决问题。

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

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

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

如何在 Clojure 中实现类似的“数据格式可靠性”?据我所知,没有办法执行编译时检查,并且将域数据隐藏在函数接口(interface)后面似乎不被鼓励,因为不符合习惯(或者也许我误解了?),那么 Clojure 开发人员应该做什么才能感到安全传递给它们的函数的数据格式?当保存函数注意到字体列表中存在图形元素时,如何让代码尽快出错,而不是在用户编辑了 20 分钟以上并尝试保存到磁盘之后编辑器错误?

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

最佳答案

我不认为使用验证 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) ...

此外,引用(变量、引用、原子、代理)可以有关联的 validator function可用于确保始终有效的状态。

关于clojure - Clojure 中的数据格式安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9242153/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com