Dns 当我们决定不变性时,我们应该看看现实世界吗?

Dns 当我们决定不变性时,我们应该看看现实世界吗?,dns,immutability,Dns,Immutability,有一种强大的方法可以使对象不可变。那么,我们是否应该在可能的情况下总是渴望不变性,或者在决定某件事情是否应该是不变性的时候考虑现实世界 示例:纸牌游戏。“一副牌”是不变的吗?我们有两个选择: 甲板是不变的。所有方法(洗牌,发牌一)返回对新牌组对象的引用 甲板是可变的。所有方法都会改变当前组 这将是很好的,使甲板不变。我们将获得上述链接中描述的好处。但在现实世界中,一副牌并不是一成不变的——我们洗牌并得到“相同”的一副牌,但顺序不同。您应该始终努力为您的场景做出最佳权衡。仅仅因为某个款式很流行,或

有一种强大的方法可以使对象不可变。那么,我们是否应该在可能的情况下总是渴望不变性,或者在决定某件事情是否应该是不变性的时候考虑现实世界

示例:纸牌游戏。“一副牌”是不变的吗?我们有两个选择:

  • 甲板是不变的。所有方法(洗牌,发牌一)返回对新牌组对象的引用
  • 甲板是可变的。所有方法都会改变当前组

  • 这将是很好的,使甲板不变。我们将获得上述链接中描述的好处。但在现实世界中,一副牌并不是一成不变的——我们洗牌并得到“相同”的一副牌,但顺序不同。

    您应该始终努力为您的场景做出最佳权衡。仅仅因为某个款式很流行,或者是酷酷的孩子们在做什么,就“渴望”它是没有意义的。如果您听到了赞成和反对的观点,您应该能够权衡这两种选择,并做出适合您、您的代码库和您的团队的决策

    谨防盲目遵循最佳实践


    对于这一套卡片的特定场景,默认情况下我倾向于不可变,但在继续之前问自己几个问题:

    • 一次洗牌/交易与下一次交易之间是否存在足够的复杂性?(如果是,则+1表示不可变,因为它可以“占用您的大脑”,可以说,如果您共享一个引用,可能会引入潜在的bug)
    • 对组的引用是否跨线程共享?(如果是,则+100表示不可变,因为如果可以同时进行修改,复杂性会大大增加)
    • 是否存在内存和/或速度限制?(如果是,对于可变组+1,如果确实资源受限,则就地修改组最有可能(但不保证)提供更好的性能,并且一如既往地由探查器指导)
    • 内存中的数据组是否需要紧密映射到真实世界的数据组?例如,您的用户是否在其自己的程序/DSL中访问/查询it?(如果是,则+1表示可变性,因为它可能更接近用户的心理模型。但是,这仍然是您选择的定义,不可变的组仍然有意义)

    恐怕这是一个狡猾的回答,但你必须根据自己的情况来判断。有时,设计与域匹配比使对象不可变更重要。其他时候不是,当你做出编程选择时,忘记域是值得的——记住你的域很少需要关心或建模我们程序员每天处理的很多事情。在其他具有其他约束的场景中,您可能不得不同时放弃这两个约束

    不变性允许将对象视为一个值。卡片是不变性的一个很好的候选者,因为它实际上不需要在之后修改

    请参阅本文以帮助决定何时何地使用可变/不可变类