【问题标题】:Is referential transparency/functional purity a best practice or does it depend on preference? [closed]参考透明度/功能纯度是最佳实践还是取决于偏好? [关闭]
【发布时间】:2012-11-26 15:36:35
【问题描述】:

我想知道对于功能纯度是否被认为是最佳实践,或者它是否取决于偏好或编程风格是否存在共识。换句话说,这是有争议的,还是有效地确定了?我能找到的所有信息都表明这是一种没有缺点的美德。这是真的吗?

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

【问题讨论】:

  • @MarcB 为什么这是个坏问题?我阅读了不问规则;但是,这似乎是确定性的(不是开放式或主观问题)。有没有共识?
  • @MarkB 所以,没有解释为什么关闭?因为这个问题显然没有违反您链接中的任何规则......
  • there is no actual problem to be solved: “I’m curious if other people feel like I do.”
  • @MarcB,与规则中引用的示例相比,我的问题并不缺乏问题。我不是在鼓吹无谓的谈话;我在问是否有针对特定目的的特定问题的权威研究、文献等。这个确定性问题的答案是对隐含问题的解决方案,就像 SO 中的许多其他正确开放的问题一样。然而,我详细阐述了我的问题的细节,尽管它们对寻找答案没有任何帮助。

标签: functional-programming referential-transparency


【解决方案1】:

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

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

独立于特定的语言约束,也可能存在在不改变 big-O 复杂度类的情况下难以用函数式结构替代的可变数据结构或命令式算法的情况。在大多数相关情况下,目前都知道好的解决方案,但有时它们很棘手,在某些情况下,需要积极研究。

总而言之,您可以在不失去纯度的情况下产生副作用。参见例如Haskell 对 monad 的使用。

【讨论】:

  • 我很欣赏您回答中的细节-将您的回答总结为“对于功能纯度是否在所有情况下都是美德没有共识”是否安全?您是否会说在大多数情况下,对于最常见的语言(即那些并非设计为功能性的语言)来说,功能纯度甚至是一个很好的经验法则?我正在尝试对您的答案进行分类以适应我的问题。
  • 最终,代码应该简洁明了。如果不纯的解决方案在手头的语言中明显更简单,那么它们是可取的。所以务实地说,纯洁不是无条件的美德,也不考虑上下文。
  • 谢谢。就个人而言,我发现该评论是对您的官方答案的有价值的总结。考虑将其编辑到您的答案中吗?无论如何,我 +1 了你的答案并接受了。再次感谢。
【解决方案2】:

作为一般规则,您应该减少代码中无意的复杂性。这是无可争议的。

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

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

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

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

【讨论】:

  • 你的回答很有道理,我倾向于同意;但是,您的结论是否存在争议?您是否知道当前可以链接到的任何权威讨论?或者有任何文献表明你的经验法则结论得到了专业界权威的支持?基本上,我想知道这在多大程度上值得讨论,因为我想把它作为公司的指导方针,我想知道当局在多大程度上支持这件事?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多