将对象作为参数传递是否代表关联关系?
Does passing objects as arguments represent an associative relationship?
在这两个 类 之间加强关联关系的最佳方式是什么?
class ExcelFile
def initialize(name)
@name = name
end
end
class Commodity
attr_accessor(
:xau
)
def initialize(name)
@name = name
end
class PriceSeries
def initialize(source, name)
@source = source
@name = name
end
end
end
所以要实例化 类:
mm8_prices = ExcelFile.new("some_exlsx_file")
gold = Commodity.new("gold")
gold.xau = Commodity::PriceSeries.new(mm8_prices, "gold")
我加强这种关系的方式是将实例作为参数传递。我觉得这很笨拙,有没有更好的方法?
一种方法是同时创建这三个,也许是这样的:
class Commodity
def self.create(commodity_name, excel_name)
c = Commodity.new(commodity_name)
e = ExcelFile.new(excel_name)
c.xau = Commodity::PriceSeries.new(e, commodity_name)
return c, e
end
end
用法:
commodity, excel = Commodity.create("gold", "example.xls")
create
方法是典型的class方法:
- 该方法或其名称没有什么特别之处。
- 该方法未在任何典型的 superclass 中定义。
- 一些开发者喜欢将这种方法命名为
make
或factory
或init
。
- 它与 Rails 应用程序控制器
create
方法完全无关。
这种创建有时称为 "factory" 设计模式。该模式类似于一个工厂,它使用一堆零件创建一个完整的产品。
要持续协调模型,请考虑 "conductor" 设计模式 a.k.a。 "mediator" 设计模式。该模式类似于协调各种音乐家的交响乐指挥,或帮助人们相互合作的中间人。
上面的代码只是一个建议,可以为您指明正确的方向;您将根据您的特定需求编写代码,例如,如果您希望每种商品有多个价格系列,或者商品名称与价格系列名称不同,等等。
如果你想要一堆选择,你可以通过写这样的东西来使用选项散列:
def self.create(options={})
c = e = nil # it's good practice to initialize these
if options[:commodity_name]
c = Commodity.new(options[:commodity_name])
end
if options[:excel_name]
e = ExcelFile.new(options[:excel_name])
end
...
return c, e
end
用法:
c, e = Commodity.create(commodity_name: "gold", excel_name: "my.xls")
您可以使选项可选或变化,或者在提供默认选项或验证等的 create
方法中编写业务逻辑。
如果您有很多选择,或者想用很多 classes 来做,有很多方法可以简化这种创建。
有关设计模式的更多信息,请参阅 http://en.wikipedia.org/wiki/Software_design_pattern
在这两个 类 之间加强关联关系的最佳方式是什么?
class ExcelFile
def initialize(name)
@name = name
end
end
class Commodity
attr_accessor(
:xau
)
def initialize(name)
@name = name
end
class PriceSeries
def initialize(source, name)
@source = source
@name = name
end
end
end
所以要实例化 类:
mm8_prices = ExcelFile.new("some_exlsx_file")
gold = Commodity.new("gold")
gold.xau = Commodity::PriceSeries.new(mm8_prices, "gold")
我加强这种关系的方式是将实例作为参数传递。我觉得这很笨拙,有没有更好的方法?
一种方法是同时创建这三个,也许是这样的:
class Commodity
def self.create(commodity_name, excel_name)
c = Commodity.new(commodity_name)
e = ExcelFile.new(excel_name)
c.xau = Commodity::PriceSeries.new(e, commodity_name)
return c, e
end
end
用法:
commodity, excel = Commodity.create("gold", "example.xls")
create
方法是典型的class方法:
- 该方法或其名称没有什么特别之处。
- 该方法未在任何典型的 superclass 中定义。
- 一些开发者喜欢将这种方法命名为
make
或factory
或init
。 - 它与 Rails 应用程序控制器
create
方法完全无关。
这种创建有时称为 "factory" 设计模式。该模式类似于一个工厂,它使用一堆零件创建一个完整的产品。
要持续协调模型,请考虑 "conductor" 设计模式 a.k.a。 "mediator" 设计模式。该模式类似于协调各种音乐家的交响乐指挥,或帮助人们相互合作的中间人。
上面的代码只是一个建议,可以为您指明正确的方向;您将根据您的特定需求编写代码,例如,如果您希望每种商品有多个价格系列,或者商品名称与价格系列名称不同,等等。
如果你想要一堆选择,你可以通过写这样的东西来使用选项散列:
def self.create(options={})
c = e = nil # it's good practice to initialize these
if options[:commodity_name]
c = Commodity.new(options[:commodity_name])
end
if options[:excel_name]
e = ExcelFile.new(options[:excel_name])
end
...
return c, e
end
用法:
c, e = Commodity.create(commodity_name: "gold", excel_name: "my.xls")
您可以使选项可选或变化,或者在提供默认选项或验证等的 create
方法中编写业务逻辑。
如果您有很多选择,或者想用很多 classes 来做,有很多方法可以简化这种创建。
有关设计模式的更多信息,请参阅 http://en.wikipedia.org/wiki/Software_design_pattern