当前位置:  开发笔记 > 编程语言 > 正文

不可变对象的约定

如何解决《不可变对象的约定》经验,为你挑选了2个好方法。

当您设计不可变类时,您更喜欢:

Layer.ColorCorrect ( layer )

要么

layer.ColorCorrect ( )

对我来说#1看起来更直观,而不是#2,看起来它修改了被引用的对象,因为它是一个实例方法,它也可以改变内部,对吧?



1> Jon Skeet..:

我更喜欢使用实例方法,但选择名称以反映它不会更改现有实例的事实.例如:

layer.AfterColorCorrection()

要么

layer.WithCorrectedColors()

使用静态方法很快就会变得很烦人.此外,如果您向用户明确说明类型是不可变的,那么他们应该很快就能掌握它.每个人都因为String.Replace没有实际替换目标中的任何东西而被绊倒- 但他们并没有犯同样的错误.有了更好的名字,你应该没事.

我问了一个关于"添加"到不可变列表的相关问题 - 这是IMO使用"Plus"而不是"Add"的最佳解决方案; 再次,它并不意味着原始值发生了变化.您可能会发现该问题的其他答案很有用.



2> JaredPar..:

我个人的偏好是专注于使类型不可变的可见.例如,我将它称为ImmutableLayer vs. Layer.或者,如果由于某种原因,Immutable不是一个好名词,我将在该类中添加一个属性,表明它是不可变的(在两种情况下都添加了属性).

这有它的起伏.它是一个中心位置,以检查immutabliity.只需快速浏览一下,你就可以了.无需学习新的方法名称或约定.该方法的缺点是,在某些类型的推断场景中,您无法判断该值是不可变的.例如,此代码适用于ImmutableCollection和普通List

var col = GetTheCollection();
col.Add(42);

但是,我不喜欢更改方法名称以适应不变性.原因是它是一个问题,你必须反复解决.命名事情应该很容易,但有时候难以置信.想想你曾经想做的所有类型都是不可变的.想象一下,必须为这些类型的每个变异方法找到新的名称或约定.这是一项非常重要的任务,您将花费大量时间来教育用户使用这些新约定.

我的梦想场景是找到一种方法来增加不可变类型的可见性.因为这是真正的问题,不知道类型是不可变的.目前没有好方法可以在所有场景中执行此操作,但我希望下一版本的语言/ IDE.

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有