2015-02-09 68 views
2

執行這兩個類之間的關聯關係的最佳方式是什麼?傳遞對象作爲參數是否表示關聯關係?

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") 

我執行的關係的方式是通過傳遞實例作爲參數。這讓我感到笨拙,有沒有更好的方法來做到這一點?

回答

2

一種方法是所有三個共同創造,或許是這樣的:

​​

用法:

commodity, excel = Commodity.create("gold", "example.xls") 

create方法是典型的類方法:

  • 有對方法或名稱沒有特別之處。
  • 該方法沒有在任何典型的超類中定義。
  • 一些開發商喜歡來命名這種方法makefactoryinit的。
  • 這與Rails應用程序控制器create方法完全無關。

這種創作有時也被稱爲「工廠」的設計模式。該模式類似於用一堆零件創建完整產品的工廠。

要持續協調模型,請考慮「導體」設計模式a.k.a.「中介器」設計模式。這種模式類似於協調各種音樂家的交響樂指揮,或者是幫助人們彼此協作的中間經理人。

上面的代碼僅僅是一個建議,指向正確的方向;如果你想每個商品一個以上的價格序列,或者價格比系列名稱不同的商品名等

你會寫你的代碼,您的特定需求,例如,如果你想了一堆的選擇,你可以通過寫這樣的使用選項哈希:

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

+0

謝謝,我一直想找到一本關於設計模式。這段代碼實際上在做什麼?我從來沒有見過創建方法,它似乎沒有工作時,實例化類代替x = Class。新(參數) – 2015-02-10 19:34:42

+0

在這種情況下,雖然價格系列不能在沒有商品的情況下存在,但商品可能有零個或幾個價格系列' – 2015-02-10 19:36:53