Questions tagged «immutability»

5
如何在C#中的不可变对象之间建立循环引用?
在下面的代码示例中,我们有一个表示房间的不可变对象的类。北,南,东和西代表进入其他房间的出口。 public sealed class Room { public Room(string name, Room northExit, Room southExit, Room eastExit, Room westExit) { this.Name = name; this.North = northExit; this.South = southExit; this.East = eastExit; this.West = westExit; } public string Name { get; } public Room North { get; } public Room South { …

1
Redux内存消耗
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 3年前关闭。 Redux框架支持不变的状态/纯函数范式,该范式促进了根据当前操作从先前状态创建新状态。这种范例的适用性是毋庸置疑的。 我的一个主要问题是,由于Redux精简器急于为每个调用的每个动作从以前的状态返回新的新状态,因此,大量的内存消耗(不要与内存泄漏混淆)将在许多实际应用程序中屡见不鲜。 。考虑到Javascript应用程序通常可以在普通用户设备的浏览器中运行,而该浏览器也可以运行其他几个特定于设备的应用程序以及更多浏览器选项卡和窗口,那么节省内存的必要性就变得越来越明显。 有人真的将Redux应用程序的内存消耗与传统的Flux架构进行了比较吗?如果是这样,他们可以分享他们的发现吗?

8
如何确定数据对象类型是否应设计为不可变的?
我喜欢不可变的“模式”,因为它的优点,在过去,我发现设计具有不可变数据类型(某些,大多数甚至全部)的系统是有益的。通常,这样做的时候,我发现自己编写的bug更少,调试起来也容易得多。 但是,我的同龄人通常会避开一成不变。它们一点也不缺乏经验(远非如此),但是它们以经典的方式编写数据对象-私有成员,每个成员都有一个getter和setter。然后通常他们的构造函数不带参数,或者为了方便起见可以带一些参数。很多时候,创建对象是这样的: Foo a = new Foo(); a.setProperty1("asdf"); a.setProperty2("bcde"); 也许他们到处都这样做。也许他们甚至都没有定义使用这两个字符串的构造函数,无论它们多么重要。也许他们以后不再更改这些字符串的值,并且永远不需要更改。显然,如果这些事情是对的,那么将对象更好地设计为不可变的,对吗?(构造函数具有两个属性,根本没有二传手)。 您如何确定对象类型是否应设计为不可变的?有很好的判断标准吗? 我目前正在讨论是否将自己项目中的某些数据类型切换为不可变,但我必须将其证明给同龄人,并且这些类型中的数据可能会(很少)更改-那时您当然可以更改这是一成不变的方法(创建一个新方法,从旧对象复制属性,但要更改的属性除外)。但是我不确定这仅仅是我对不可变事物的热爱,还是对它们的真正需求。

8
不可变对象和DDD是否在一起?
考虑使用DDD的系统(同样:使用ORM的任何系统)。实际上,在几乎每个用例中,任何系统的重点都是操纵这些域对象。否则,就没有真正的效果或目的。 修改一个不可变的对象会导致该对象持久化后生成新记录,这会在数据源中造成巨大的膨胀(除非您在修改后删除了以前的记录)。 我可以看到使用不可变对象的好处,但是从这个意义上讲,我从来没有看到使用不可变对象的有用案例。这是错的吗?

4
在使用不可变对象时,是否有一种特定的设计策略可用于解决大多数“鸡与蛋”问题?
来自OOP背景(Java),我自己学习Scala。虽然我很容易看到单独使用不可变对象的优点,但我很难理解如何设计这样的整个应用程序。我举一个例子: 假设我有代表“材料”及其属性的对象(我在设计游戏,所以我实际上确实有这个问题),例如水和冰。我将拥有一个拥有所有此类材料实例的“经理”。一种特性是凝固点和熔点,以及材料冻结或融化的温度。 [编辑]所有的实例都是“单例”,有点像Java枚举。 我想让“水”说在0C时冻结成“冰”,而“冰”说在1C时熔化成“水”。但是,如果水和冰是不可变的,则它们不能作为构造函数参数相互引用,因为其中一个必须首先创建,并且不能将尚未存在的另一个作为构造函数参数进行引用。我可以通过给他们两个都提供给经理的参考来解决这个问题,以便他们每次查询冻结/融化属性时都可以查询它以找到他们需要的其他材料实例,但是随后经理之间也遇到了同样的问题和材料,它们需要相互引用,但是只能在构造函数中为它们之一提供引用,因此管理器或材料不能是不变的。 他们只是无法解决这个问题,还是我需要使用“功能”编程技术或其他某种模式来解决它?

7
不变的类在什么时候成为负担?
在设计用于保存数据模型的类时,我已经读过它对创建不可变对象很有用,但是到什么时候构造函数参数列表和深层副本的负担变得太大,您必须放弃不可变限制? 例如,这是一个不可变的类,用于表示命名的事物(我使用C#语法,但该原理适用于所有OO语言) class NamedThing { private string _name; public NamedThing(string name) { _name = name; } public NamedThing(NamedThing other) { this._name = other._name; } public string Name { get { return _name; } } } 可以构造,查询和复制已命名的事物到新的已命名事物,但是名称不能更改。 这一切都很好,但是当我想添加另一个属性时会发生什么呢?我必须向构造函数添加一个参数并更新副本构造函数;据我所知,这不是太多的工作,但是当我想使一个复杂的对象不可变时,问题就开始了。 如果该类包含可能包含其他复杂类的属性和集合,在我看来,构造函数参数列表将成为一场噩梦。 那么,什么时候一个类变得太复杂而无法改变呢?

2
我应该如何注释一个类在Java中是不可变的?
最近,我偶然发现了不可变对象的实用性,例如,如果将元素传递给构造函数并且类应该是不可变的,那么如果它们本身不是不可变的,则必须复制这些元素。 这需要对我的项目进行大量检查或了解,因为如果我有 public A(B foo) 而且B不是一成不变的,A我必须复制B。现在想象一下B似乎是不变的,但是它本身在构造函数中具有可变的类,依此类推。 如果类在Java中是不可变的,是否有记录的标准或最佳实践?看来@immutableJavadoc中没有关键字。 该@Immutable注解似乎有什么东西对汽车类生成完全不同的,而不是标准的Java的一部分。

4
功能范式与底层硬件是否过于分散,以至于总体上效率不高?
受到SO中一个问题的启发:https://stackoverflow.com/questions/6623391/how-to-gain-control-of-a-5gb-heap-in-haskell 关于FP的众多优点和缺点可能是一个漫长的辩论,但就目前而言,我想将FP 的范围缩小到现代硬件上FP的主要效率。 论文: 功能范式意味着不变性和无状态性(?),但是我们运行功能性程序的硬件是有状态的有限自动机。将“纯功能”程序转换为“有状态硬件”表示形式后,程序员几乎无法控制,带来了开销(?),并限制了硬件功能(?)的使用。 我在质疑的陈述中是对还是错? 是否可以证明FP确实/不暗示对现代通用计算机体系结构的主要性能损失? 编辑: 正如我已经在回答某些评论时所说的那样,问题不在于实现性能和细节。这与是否存在主要开销有关,在有状态自动机上运行FP可能会带来这些开销。


7
绕过不变性
我是面向对象编程的新手,一个需要我花一段时间才能掌握的概念是不变性。我认为昨晚灯泡熄灭了,但我想验证一下: 当我遇到无法更改不可变对象的声明时,我会感到困惑,因为例如,我可以执行以下操作: NSString *myName = @"Bob"; myName = @"Mike"; 在那里,我刚刚更改了不可变类型NSString的myName。我的问题是,“对象”一词可以指代内存中的物理对象,也可以指代“ myName”。前一个定义适用于不变性的概念。 对于变量,(对我而言)对不变性的更清楚的定义是,不变对象的值只能通过更改其在内存中的位置(即其引用(也称为指针))来更改。 这是正确的,还是我仍然迷失在树林中?

4
在以“功能”风格进行编程时,您是否在应用程序逻辑中编织了一个应用程序状态?
如何构建具有以下所有功能的系统: 对不可变对象使用纯函数。 只传递给它所需功能的数据,不再传递(即没有大的应用程序状态对象) 避免对函数使用过多的参数。 避免仅出于将参数打包和拆包到函数的目的而构造新对象的方法,只是避免将过多的参数传递给函数。如果我要将多个项目作为一个对象打包到一个函数中,则我希望该对象成为该数据的所有者,而不是临时构造的东西 在我看来,State monad违反了规则2,虽然它并不明显,因为它是通过monad编织而成的。 我觉得我需要以某种方式使用Lenses,但是关于非功能语言的文章很少。 背景 作为练习,我将现有的应用程序之一从面向对象的样式转换为功能样式。我要尝试做的第一件事是尽可能多地利用应用程序的内核。 我听到的一件事是,如何用一种纯函数式的语言来管理“状态”,而我相信这是由State monad完成的,从逻辑上讲,您称一个纯函数为“传递状态”。世界原样”,那么当函数返回时,它会返回给您变化后的世界状态。 为了说明这一点,您可以用一种纯粹的功能性方式来创建“ hello world”的方式有点像,您将程序的屏幕状态传递给程序,然后返回印有“ hello world”状态的屏幕状态。因此,从技术上讲,您要调用一个纯函数,并且没有副作用。 基于此,我遍历了我的应用程序,并且:1.首先将我的所有应用程序状态放入单个全局对象(GameState)中。2.其次,使GameState不可变。您无法更改。如果需要更改,则必须构造一个新的。我通过添加一个复制构造函数来做到这一点,该复制构造函数可以选择接受一个或多个已更改的字段。3.对于每个应用程序,我都将GameState作为参数传递。在函数内,在完成将要执行的操作后,它将创建一个新的GameState并返回它。 我如何拥有纯功能核心,以及外部的循环,该循环将GameState馈入应用程序的主工作流程循环。 我的问题: 现在,我的问题是,GameState有大约15个不同的不可变对象。最低级别的许多功能仅对其中一些对象起作用,例如保持得分。因此,假设我有一个计算得分的函数。今天,GameState传递给此函数,该函数通过使用新分数创建新的GameState来修改分数。 似乎有些错误。该功能不需要完整的GameState。它只需要Score对象。所以我更新了它以传递分数,并仅返回分数。 这似乎很有意义,所以我进一步介绍了其他功能。有些功能需要我从GameState传入2、3或4个参数,但是随着我一直在应用程序的外部核心中使用该模式,我传入了越来越多的应用程序状态。就像在工作流循环的顶部,我将调用一个方法,该方法将调用将调用一个方法的方法,依此类推,一直到计算分数为止。这意味着当前分数会通过所有这些层,只是因为最底层的函数将要计算分数。 所以现在我有了带有数十个参数的函数。我可以将这些参数放入一个对象中以减少参数数量,但是然后我希望该类成为状态应用程序状态的主位置,而不是在调用时简单地构造以避免重复传递的对象输入多个参数,然后解压缩它们。 所以现在我想知道我的问题是否是我的函数嵌套得太深了。这是因为希望具有较小的功能,所以我在一个功能变大时进行重构,然后将其拆分为多个较小的功能。但是这样做会产生更深的层次结构,即使外部函数未直接在这些对象上运行,传递给内部函数的所有内容也都必须传递给外部函数。 似乎只是在避免这种问题的过程中传入了GameState。但是我回到了原来的问题,即向函数传递比函数所需更多的信息。

3
是否可以有效地表示具有不变状态的对象图的突变?
我正在练习在C ++中使用不可变对象。我的个人目标是用不可变图序列表示通用对象图(在堆中)。 构建多版本图本身并不难。问题是性能。蛮力版本控制需要图形的完整副本,这是不可接受的。 我试图共享不变的节点。但是在这种情况下,我遇到了一个新问题。参考。对其他对象的引用必须在整个图中进行更新。每次派生新图版本时,都需要访问所有节点。并且这会使带有引用的节点发生变异,因此也应该派生它们(通过复制)。性能不会比暴力复制更好。 据我所能想象,没有真正有效的方法来表示具有不变状态的对象图的突变。因此,我希望对此有所想法。 是否可以用不变状态有效地表示对象图的变化?


4
函数式编程—不变性
我试图理解在FP中处理不可变数据的情况(特别是在F#中,但是其他FP也可以),并打破了全态思维(OOP风格)的旧习惯。所选答案的问题的一部分在这里重申,我周边的任何问题写起坐由状态表示在OOP中FP解决与不变的人搜索(对于例如:与生产者和消费者队列)。有任何想法或链接吗?提前致谢。 编辑:为了进一步澄清这个问题,不可变结构(例如:队列)将如何在FP中的多个线程(例如,生产者和消费者)之间并发共享

6
不变类型的缺点是什么?
当不希望更改类的实例时,我看到自己使用越来越多的不可变类型。它需要做更多的工作(请参见下面的示例),但是可以更轻松地在多线程环境中使用这些类型。 同时,即使可变性不会使任何人受益,我也很少在其他应用程序中看到不可变类型。 问题:为什么在其他应用程序中很少使用不可变类型? 这是因为编写不可变类型的代码时间更长, 还是我错过了某些东西,使用不可变类型时有一些重要的缺点? 现实生活中的例子 假设您是Weather从RESTful API 获得的: public Weather FindWeather(string city) { // TODO: Load the JSON response from the RESTful API and translate it into an instance // of the Weather class. } 我们通常会看到的是(删除新行和注释以缩短代码): public sealed class Weather { public City CorrespondingCity { get; set; } public …
12 c#  immutability 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.