私は多くを楽しんでいるRails AntiPatterns本を読んでいます。ある時点で、作者は構成の良さについて語り、オーダークラスは、OrderConverterと呼ばれる別のクラスへの(他のフォーマットへの)変換の責任を与えている例を示しています。クラスは以下のように定義されていますRails AntiPatterns本 - 構成上の疑問点
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版をエクスポートしています。今コール-INGの次のだけの問題:これにについて「
@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オブジェクトにアクセスできると思いますか?どのコンバーターインスタンスからでも注文を得ることが有用であると私は信じています。 – Nobita
もちろん、コンバーターの内部からそれを追加したのは、 'attr_reader'は単に便利なアクセサだと思います。 'attr_accessor:order'がなければ、' converter.order'を呼び出すと "NoMethodError"が発生します。オーダーへの参照は、この特定のインスタンス外ではアクセスできません。インスタンス変数にはインスタンススコープがあります。 – Jef
申し訳ありませんが、前のコメントに誤って入力/編集しました: 'attr_accessor'(読み書き可能)ではなく' attr_reader'(読み取り専用)を読み込みます。 – Jef