【问题标题】:Using Object Oriented Design with Ruby, how to show transfer of ownership?在 Ruby 中使用面向对象设计,如何显示所有权转移?
【发布时间】:2015-06-02 22:12:18
【问题描述】:

假设我们有以下类:BakeryEquipmentBatchBakeryEquipment 组成,如下所示:

class Bakery
  attr_accessor :equipment
end

Equipment 看起来像这样:

class Equipment
  attr_accessor :name, :quantity
end

因此,要表示一家有两个烤箱的面包店,我们可以这样做:

ovens = Equipment.new
ovens.quantity = 2
bakery = Bakery.new
bakery.equipment = [ovens]

现在Batch 类代表一批烘焙食品。它本身由一个Formula 和几个Step 对象组成。 Formula 类包含步骤顺序和时间信息,以便Batch 知道何时需要使用某些设备。 (为简洁起见,我省略了FormulaBatch 代码。完整代码可用herehere。)

我的问题是如何使用 OOD 将某些设备(例如 1 个烤箱)的所有权从 bakery 临时转移到 batchbakery 拥有一个代表两个烤箱的 Equipment 实例。其中一个烤箱将暂时被batch 进程占用。我是否应该创建Equipment 的新实例并将其传递给batch,同时减少ovensquantity?还是我不应该为quantity 属性而烦恼,而只需为面包店的每个烤箱创建一个Equipment 实例?在这种情况下,我可以简单地将最后一个烤箱从bakery.equipment 数组中弹出,然后将其推到batch.equipment 上,直到batch 完成。一项业务逻辑要求是能够查询bakery.equipment 的未来可用性。因此,当前状态(即有多少烤箱被占用)和未来状态(即晚上 9:00 将占用多少烤箱)之间需要有所区别。

【问题讨论】:

    标签: ruby oop design-patterns object-oriented-analysis


    【解决方案1】:

    我认为您错误地对数据进行了建模。你的Bakery 不仅有设备,还有available equipmentoccupied equipment。而Batch 不拥有任何东西,它要求 Bakery 暂时将一些设备标记为已占用。

    它可以根据您的内存/性能/代码简单性要求进行不同的建模。

    一个例子(不是性能/内存明智,我想,而是说明性的)是让Bakery 将可用设备块存储在一个列表中,然后将Bakery 传递给一个新的Batch 实例以标记一些插槽(或增加某些项目的使用计数器)为忙。

    Batch 根据FormulaBakery 中的所有设备标记为忙碌后,就可以分析Bakery。

    嗯,这只是一个整体示例,并不是很详细。但是,我不知道您要解决的确切问题;)

    【讨论】:

    • 对不起,我应该更清楚这个问题。用例是:在开始批次之前,我想确保必要的设备可用(即未被占用)。因此,业务逻辑应该查看所有当前正在运行的批次、可用设备和占用的设备,然后确定是否有足够的可用设备来运行新批次。逻辑需要提前考虑需要设备的步骤,因为一个批次可以持续,比如说,15 小时,并且只在最后 2 小时内使用烤箱。
    • @ReedG.Law 嗯,这改变了很多。对我来说,在这种情况下,Bakery 只是一个关于可用容量的信息对象。 Batch 应首先将容量数据从 Bakery 复制到自身中并仅将其用作信息,从而在其内部维护该容量的时间表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    相关资源
    最近更新 更多