ruby - 将对象作为参数传递是否表示关联关系?

标签 ruby associative

在这两个类之间强制建立关联关系的最佳方法是什么?

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方法是一个典型的类方法:

  • 该方法或其名称没有什么特别之处。
  • 该方法未在任何典型的父类(super class)中定义。
  • 一些开发人员喜欢将这种方法命名为 makefactoryinit
  • 它与 Rails 应用 Controller create 方法完全无关。

这种创建有时称为“工厂”设计模式。该模式类似于用一堆零件创建完整产品的工厂。

为了持续协调模型,请考虑“指挥”设计模式,也称为“中介”设计模式。该模式类似于协调各个音乐家的交响乐指挥,或帮助人们相互合作的中间经理人。

上面的代码只是一个建议,为您指明正确的方向;您将根据自己的特定需求编写代码,例如,如果您想要每种商品有多个价格系列,或者商品名称与价格系列名称不同,等等。

如果你想要一堆选择,你可以通过编写如下内容来使用选项哈希:

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 方法中编写业务逻辑。

如果您有很多选择,或者想要对很多类执行此操作,有多种方法可以简化此类创建。

有关设计模式的更多信息,请参阅 http://en.wikipedia.org/wiki/Software_design_pattern

关于ruby - 将对象作为参数传递是否表示关联关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28418888/

相关文章:

c++ - C++ 运算符 "*"是左关联还是右关联?

javascript - VBScript 匿名关联数组? (就像 JavaScript 中一样)

ruby-on-rails - RSpec:为什么不让 work 而 before(:each) 呢?

ruby - 有没有一种 Ruby 方法可以按单词数对字符串数组进行排序?

ruby-on-rails - 影响 aws-sdk ruby​​ gem url_for 方法的文件名中的特殊字符

arrays - 如何将关联数组作为参数传递给 Bash 中的函数?

arrays - 狂欢 : Use a variable as an associative array name

c++ - c++中==运算符的结合性

ruby - 有没有一种简单的方法可以将第一个参数传递给 Rspec 的 `describe` ?

Ruby 1.9 Array.to_s 表现不同?