使用 Ruby 的面向对象设计,如何显示所有权的转移?

Using Object Oriented Design with Ruby, how to show transfer of ownership?

假设我们有以下 classes: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 class 代表一批烘焙食品。它本身由一个 Formula 和几个 Step 对象组成。 Formula class 包含步骤顺序和时间信息,以便 Batch 知道何时需要使用某些设备。 (为简洁起见,我省略了 FormulaBatch 代码。完整代码可用 here and here。)

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

我认为您对数据建模不正确。你的Bakery不仅有装备,还有available equipmentoccupied equipment。而Batch没有任何东西,它要求Bakery暂时将一些设备标记为已占用。

它可以根据您的 memory/performance/code 简单性要求进行不同的建模。

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

Batch根据其FormulaBakery中的所有设备标记为忙碌后,即可对面包店进行分析。

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