问题标签 [immutability]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 如何设计具有复杂初始化的不可变对象
我正在学习 DDD,并且遇到了“价值对象”应该是不可变的声明。我了解这意味着对象状态在创建后不应更改。这对我来说是一种新的思维方式,但在很多情况下都是有意义的。
好的,所以我开始创建不可变的值对象。
- 我确保他们将整个状态作为构造函数的参数,
- 我不添加属性设置器,
- 并确保不允许任何方法修改内容(仅返回新实例)。
但现在我想创建这个包含 8 个不同数值的值对象。如果我创建一个有 8 个数字参数的构造函数,我觉得它不会很容易使用,或者更确切地说 - 在传递数字时很容易出错。这不可能是好的设计。
所以问题是:是否有任何其他方法可以使我的不可变对象变得更好.. 可以在 C# 中完成任何魔术来克服构造函数中的长参数列表?我很想听听你的想法。。
更新:在任何人提到它之前,这里已经讨论了一个想法: C# 中的不可变对象模式 - 你怎么看?
不过,有兴趣听到其他建议或意见。
language-agnostic - 函数式编程:不变性等
我最近问了一个关于函数式编程的问题,并收到了(好!)答案,引发了更多问题(有时似乎是学习的情况)。这里有几个例子:
一个答案提到了不可变数据结构的优势:每个线程都可以拥有自己的副本。现在,对我来说,这听起来更像是一个版本控制系统(打个比方),不是锁定某人已签出的代码以使其无法被其他任何人修改,而是每个人都可以签出自己的副本。听起来不错。但是,在 VCS 中,您有“合并”更改的概念,以防两个人更改相同的内容。看起来这个问题肯定会出现在多线程场景中......那么当线程看到最新数据很重要时,如何“合并”?
这个答案谈到了在对象的循环中执行操作的情况,以及如何每次都使用新对象而不是更新旧对象。但是,假设
bankAccount
在非循环场景中更新 - 例如 GUI 银行系统。操作员单击“更改利率”按钮,该按钮会触发一个事件(例如在 C# 中)执行类似bankAccount.InterestRate = newRateFromUser
. 我觉得我在这里很密集,但希望我的例子是有道理的:必须有某种方式来更新对象,对吧?其他几件事可能取决于新数据。
无论如何,如果你能帮助我理解范式转变,我将不胜感激。我记得在简单的程序命令式编码方法的背景下学习 OOP 时,我的大脑经历了类似的“愚蠢阶段”。
.net - 字符串不变性
字符串不变性是通过语句起作用,还是通过语句中的字符串起作用?
例如,我了解以下代码将在堆上分配两个字符串。
"hello" 将保留在堆上,直到垃圾收集;并且 s 现在引用“hello world!” 在堆上。但是,以下行在堆上分配了多少个字符串...1 或 2?另外,是否有工具/方法来验证结果?
c# - 在 C# 中实现只读(不可变)对象接口
我的目标是确保在大多数情况下,对象是通过作为完整接口子集的“只读接口”使用的。
- 例如,如果我使用 C++,我将只返回一个
const
对象。 - 在 C# 中,如果我可以通过接口实现这一点,我只会实现一个只读接口并在任何地方使用它。但是,我需要运算符重载,这对于接口是不允许的。这就是为什么我必须使用抽象基类。
- 但是如果我定义了一个抽象基类,我就不能改变派生类型的可访问性。
那么,如何在 C# 中实现我的目标?
java - 如何在Java中获得等效的c ++常量指针?
当我将不可变类型对象(String, Integer,..) 作为 final 传递给方法时,我可以实现 C++ 常量指针的字符。但是我怎样才能在可变对象中强制执行这种行为呢?
我想要的只是防止 someMethod 修改 someObject 的状态而不对 someType 进行任何更改。这可能吗?
ruby - Ruby - 不可变对象
我有一个用 Ruby 编写的高度多线程的应用程序,它共享一些实例变量。对这些变量的写入很少 (1%),而读取非常常见 (99%)。确保这些线程始终看到所涉及的最新值的最佳方式是什么(在您看来或以惯用的 Ruby 方式)?到目前为止,这是我的一些想法(尽管在我大修之前我希望得到您的意见):
- 在读取或写入任何这些变量之前拥有一个最常用的锁(来自Java Concurrency in Practice)。这样做的缺点是它
synchronize
在我的代码中放置了很多块,而且我没有看到一个简单的方法来避免它。 - 使用 Ruby 的
freeze
方法(请参阅此处),尽管它看起来同样繁琐,并且没有给我任何第一个选项所提供的同步优势。
这些选项看起来都非常相似,但希望那里的任何人都会有一个更好的想法(或者可以为其中一个想法辩护)。我也可以使对象不可变,这样它们就不会在操作过程中被破坏或改变,但是我对 Ruby 的了解不够,无法自己进行调用,这个问题似乎认为对象是高度可变的。
c# - 为什么可变结构是“邪恶的”?
在关于 SO 的讨论之后,我已经多次阅读了可变结构是“邪恶”的评论(就像在这个问题的答案中一样)。
C# 中的可变性和结构的实际问题是什么?
c# - 为什么 C# 不允许只读局部变量?
与同事就这件事进行了友好的辩论。我们对此有一些想法,但想知道 SO 人群对此有何看法?
ruby - 如何测试 Ruby 对象是否不可变?
有没有一种简单的方法来测试一个对象是否是不可变的(数字,零)(数组,哈希,对象)?换句话说,它会被其他代码的副作用改变吗?
动机:我想创建一个版本化的值存储,但有些数据是数组。一些数组将存储自定义对象,我可以通过存储“in”属性并搜索它来反转关系。但我也希望能够存储符号数组、其他数组等。
functional-programming - 如何编写一个不改变状态的应用程序(用函数式语言)?
我想有一天学习函数式编程,但我不明白除了简单的数学之外,我怎么能用它来做任何事情。
例如:一个简单的网络浏览器添加书签功能需要引起某种突变,以便下次用户单击书签时,新书签会出现在列表中。