与单独的 class 具有关联关系的复合 class

A composite class with an associative relationship to a separate class

使用模块和 classes,定义这种 class 关系的最佳方式是什么?

一种商品有零个或多个价格系列'(聚合),价格系列对象是通过选择Excel文件对象的一部分来创建的。

(excel 文件对象是已转换为 json 类结构的 excel 工作簿)

我认为 Excel 文件 class 应该是一个单独的 class class...然后我可以实例化一个商品(例如 gold = Commodity.new("gold")).我可以实例化一个 Excel 文件(例如 yahoo_prices = ExcelFile.new(xlsx_file_name))。

但现在我想使用 Commodity 命名空间之外的 ExcelFile 对象实例化一个 PriceSeries 对象(在商品对象内)。

我该怎么做?我应该这样做吗?我在正确的轨道上吗?

我认为应该是这样的:

class ExcelFile
end

class Commodity 
    class PriceSeries
    end
end

此 "program" 将成为更大程序中的一个功能。将所有这些 class 放在一个模块中,然后最终将其混合到 "main" class 中是个好主意吗?

你走在正确的轨道上。但是,您的图表显示的是聚合而不是内部 class,正如您的代码所具有的那样。所以他们彼此不太一致。我认为你应该按照你的图表更改你的代码:

class ExcelFile
end

class Commodity
    PriceSeries[] myPriceSeriesArray
end

class PriceSeries
end

当然,不仅如此:您必须有一种方法来创建 PriceSeries 实例并将它们分配给 myPriceSeriesArray 数组等。但这是基本的想法。

现在,关于您的图表有几点:

  1. *0..* 的缩写。由于您至少需要一个 PriceSeries 和一个 ExcelFile,因此您需要将它们更改为 1..*。 (这假设您可以拥有任意数量的其中之一,只要您至少拥有一个即可。)
  2. 我建议您将 <<file>> 原型放在您的 ExcelFile class.
  3. 考虑将 Commodity 和 PriceSeries 之间的关联作为组合而不是聚合(黑色菱形而不是白色菱形)。这意味着您的 PriceSeries class 的生命周期与 Commodity class 的生命周期相关联。它看起来不像 PriceSeries 实例具有任何独立于商品的逻辑标识,因此当您处理商品对象时,我认为您也会处理 PriceSeries 对象。如果您决定这样做,您的代码应该在 Commodity 的构造函数中实例化必要的 PriceSeries 对象,并将它们分配给 myPriceSeriesArray 属性。