Functional programming 参考透明度/功能纯度是最佳实践还是取决于偏好?

Functional programming 参考透明度/功能纯度是最佳实践还是取决于偏好?,functional-programming,referential-transparency,Functional Programming,Referential Transparency,我想知道,对于函数纯度是否被视为最佳实践,或者是否取决于偏好或编程风格,是否存在共识。换言之,这是一个争论的话题,还是一个有效的决定?我所能找到的所有信息都表明这是一种没有缺点的美德。这是真的吗 我想为我们当地的实践社区编制一份最佳实践列表,我想知道这应该包括在多大程度上。最好避免突变和其他副作用,就像最好避免goto一样。也就是说,在某些情况下,它是有用的,但通常情况下,它可以被消除,并被更结构化的解决方案取代,而不会有太多困难 当然,这在很大程度上取决于您使用的语言和库。没有副作用的编程在不

我想知道,对于函数纯度是否被视为最佳实践,或者是否取决于偏好或编程风格,是否存在共识。换言之,这是一个争论的话题,还是一个有效的决定?我所能找到的所有信息都表明这是一种没有缺点的美德。这是真的吗


我想为我们当地的实践社区编制一份最佳实践列表,我想知道这应该包括在多大程度上。

最好避免突变和其他副作用,就像最好避免goto一样。也就是说,在某些情况下,它是有用的,但通常情况下,它可以被消除,并被更结构化的解决方案取代,而不会有太多困难

当然,这在很大程度上取决于您使用的语言和库。没有副作用的编程在不是为它设计的语言(即几乎所有主流语言)中非常不方便

独立于特定的语言约束,也可能存在可变数据结构或命令式算法的情况,如果不改变big-O复杂度类,它们很难被函数式结构或命令式算法替代。在大多数相关案例中,好的解决方案现在已经为人所知,但有时它们是棘手的,在某些情况下,是积极的研究


总之,你可以在不失去纯度的情况下产生副作用。参见例如Haskell的单子使用。

一般来说,您应该减少代码中无意的复杂性。这是无可争议的

降低复杂性的最佳方法之一是限制代码中的信息通道——即信息从一个组件“泄漏”到另一个组件的方式。这使您的代码更简单、更模块化、更易于测试、更易于使用和维护

根据定义,可变变量和其他副作用是信息通道,与通常的函数参数和结果通道相比,是相对“隐藏”的。使用它们的代码就像一个筛子,信息通过可变变量以暂时的、时间相关的方式在代码中泄漏

全局可见的可变变量是最糟糕的,因为它们(可能)会在整个代码库中泄漏信息,增加了许多复杂的信息通道需要管理。局部范围可变变量最多只泄漏几行的时间信息。你应该避免前者,小心后者


因此,在最小化复杂性和增加模块化的目标中,您应该避免泄漏的副作用,因为它们会以不必要的复杂性污染代码。避免可变变量和其他副作用是一个很好的经验法则。

@MarcB为什么这是一个糟糕的问题?我读了《不问规则》;然而,这似乎是确定的(不是一个开放的或主观的问题)。有没有共识?@MarkB所以,没有解释为什么会关闭?因为这个问题显然没有违反你链接中的任何规则…
没有实际问题需要解决:“我很好奇别人是否喜欢我。”
@MarcB,与规则中引用的示例相比,我的问题并不缺少问题。我不是在鼓吹无聊的谈话;我想问的是,是否有权威性的研究、文献等针对某一特定事项的特定目的。这个确定性问题的答案是隐式问题的解决方案,就像SO中许多其他正确的开放性问题一样。然而,我详细阐述了我的问题的细节,尽管它们对找到答案毫无帮助。我欣赏你答案中的细节——可以安全地将你的答案概括为“对于功能纯度是否在所有情况下都是一种美德没有共识”吗?在大多数情况下,对于最常见的语言(即那些不具有功能性的语言),函数纯度甚至是一个很好的经验法则?我正试图将你的答案与我的问题的上下文联系起来。最终,代码应该是干净和简单的。如果不纯的解决方案在手边的语言中要简单得多,那么它们更可取。所以,实际上,纯洁不是一种无条件的美德,也不是不考虑上下文的美德。谢谢。就我个人而言,我发现这一评论是对你官方答案的宝贵总结。考虑把它编辑成你的答案吗?不管怎样,我还是接受了你的答案。再次感谢。你的回答很有道理,我倾向于同意;然而,你的结论是否有争议?你知道目前你可以链接到的任何权威讨论吗?或者有任何文献表明你的经验法则结论得到了专业团体权威的支持?基本上,我想知道这在多大程度上值得讨论,因为我想把它作为公司的指导方针,我想知道当局在这方面支持的程度如何?