Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 不变的数据结构-应用程序维护_Clojure_Reactjs_Immutability - Fatal编程技术网

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

Clojure 不变的数据结构-应用程序维护,clojure,reactjs,immutability,Clojure,Reactjs,Immutability,我一直在读关于不可变数据结构的书,并且了解到变化检测变得很容易。我经常听说,它使应用程序维护更加简单,并提供了一个易于理解的编程模型。 我需要帮助来理解它简化工作的方式。Clojure社区已经接受了不变性,这让我大开眼界。我所能做的就是把你送到消息来源:和他的谈话。Rich解释了如何将变量的概念分为三个不同的概念:标识、状态和值,从而帮助您对系统进行建模并对其进行推理 它可以归结为:在您的编程模型中,您应该只允许在您试图建模的系统中发生变化的情况发生变化。否则,将移动部件(可变变量和对象)添加到

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

Clojure社区已经接受了不变性,这让我大开眼界。我所能做的就是把你送到消息来源:和他的谈话。Rich解释了如何将变量的概念分为三个不同的概念:标识、状态和值,从而帮助您对系统进行建模并对其进行推理

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


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

与命令式语言相比,函数式语言更倾向于采用不变性,即使您可以使用限制可变性的Java编程风格(请参阅)。也就是说,我将只对[功能性/不变性]和[对象/可变性]进行评论

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

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

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

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

然后,问题就变成了:是否有一种范式(功能性/不变性、面向对象/易变性)能够实施更好的设计和更好的代码。我的感觉是,函数式语言是计算机科学的热土,OTOH OOP更为主流。这不是因为OOP更容易理解,还是仅仅是教育的问题?但是,为了长期维护一个系统,我们应该选择一个“聪明”的功能环境,很少有人能够处理它,还是一些主流的OO技术——它的不安全性或允许性——但很多人对它有所了解

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