函数参数过多怎么办?

Jir*_*esl 5 parameters refactoring clojure

我在 Clojure 中开发了一个系统。我尽量把它写成功能性的。一件事是引用透明度(对于相同的参数,函数应始终返回相同的结果)。

问题是一些函数(尤其是我的视图和部分控制器)获得了太多的参数(比如 5-6,未来可能更多)。

你会如何解决这个问题?

我看到了几个可能的解决方案,每个都有优点和缺点。

1)创建 ParameterMap - 将参数放入 Map 并使用架构(https://github.com/prismatic/schema)对其进行验证- 这是首选解决方案,但此解决方案的问题是我收到运行时错误而不是编译时错误(现在,当我忘记重构应用程序的某些部分时,由于 arity 不好,应用程序拒绝编译)

2)使用闭包——闭包可以捕获命名变量并等待其余的。它检查编译时间。这个解决方案很简单,但让我创建闭包只是为了将大量参数拆分为更多函数,我认为这是进行贫血设计的功能方式。这个解决方案类似于使用 monad,在这种情况下,似乎没有人认为在步骤中添加参数是不干净的,我不明白为什么。

3)将参数转换为命名参数- 我仍然会有大量参数,但它们不再不清楚,因为我可以第一眼看到它们的含义。我在应用程序的其他部分使用了这种方法并且它有效。不幸的是,这在运行时很容易出现 NullPointerException,并且不会在编译时检查。

Ray*_*yne 4

好吧,答案很大程度上取决于您的代码库,但很可能是所有这些因素的组合。

这不是选择其中之一的问题,而是选择最适合各种特定功能的方法。例如,您应该在闭包有意义的地方使用闭包,在有意义的地方使用命名参数,在有意义的地方使用映射。

如果您有一堆参数,并且将这些常见参数传递给多个函数,那么使用映射来包含它们并使其更清楚参数的实际内容可能确实有意义。