2015-05-29 89 views
7

如果我的项目使用形状为{:firstName :lastName :address}的“人物”地图,并且我想将该形状更改为{:name {:firstName :lastName} :address},我该怎么做才能确保我在这些地方进行了相应的更改对象被使用?在Clojure中重构时的结构正确性

在Java中,它的简单,因为无论我仍然有person.firstName会发出一个编译错误。在Clojure中我可能甚至没有得到一个运行错误,但只是坏的数据保存到服务器上。我认为这是不可能的保证的正确性,但除了细齿梳之外还有什么?

+1

如果你想编译时错误,你也可以考虑使用'core.typed'。 –

+0

已经给出的答案是好的,但我会注意到,这可能是一种情况,熟悉正则表达式搜索和替换在一个好的程序员的编辑器中可能是非常有用的。如果正则表达式不够灵活,而且代码库很大,那么甚至可以使用您喜欢的语言编写字符串操作的文本操作脚本。或者你甚至可以使用Clojure。毕竟,它非常擅长阅读Clojure源代码,而Clojure宏则擅长重写Clojure源代码。这完全取决于你需要重构多少代码。 – Mars

回答

6

Clojure有提供数据定义和验证的库。例如,你可以使用https://github.com/Prismatic/schema

关于编译时间与运行时错误的难度......嗯,这个问题是不是唯一的Clojure。引用John Carmack的话:“Lisp的挑战是让程序运行,Haskell的挑战在于让它编译。”

4

我同意@noahlz - 如果你想成为真正知道的话,你将不得不使用图书馆像他建议之一。大的重构与地图可以是一个问题,这是真的。

说了这么多,你可以稍微改善你的机会,你的情况,如果你使用的记录,其构造函数来创建person(并仍然保留有关地图的好东西):

(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 

现在这示例在运行时捕获该问题,并且它显然仅在一些简单情况下有所帮助。但是静态分析工具在开发时也会遇到这个bug(例如:可用于IntelliJ的Cursive之类的Clojure插件)。