不可变数据结构 - 应用程序维护

Immutable Data Structure - Application maintenance

我一直在阅读有关不可变数据结构的内容,并且了解到更改检测变得很容易。我经常听说它使应用程序维护更简单,并提供易于理解的编程模型。 我需要帮助来理解它简化工作的方式。

Clojure 社区已经接受了不可变性,这令人大开眼界。我能做的最好的事情就是将您发送到来源:Rich Hickey's essay on State and his talk The Value of Values。 Rich 解释了如何将变量的概念分为三个不同的概念:标识、状态和值可以帮助您对系统建模并对其进行推理。

归结为:在您的编程模型中,您应该只允许在您尝试建模的系统中发生变化的情况发生变化。否则,您会将移动部件(可变变量和对象)添加到不需要它们的模型中。这使得模型更难理解(特别是随着时间的推移),但几乎没有或根本没有好处。

即使阅读有帮助,理解这一点的唯一方法是使用一种将不变性作为默认值的语言进行编程,直到您意识到您建模的大多数系统实际上只有少数几个变化而不是页面变化和可变变量的页面。

不变性在函数式语言中肯定比在命令式语言中更受欢迎,即使您可以使用 Java 限制可变性的编程风格(参见 this for immutability in Java)。也就是说,我只会评论 [functional/immutability] 和 [object/mutability].

我是 Clojure 粉丝,发现函数式编程非常强大,但是...

可能是我在 C++Java 上花的时间太多,而在 LispClojure 上花的时间不够,但我认为 更简单的维护说法还有待事实证明。我不确定是否有关于大型生产系统实际维护成本的可靠调查以及所用技术和相关成本的数据。

当然,就LOC而言,Clojure这样的语言确实比Java更加专注和简洁。因此你可以说更少的代码导致更少的维护,但我认为函数式风格提供了真正更紧凑的代码,与更冗长但有点直接的命令式风格相比,需要非常集中注意力才能完全理解函数的作用。与不变性相关的函数式编程的一大优势是能够隔离一个函数并对其进行试验,而无需拖拽大量的卫星对象上下文或构建一堆模拟,这在 OO 语言中很常见。撇开实验不谈,纯函数不会修改其参数,这 减轻了人们对无意中破坏函数范围之外的某些代码的恐惧

但是,抛开functional/immutability相对于oop/mutability的优点,在维护方面,我的经验让我认为主要问题不是技术,而是设计,代码质量和此代码随时间的演变,即使最初的代码质量很好。 "good",我的意思是代码尊重样式约定(如基本命名),管理复杂性,并在连续(或至少自动化)构建环境中具有合理的测试工具。

那么,问题就变成了:是否有一个范例(functional/immutability,object-oriented/mutability)强制执行更好的设计和更好的代码。我的感觉是函数式语言是计算机科学爱好者的领地,OTOH OOP 更为主流。难道不是因为 OOP 更容易 理解或者不仅仅是教育问题吗?但是,为了在长期 运行 中维护一个系统,应该选择一个 "clever" 很少有人能够解决它的功能环境,还是一些主流的 OO 技术 - 具有不安全性或宽容性 -但很多人对此有所了解?

当然,解决方案是选择合适的技术(复数)和合适的、有动力的人...