【问题标题】:Mutable vs. Immutable with business logic objects具有业务逻辑对象的可变与不可变
【发布时间】:2011-05-14 18:06:30
【问题描述】:

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

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

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

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

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

在哪些情况下哪个版本更可取?有没有一般的指导方针?

【问题讨论】:

    标签: oop immutability mutable


    【解决方案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 和播放器之间的耦合量,那么您真的不必考虑太多。

    我相信你的例子对于你的实际问题有点缺陷。

    【讨论】:

    • 因此您将使用每个方法传递一个 CD 对象 - 例如暂停(cd),搜索(cd,时间)?并且播放器没有与任何 CD 相关的状态。看起来不错,但是在此设计中您会将 CurrentPlaybackPosition 存储在哪里?
    • @LTR 取决于。我打算将 CD 中的数据直接加载到某种私有二进制缓冲区中。然后你可以停下来,向前/向后走并完全覆盖该缓冲区。
    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 2010-11-21
    • 2011-09-15
    • 2021-04-20
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2010-12-04
    相关资源
    最近更新 更多