业务逻辑对象的可变与不可变

时间:2011-05-14 18:06:31

标签: oop immutability mutable

在数据模型中已经有很多关于可变/不可变对象的说法了。

但是业务逻辑呢?例如:CD播放器。一个班负责播放CD。

// Immutable version:
class Player
{
    CD cd;
    public Player(CD cd) { ... }
}

// Mutable version:
class Player
{
    CD cd;
    public void ChangeCD(CD cd) { ... }
}

我可以想到两个版本的几个微妙优点和缺点。 例如,当玩家可变时,其他对象可以占用玩家,即使CD发生变化也能保持有效。当播放器是不可变的时,你需要一个包装器对象(例如命令模式),当创建一个新的播放器时它会被更新。

哪种情况更适合哪种版本?有没有一般指导方针?

1 个答案:

答案 0 :(得分:1)

这是第三种选择。

class Player
{
     // private CD myCD <- no private field for the CD
     public Player() {}
     public void playCD (CD cd) {}
}

玩家永远不应拥有CD对象。它应该只是被告知是一个CD对象,播放它。

更好的选择是

class CDPlayer : DataPlayer
{
    public Player() {}
    public void playData (IData cd) {}
}

class CD : IData {}

如果减少CD和播放器之间的耦合量,那么你真的不必过于考虑这一点。

我相信你的例子对你的实际问题有点不妥。