【发布时间】:2014-03-17 16:16:08
【问题描述】:
我在 Clojure 中开发了一个系统。我尽量把它写得尽可能实用。其中之一是引用透明性(对于相同的参数,函数应该始终返回相同的结果)。
问题是某些函数(尤其是我的视图和部分控制器)获得了太多 args(比如 5-6 并且将来可能更多)。
你会如何解决这个问题?
我看到了几个可能的解决方案,每个都有优点和缺点。
1) create ParameterMap - 将参数放入 Map 并使用模式 (https://github.com/prismatic/schema) 验证它 - 这是首选解决方案,但此解决方案的问题是我得到运行时错误而不是编译时错误错误(现在应用程序拒绝编译,因为当我忘记重构应用程序的某些部分时,arity 不好)
2) 使用闭包 - 闭包可以捕获命名变量并等待其余的。它检查编译时间。这个解决方案很简单,但让我创建闭包只是为了将大量参数拆分为更多功能,我认为这些功能就像功能性方式来进行贫血设计。这个解决方案类似于使用 monad,似乎没有人认为在步骤中添加参数是不干净的,我不明白为什么。
3) 将参数转换为命名参数 - 我仍然会有大量参数,但它们不再不清楚,因为我一眼就能看出它们的含义。我在应用程序的其他部分使用了这种方法并且它有效。不幸的是,这很容易在运行时出现 NullPointerException,并且不会在编译时检查。
【问题讨论】:
标签: parameters clojure refactoring