Dictionary 如何重构Clojure源代码,尤其是重命名地图集合的关键字?

Dictionary 如何重构Clojure源代码,尤其是重命名地图集合的关键字?,dictionary,clojure,refactoring,rename,keyword,Dictionary,Clojure,Refactoring,Rename,Keyword,在开发Clojure项目时,有时会遇到一种情况:重命名地图集合的关键字有些困难 例如,如果我有一个由多个名称空间共享的映射集合。然后,这些名称空间将依赖于此映射集合的关键字,因为这些名称空间中定义的函数使用映射销毁语法。当我重命名此地图集合的关键字时,我肯定需要彻底检查这些名称空间 在这种情况下,有什么工具或有效的方法可以使用吗?如果您使用不合格的:x来表示40种不同的含义,然后决定重命名其中一种含义,这将是一个挑战。如果您没有(也不想)足够的测试用例来检测预期论点的丢失,那么这个挑战将成为一个

在开发Clojure项目时,有时会遇到一种情况:重命名地图集合的关键字有些困难

例如,如果我有一个由多个名称空间共享的映射集合。然后,这些名称空间将依赖于此映射集合的关键字,因为这些名称空间中定义的函数使用映射销毁语法。当我重命名此地图集合的关键字时,我肯定需要彻底检查这些名称空间


在这种情况下,有什么工具或有效的方法可以使用吗?

如果您使用不合格的
:x
来表示40种不同的含义,然后决定重命名其中一种含义,这将是一个挑战。如果您没有(也不想)足够的测试用例来检测预期论点的丢失,那么这个挑战将成为一个令人头痛的问题

下次,考虑指定(唯一的)命名空间限定的关键字,这些关键字将被广泛使用。替换是明确的,工具更可能使其自动化

一些语言特性可以帮助您重新编写代码,这取决于您决定重命名内容的范围

先决条件为您提供了一个对已分解的参数进行断言的位置(或者,如果您需要逐案判断是否成功,只需记录它)

纯函数允许您克隆一组代码,重命名克隆版本中的内容(或修改任何逻辑),然后并行运行两个版本,并断言它们得到相同的结果。例如,克隆函数
f
作为
f-1
f-2
,返工
f-2
,并重新编程
f
,因此它调用
f-1
f-2
,并断言结果相同。当他们同意时,你可以删除原件


使用内置的
clojure.test
(还有更详细的替代方案)测试非常简单。

下面的答案指出,如果关键字没有唯一的名称,甚至可能有唯一的名称,您应该使用名称空间的关键字。但另一种方式是:当您开始传递映射时,键隐式地是API的一部分,无论是内部的还是外部的,或者两者都是。据此设计。没有人喜欢API搅动器。