问题标签 [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# - 在 .NET 中跨 AppDomain 移动对象
有没有办法在 AppDomain 之间有效地共享或移动 .NET 对象?我意识到 AppDomains 的目的是提供隔离 - 但是我有一个案例,我需要移动一组相对较大的缓存不可变对象,这些对象的计算和创建成本很高。目前,我有一种有效的序列化方法,但速度相当慢。
c# - 更好的多线程:单个函数或集合函数
我不知道我的措辞是否正确,但举个简单的例子,假设我们有一个 Point3 值的集合(比如 1M)。
我们有一个名为 Offset 的方法,它在这些值上添加另一个 Point3 值,返回新的 Point3 值。假设该方法是静态的。
Point3 类型是不可变的。
问题是,我应该有这样的方法:
或者
对我来说,#1 似乎是将任务分解为不同线程的单独任务的更好选择。
你怎么看?#1 或 #2 的优势是什么?
language-agnostic - Allen Holub 写道“你永远不应该使用 get/set 函数”,对吗?
艾伦·霍鲁布(Allen Holub)写道,
没有耦合就不可能有一个程序。尽管如此,您可以通过盲目地遵循 OO(面向对象)规则来大大减少耦合(最重要的是对象的实现应该对使用它的对象完全隐藏)。例如,对象的实例变量(不是常量的成员字段)应该始终是私有的。时期。没有例外。曾经。我是认真的。(你偶尔可以有效地使用受保护的方法,但受保护的实例变量是可憎的。)
这听起来很合理,但他接着说,
出于同样的原因,您永远不应该使用 get/set 函数——它们只是将字段公开的过于复杂的方法(尽管返回完整对象而不是基本类型值的访问函数在返回对象的情况下是合理的)类是设计中的关键抽象)。
坦率地说,这对我来说听起来很疯狂。
我了解信息隐藏的原理,但是如果没有访问器和修改器,您根本无法使用 Java bean。我不知道如果模型中没有访问器,您将如何遵循 MVC 设计,因为模型不能负责呈现视图。
然而,我是一个年轻的程序员,我每天都在学习更多关于面向对象设计的知识。也许有更多经验的人可以在这个问题上权衡。
Allen Holub 的文章供参考
相关问题:
functional-programming - 如何在诸如 Erlang 之类的函数式语言中使用缓存数据?
我最近读了一些关于函数式语言的书。经历了 10 多年的 OO 开发,我发现很难理解究竟如何将纯函数式方法(即使用相同参数调用的相同方法做同样的事情)指向一个问题,通常(在 OO 程序中)我需要缓存数据。
我们是否只是承认程序中可能需要一个不可变的参与者(即缓存)。我刚刚在 infoq 上观看了 Joe Armstrong 的演讲,他在这方面似乎很教条!
我们是否承认查找数据可能很昂贵(因为我们永远无法缓存它)?如果是这样,我们如何控制,例如,某些共享资源(例如数据库)的负载
有没有一些我还不知道的魔法仙尘,解决了整个问题,然后泡了一杯好茶。
当然,谷歌搜索“Erlang Cache”似乎返回了相当多的结果......
java - 使对象不可变的可能方法
我正在寻找一些有效的方法来构建一个不可变的类,就像 Java 的 String 类一样。
c# - 不变性对非并行应用程序有用吗?
我喜欢不可变的概念,但有时我想知道,当应用程序不应该是并行的时,是否应该避免使事物不可变?
当应用程序不是多线程时,您不会受到共享状态问题的困扰,对吧?
或者不变性是一个像 OOP 这样的概念,你要么一直使用,要么不使用?排除基于使用/性能等不应该不可变的情况。
我在为自己编写应用程序时遇到了这个问题,这个问题比较大(可能像 1-2k 行)。
c# - 使对象在运行时不可变 [C#]
有什么方法(我希望利用反射)可以使实例化对象及其所有公共属性不可变?我有一个来自其他人的代码库(没有可用源)的类,我需要使用它,如果任何地方的任何代码在实例化后尝试调用该类中的公共设置器,我基本上希望抛出异常。
注意:我不想在类周围创建一个包装对象来实现这一点。我很懒。
c# - C#/CLR 是否包含将属性的返回值标记为只读/不可变的机制?
我一直在环顾四周,到目前为止还没有找到一个好的方法来做到这一点。这是一个普遍的问题,我敢肯定。
假设我有以下内容:
想法是,我要实现一个二进制堆,而不是只支持 Insert() 和 DeleteMin() 操作,我想支持“偷看”最高(或最低,视情况而定)优先级值在堆栈上。从来没有像海森堡那样,整个“你不能在不改变它们的情况下看待事物”不确定性原则。垃圾!
显然,问题在于上述方法无法阻止调用代码通过 Top 属性修改 MyVal(假设为 SortedCollection),该操作很可能会将我的堆置于错误的顺序。有什么方法可以防止修改通过 Top 属性应用于堆的内部元素?还是我只是使用带有警告的代码:“只有在插入和出列之间不修改任何实例时才稳定。YMMV。”
.net - 带有集合的不可变结构
我正在.Net 中创建一个不可变结构,其中包含不同不可变结构的只读集合(我可以完全控制整个设计)。我不需要非变异的 Add 方法。
最好的方法是什么?
我可以使外部结构具有对ReadOnlyCollection
包含内部结构的引用。还有其他选择吗?