Clojure的重构技术

mik*_*era 26 refactoring clojure

我熟悉在C#和Java中重构相当大的代码库,但Clojure是一个不同的野兽,特别是因为它:

  • 在典型代码中混合使用宏和函数(即您可能希望从宏重构为函数,反之亦然?)
  • 在大多数情况下使用动态类型(因此您不会对重构代码的正确性进行编译时检查)
  • 功能而不是面向对象的风格
  • 对当前IDE中的重构支持较少
  • 对代码库中的循环依赖性不太宽容(使得更难移动代码/定义块!)

鉴于上述情况,在Clojure中进行代码重构的最佳方法是什么?

Art*_*ldt 8

"有效地使用遗留代码"中, Michael Feathers建议添加单元测试以在代码中创建人为的"拐点",您可以重新考虑它们.

关于为非结构化代码添加顺序的方法的超级简短且完全不完整的概述:

  • 将代码分为"Legacy"(无测试)和其余部分.
  • 创建一个测试
  • 两半重演.

递归方法似乎与我在思考Clojure时使用的心理过程非常吻合,所以我来联想它们.甚至新语言都可以拥有遗留代码吗?

这是我在阅读那本书的同时考虑到clojure时得到的.所以我希望它作为一般指导方针是有用的.也许你的代码库已经有了很好的测试,在这种情况下你已经超出了这个阶段.


Chi*_*ron 6

我不是专家.但无论如何:

  • 远离God职能.如果你有一个很大的功能,那就把它分解成更小的函数,每个函数都做一件事,而且它做得很好.
  • 如果您发现Java数组的使用(并且没有必要使用它们),请将它们转换为Clojure序列.
  • 拥抱defrecorddefprotocol.
  • 远离宏,除非你没有写宏而无法继续.
  • 如果可能的话,赞成延迟序列而不是递归.
  • 创建服务时,将契约放在其自己的命名空间中,并将实现放在其自己的命名空间中.
  • 实现依赖注入,将函数作为参数传递给另一个函数.
  • 在可能的情况下对函数的arglist使用desctructuring.这将使得更容易理解函数的实现.
  • 考虑使用Prismatic Sc​​hema项目.

另外,看看CursiveClojure.我认为这很有希望.

我不是CursiveClojure的创造者.