当您设计不可变类时,您更喜欢:
Layer.ColorCorrect ( layer )
要么
layer.ColorCorrect ( )
对我来说#1看起来更直观,而不是#2,看起来它修改了被引用的对象,因为它是一个实例方法,它也可以改变内部,对吧?
我更喜欢使用实例方法,但选择名称以反映它不会更改现有实例的事实.例如:
layer.AfterColorCorrection()
要么
layer.WithCorrectedColors()
使用静态方法很快就会变得很烦人.此外,如果您向用户明确说明类型是不可变的,那么他们应该很快就能掌握它.每个人都因为String.Replace
没有实际替换目标中的任何东西而被绊倒- 但他们并没有犯同样的错误.有了更好的名字,你应该没事.
我问了一个关于"添加"到不可变列表的相关问题 - 这是IMO使用"Plus"而不是"Add"的最佳解决方案; 再次,它并不意味着原始值发生了变化.您可能会发现该问题的其他答案很有用.
我个人的偏好是专注于使类型不可变的可见.例如,我将它称为ImmutableLayer vs. Layer.或者,如果由于某种原因,Immutable不是一个好名词,我将在该类中添加一个属性,表明它是不可变的(在两种情况下都添加了属性).
这有它的起伏.它是一个中心位置,以检查immutabliity.只需快速浏览一下,你就可以了.无需学习新的方法名称或约定.该方法的缺点是,在某些类型的推断场景中,您无法判断该值是不可变的.例如,此代码适用于ImmutableCollection和普通List
var col = GetTheCollection(); col.Add(42);
但是,我不喜欢更改方法名称以适应不变性.原因是它是一个问题,你必须反复解决.命名事情应该很容易,但有时候难以置信.想想你曾经想做的所有类型都是不可变的.想象一下,必须为这些类型的每个变异方法找到新的名称或约定.这是一项非常重要的任务,您将花费大量时间来教育用户使用这些新约定.
我的梦想场景是找到一种方法来增加不可变类型的可见性.因为这是真正的问题,不知道类型是不可变的.目前没有好方法可以在所有场景中执行此操作,但我希望下一版本的语言/ IDE.