我应该如何将我的Clojure系统划分为可变/不可变的部分?

时间:2011-01-02 15:57:53

标签: clojure

将Clojure应用程序划分为不可变部分时,下列哪项是有意义的?

  • 将可变/不可变部分分成不同的名称空间
  • 为具有副作用的defns添加前缀
  • 使用Clojure“doc”来解释此
  • 根据需要混合搭配

我需要知道这一点,因为我有一个Clojure应用程序,它与数据库,应用程序服务器和有状态的Web框架进行对话,所以我希望我的应用程序尽可能易于维护/阅读

2 个答案:

答案 0 :(得分:3)

一些对我有用的技巧:

  • 按模块/目的划分命名空间和文件,而不是其他任何东西。这更具逻辑意义,可帮助您保持设计和依赖关系的清洁。
  • 使用“!”表示具有副作用的功能,例如“交换!”。通常你应该尽可能地避免副作用,所以如果你经常看到这种情况,这有点像设计气味
  • 尽量避免库/实用程序函数中的任何可变状态。这不仅通常会为您提供更好的API设计,而且测试也更容易....
  • 将特定于应用程序的可变状态保存到少量顶级定义中。例如,可以使用单个顶级引用来存储不可变的映射来存储所有可变数据
  • 使用可以剪切并粘贴到REPL中的示例进行文档记录是有帮助的,这样您就可以快速测试或自定义更复杂的用例。如果一切都是纯粹的话,这也会更容易。

答案 1 :(得分:2)

以下是我的方法:

  1. 除非您正在编写集合库或类似的东西,否则不要根据可变性/不可变性来划分名称空间。使用命名空间来指示代码的逻辑分区,例如uicoreutil等。
  2. 默认情况下保持所有函数纯,因此默认情况下不使用任何前缀。状态通常应存储在refatom中定义为def s。使用表示完整性的名称,例如userNameStore
  3. 记录所有内容,所有功能和变量。或至少是公众的。
  4. 混合搭配,但不要在临时基础上这样做。清楚地构建代码,以便可变状态受到限制并且很好地集中。