2015-02-09 2 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

Один из способов заключается в создании всех трех вместе, возможно, что-то вроде этого:

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 типичный метод класса:

  • Там ничего особенного в методе или его имени.
  • Метод не определен ни в одном типичном суперклассе.
  • Некоторые разработчики называют этот вид метода make или factory или init.
  • Он полностью не связан с контроллером приложений 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

Спасибо, я был смысл, чтобы найти книгу о шаблонах проектирования. Что делает этот код на самом деле? Я никогда раньше не видел метод create, и он, похоже, не работает при создании классов вместо x = Class.new (param) –

+0

В этом случае, хотя ценовая серия не может существовать без товара, но товар может иметь нулевой или несколько ценовых серий, –

 Смежные вопросы

  • Нет связанных вопросов^_^