나는 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 맞습니까?
Jeff, 나는 attr_reader를 사용하지 않고도 다른 클래스의 메소드 (Order 클래스)에 Order 객체에 액세스 할 수 있다고 생각합니다. 모든 변환기 인스턴스에서 주문을받는 것이 유용하다고 생각합니다. – Nobita
물론, 컨버터의 내부에서 그것을 추가 한 이유는'attr_reader'는 단순히 편리한 접근 자일뿐입니다. 'attr_accessor : order'가 없으면'converter.order'를 호출하면 "NoMethodError"가 발생합니다. 주문에 대한 참조는 인스턴스 변수가 인스턴스 범위를 가지기 때문에이 특정 인스턴스 외부에서는 액세스 할 수 없습니다. – Jef
죄송합니다. 이전 주석에 오타/편집이 너무 많습니다 :'attr_accessor' (읽기 - 쓰기)가 아닌'attr_reader' (읽기 전용)을 읽으십시오. – Jef