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

时间:2015-02-09 19:45:42

标签: ruby uml

使用模块和类,定义此类关系的最佳方法是什么?

UML class diagram for aggregation and association

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

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

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

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

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

我认为这应该是:

class ExcelFile
end

class Commodity 
    class PriceSeries
    end
end

这个"程序"将是一个更大的计划中的一个功能。将所有这些类放在一个模块中然后将它混合到" main"中是不是一个好主意。最终上课?

1 个答案:

答案 0 :(得分:2)

你走在正确的轨道上。但是,您的图表显示的是聚合而不是内部类,因为您的代码具有它。所以他们彼此不太一致。我认为你应该使用你的图表并更改你的代码:

class ExcelFile
end

class Commodity
    PriceSeries[] myPriceSeriesArray
end

class PriceSeries
end

当然还有更多内容:你必须有办法创建PriceSeries实例并将它们分配给myPriceSeriesArray数组等。但那是基本的想法。

现在,您的图表有一些内容:

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