Tag: 不变性

艾伦霍勒布写道:“你不应该使用获取/设置function”,他是正确的?

艾伦霍勒布写了以下内容, 没有一些耦合,你不能有一个程序。 尽pipe如此,通过严格遵循OO(面向对象的)规则(最重要的是对象的实现应该完全从使用它的对象中隐藏),可以大大减less耦合。 例如,对象的实例variables(不是常量的成员字段)应始终保密。 期。 没有例外。 永远。 我是认真的。 (您可以偶尔使用受保护的方法,但受保护的实例variables是可憎的。) 这听起来合理,但他接着说, 你不应该使用get / set函数出于同样的原因 – 他们只是过于复杂的方式来公开一个字段(尽pipe访问函数返回成熟的对象而不是基本types的值是合理的,在返回的对象类是devise中的关键抽象)。 坦率地说,对我来说听起来很疯狂。 我理解隐藏信息的原理,但是如果没有访问器和修改器,就根本无法使用Java Bean。 我不知道如何在模型中没有访问器的情况下遵循MVCdevise,因为模型不能负责渲染视图。 但是,我是一个年轻的程序员,每天都会学习更多关于面向对象的devise。 也许有更多经验的人可以考虑这个问题。 艾伦霍勒布的文章供参考 为什么延伸是邪恶的 为什么Getter和Setter方法是邪恶的 相关问题: 爪哇:吸气剂和固化剂是邪恶的吗? 是不是真的没有使用setter和getters? 获得和设置functionstream行与C ++程序员? 你应该使用类中的访问器属性,还是仅仅从类之外?

在C#中,为什么我不能在foreach循环中修改值types实例的成员?

我知道值types应该是不变的,但这只是一个build议,而不是一个规则,对吗? 那么为什么我不能这样做: struct MyStruct { public string Name { get; set; } } public class Program { static void Main(string[] args) { MyStruct[] array = new MyStruct[] { new MyStruct { Name = "1" }, new MyStruct { Name = "2" } }; foreach (var item in array) { item.Name = "3"; } //for (int […]

为什么C#结构是不可变的?

我只是想知道为什么结构,string等是不可改变的? 是什么原因使他们不可变,其余的对象是可变的。 什么是被认为使一个对象不变的东西? 内存分配和释放可变和不可变对象的方式有什么区别吗?

什么是不变性,我为什么要担心呢?

我读过几篇关于不变性的文章,但是仍然没有很好地遵循这个概念。 我最近在这里提到了一个提到不变性的话题,但是因为这本身就是一个话题,所以我现在正在制定一个专门的话题。 我在过去的主题中提到,我认为不变性是指只读取对象并使其可见性较低的过程。 另一位成员则表示,这并没有什么关系。 这个页面 ( 一系列的一部分)使用一个不可变的类/结构的例子,它使用只读和其他概念来locking它。 在这个例子中,状态的定义究竟是什么? 国家是一个我没有真正掌握的概念。 从devise原则的angular度来看,一个不可变的类必须是一个不接受用户input的类,真的只是返回值呢? 我的理解是任何只是返回信息的对象都应该是不可变的,“locking”的,对吗? 所以如果我想用一个方法返回一个专门的类的当前时间,我应该使用一个引用types,因为这将是一个types的引用,因此我受益于不变性。

不可变的stringvs std :: string

我最近一直在阅读关于不可变string的知识, 在这里和这里以及为什么Dselect了不可变string的一些东西。 似乎有很多优点。 平凡线程安全 更安全 在大多数使用情况下更有效率。 便宜的子串(标记和切片) 更何况大多数新语言都有不可变的string,D2.0,Java,C#,Python等等。 C ++会从不可变的string中受益吗? 是否有可能实现一个不变的string类在c + +(或c + + 0x),将具有所有这些优势? 更新: 有两个尝试在不可变的stringconst_string和fix_str 。 在过去的五年中都没有更新。 他们甚至用过吗? 为什么没有const_string使它成为提升?

在C#中replace多个string元素

有没有更好的方法来做到这一点… MyString.Trim().Replace("&", "and").Replace(",", "").Replace(" ", " ") .Replace(" ", "-").Replace("'", "").Replace("/", "").ToLower(); 我已经扩展了string类,以保持它的一个工作,但有一个更快的方法? public static class StringExtension { public static string clean(this string s) { return s.Replace("&", "and").Replace(",", "").Replace(" ", " ") .Replace(" ", "-").Replace("'", "").Replace(".", "") .Replace("eacute;", "é").ToLower(); } } 只是为了好玩(并且停止评论中的论据),我已经把基准推到了下面的各个例子上。 https://gist.github.com/ChrisMcKee/5937656 正则expression式得分非常可怕; 字典选项出现最快; stringbuilderreplace的冗长版本比短手略快。

将可变映射转换为不可变映射

private[this]object MMMap extends HashMap[A, Set[B]] with MultiMap[A, B] 如何将其转换为不可变的?

Swift使方法参数可变?

我怎样才能处理这个错误,而不创build额外的variables? func reduceToZero(x:Int) -> Int { while (x != 0) { x = x-1 // ERROR: cannot assign to 'let' value 'x' } return x } 我不想创build额外的variables来存储x的值。 是否有可能做我想要的?

为什么我们需要不可变的类?

我无法得到我们需要一个不可变类的场景。 你有没有遇到过这样的要求? 还是可以给我们一个真实的例子,我们应该使用这种模式。

公开一个不可变对象的状态可以吗?

最近遇到不可变对象的概念,我想知道控制访问状态的最佳实践。 尽pipe我的大脑面向对象的部分让我想要在公众面前畏惧恐惧,但是我没有看到像这样的技术问题: public class Foo { public final int x; public final int y; public Foo( int x, int y) { this.x = x; this.y = y; } } 我觉得将这些字段声明为private并为每个字段提供getter方法会感觉更加舒适,但是只有在显式读取状态时,这似乎过于复杂。 提供访问不可变对象状态的最佳实践是什么?