Книга Rails AntiPatterns - Сомнения по составу - PullRequest
2 голосов
/ 25 января 2012

Я читаю книгу Rails AntiPatterns , которая мне очень нравится.В какой-то момент автор говорит о совершенстве композиции и приводит пример, в котором класс Order возлагает ответственность за преобразование (в другие форматы) в другой класс, называемый OrderConverter .Классы определены как:

class Order < ActiveRecord::Base
    def converter
        OrderConverter.new(self)
    end
end

class OrderConverter
    attr_reader :order
    def initialize(order)
        @order = order
    end
    def to_xml
        # ...
    end
    def to_json
        # ...
    end
    ...
end

И тогда автор говорит: « Таким образом, вы предоставляете методы преобразования своим собственным домом, внутри отдельного и легко тестируемого класса. Экспорт PDF-версииордена теперь просто нужно позвонить по следующему номеру:"

@order.converter.to_pdf

По этому поводу у меня следующие вопросы:

  • ПочемуВы думаете, что объекту заказа предшествует @?Разве это не должно быть создано как:

    order = Order.new

А затем конвертировать, выполнив:

order.converter.to_pdf 
  • Почемунужна строка attr_reader :order в OrderConverter?Это так, мы можем получить доступ к заказу из объекта OrderConverter ?Нужно ли уметь делать order.converter.to_pdf?Мы могли бы сделать это без этого attr_reader верно?

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Экземпляр Order передается методу initialize и сохраняется как переменная экземпляра (с использованием синтаксиса @: @order). Таким образом, эта переменная может быть доступна из других методов конвертера (переменная имеет область действия экземпляра):

class OrderConverter
  def to_pdf
    @order.items.each do |item|
       # Write the order items to the PDF
    end
  end
end

attr_reader не является строго обязательным, но это удобный способ доступа к объекту Order из других методов:

class OrderConverter
  def to_pdf
    order.items.each do |item|
       # Write the order items to the PDF
    end
  end
end

Это также позволит вам получить ссылку на заказ из любого экземпляра конвертера:

converter.order
2 голосов
/ 25 января 2012

@ в начале переменной делает его переменной экземпляра. Если бы этого не было, переменная была бы просто локальной переменной. Я предполагаю, что, поскольку это книга о Rails, предполагается, что этот код будет в контроллере. Переменные, которые контроллеры хотят совместно использовать между методами или предоставлять в своих представлениях, должны быть переменными экземпляра. В этом случае @order, вероятно, было создано либо с помощью параметров из запроса, либо со значениями, извлеченными из базы данных.

Это, вероятно, не так важно, хотя и его пример, и ваш пример работы - я думаю, что автор просто показывал, как будет выглядеть вызов OrderConverter, и игнорировал, как был создан объект Order.

attr_reader :order создает метод "получения" для переменной экземпляра @order в OrderConverter - он не нужен для to_pdf - он будет использоваться для возврата Order из OrderConverter через converter.order. Я не вижу необходимости иметь это в приведенном вами коде, но, возможно, в этом есть необходимость позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...