【问题标题】:How do you add a new argument to a pure function without having to update all calls to the function?如何在不更新对函数的所有调用的情况下向纯函数添加新参数?
【发布时间】:2018-01-25 04:07:08
【问题描述】:

我用一个输入参数创建了一个纯函数(js 中的示例,但问题不取决于语言)并在我的应用程序中调用它。

var day = 'Tuesday';
var doYouExist = function(you) {
    return !!you;
}

然后我意识到我应该只在星期二检查你是否存在,所以我决定更新函数...

var day = 'Tuesday';
var doYouExist = function(you) {
    if (day === 'Tuesday') {
      return !!you;
    }
}

但现在它不纯了。我可以添加 day 作为参数,但并非在所有调用 doYouExist() 的地方都可以使用 day 变量。

所以我的选择是:

  1. 使用不纯函数
  2. 将“day”注入到调用该函数的所有位置,然后更新该函数以及对该函数的每次调用以包含第二个参数。

到目前为止,我一直在使用选项 1,但我不知道函数式方法的推荐模式(或任何实际实现我想要的方式)。

【问题讨论】:

  • 非常有趣的问题。 (我对函数式编程很陌生,所以对我的评论持怀疑态度)。我想你不能。也许您已经找到了一个很好的例子来说明为什么命令式编程在某些方面胜过函数式编程。我猜想在选项 1 和选项 2 之间进行选择一方面与一个值如何在一个地方更改函数的能力有关,另一方面与函数式编程的安全性和明确性有关。我期待着阅读这个问题的答案。
  • 这让我想到了 Redux 中的 reducers。 Redux 中的 reducer 接受一个名为 state 的(额外)参数,它本质上包含一个大型 javascript 对象 (POJO) 中的所有应用程序状态。因此,一种(愚蠢的?)方法可能是通常将状态参数发送给可能依赖于全局状态的函数,然后在状态中包含当前日期之类的东西。
  • var day 是可变变量还是常量?
  • 如果day 是一个常数,你的函数仍然是纯的。您也可以将day 设为函数参数。
  • @P0lska 你误解了这个概念

标签: functional-programming refactoring purely-functional


【解决方案1】:

如果day 是一个常量,那么你不需要做任何事情,因为你的函数仍然是纯函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 2018-02-01
    • 2021-10-23
    • 1970-01-01
    • 2020-09-10
    • 2015-10-29
    • 2017-08-17
    • 2014-08-03
    相关资源
    最近更新 更多