2012-01-25 2 views
2

나는 Rails AntiPatterns 책을 읽고 있는데, 많은 것을 즐긴다. 어느 시점에서 작성자는 구성의 장점에 대해 이야기하고 주문 클래스는 다른 클래스 (다른 형식) 로의 변환 책임을 부여합니다 (예 : OrderConverter). 클래스는 다음과 같이 정의된다 :Rails AntiPatterns book - 작문에 대한 의문점이 있습니다.

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.new

을 그리고 수행하여 변환 : 그것은으로 만들 수 없습니다해야

order.converter.to_pdf 
  • attr_reader :order 라인이 OrderConverter 필요하다? 우리가 OrderConverter 개체에서 주문에 액세스 할 수있게 되었습니까? 할 수 있어야합니까? order.converter.to_pdf? 우리는 그것없이 할 수 있습니다 attr_reader 맞습니까?

답변

2

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 엄격하게 필요하지 않지만 다른 방법에서 주문 개체에 액세스 할 수있는 편리한 방법입니다 :

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

그것은 또한 당신이 어떤 변환 인스턴스에서 순서에 대한 참조를 얻을 수 있습니다 : 대답에 대한

converter.order 
+0

Jeff, 나는 attr_reader를 사용하지 않고도 다른 클래스의 메소드 (Order 클래스)에 Order 객체에 액세스 할 수 있다고 생각합니다. 모든 변환기 인스턴스에서 주문을받는 것이 유용하다고 생각합니다. – Nobita

+0

물론, 컨버터의 내부에서 그것을 추가 한 이유는'attr_reader'는 단순히 편리한 접근 자일뿐입니다. 'attr_accessor : order'가 없으면'converter.order'를 호출하면 "NoMethodError"가 발생합니다. 주문에 대한 참조는 인스턴스 변수가 인스턴스 범위를 가지기 때문에이 특정 인스턴스 외부에서는 액세스 할 수 없습니다. – Jef

+0

죄송합니다. 이전 주석에 오타/편집이 너무 많습니다 :'attr_accessor' (읽기 - 쓰기)가 아닌'attr_reader' (읽기 전용)을 읽으십시오. – Jef

2

변수 앞에있는 @은 인스턴스 변수가됩니다. 변수가 없다면 변수는 단지 지역 변수가됩니다. 나는이 코드가 Rails에 대한 책이므로이 코드가 컨트롤러에 있다고 가정합니다. 컨트롤러가 메소드에서 공유하거나 뷰에서 노출하고자하는 변수는 인스턴스 변수 여야합니다. 이 경우 @order은 요청의 매개 변수 또는 데이터베이스에서 가져온 값을 통해 생성되었을 수 있습니다.

그의 예와 예제가 모두 작동하지만 이는 중요하지 않습니다. 저는 저자가 OrderConverter에 대한 호출이 어떻게 표시되는지 보여 주었고 Order 객체가 생성 된 방법을 무시했다고 생각합니다.

attr_reader :orderOrderConverter@order 인스턴스 변수에 대한 "게터"메소드를 생성 -이 to_pdf에 필요한 아니에요 -이 converter.order를 통해 다시 OrderConverter 밖으로 Order를 가져 오는 데 사용됩니다. 지금까지 제공 한 코드에서이 코드를 사용할 필요는 없지만 나중에 필요할 수 있습니다.

+0

감사합니다. 나는 두 가지 대답을 줄 수 있었으면 좋겠다. 두 가지 모두이 개념을 명확히하기 위해 많은 도움을 주었다. – Nobita

관련 문제