Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/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,如果我的项目使用的“person”贴图的形状为{:firstName:lastName:address},并且我想将该形状更改为{:name{:firstName:lastName}:address},我该如何帮助确保在使用这些对象的任何地方都进行了相应的更改 在Java中,这很简单,因为我还有person.firstName的任何地方都会发出编译错误。在Clojure中,我甚至可能不会得到运行时错误,而只是保存到服务器的坏数据。我假设不可能保证正确性,但除了细齿梳子之外还有什么呢?Clojur

如果我的项目使用的“person”贴图的形状为
{:firstName:lastName:address}
,并且我想将该形状更改为
{:name{:firstName:lastName}:address}
,我该如何帮助确保在使用这些对象的任何地方都进行了相应的更改


在Java中,这很简单,因为我还有person.firstName的任何地方都会发出编译错误。在Clojure中,我甚至可能不会得到运行时错误,而只是保存到服务器的坏数据。我假设不可能保证正确性,但除了细齿梳子之外还有什么呢?

Clojure有提供数据定义和验证的库。例如,您可以使用


关于编译时错误和运行时错误的难度……好吧,这个问题不是Clojure独有的。引用John Carmack的话:“lisp的挑战是让你的程序运行,Haskell的挑战是让它编译。”

我同意@noahlz-如果你真的想确定,你必须使用他建议的库。的确,使用映射进行大规模重构可能是个问题

话虽如此,如果您使用一个带有构造函数的记录来创建您的
(并且仍然保留了地图的优点),您可以稍微提高您的机会:


现在这个例子在运行时捕捉到了这个问题,它显然只在一些简单的情况下有用。但是静态分析工具也会在开发时发现这个错误(例如:Culjress插件,比如对于因特利利可用的草书)。

如果你想要编译时错误,你也可以考虑使用<代码>核心。类型化的< /代码>。给出的答案是好的,但我会注意到,在这种情况下,在一个好的程序员编辑器中熟悉正则表达式搜索和替换可能非常有用。如果正则表达式不够灵活,并且您有一个庞大的代码库,那么甚至可以用您最喜欢的语言编写一个文本操作脚本来进行字符串操作。或者你甚至可以使用Clojure。毕竟,它非常擅长读取Clojure源代码,而Clojure宏擅长重写Clojure源代码。这一切都取决于需要重构多少代码。
(defrecord Person [name address])

;; Okay. No problem
(def scott (->Person {:firstname "Scott" :lastname "Lowe"}
                     "23 Hope Street, Edinburgh"))
;; But then...
(def scott (->Person "Scott"
                     "Lowe"
                     "23 Hope Street, Edinburgh"))
;; Boom!
ArityException Wrong number of args (3) passed to: user/eval990/->Person--1005