アクセサを定義するか、インスタンス変数に直接アクセスするか

アクセサは単なるgetterかどうか確認する必要があるので,インスタンス変数のほうが可読性は高い.
しかし、スーパークラスのインスタンス変数値をサブクラスで変更したい場合は、 アクセサを定義しておくとオーバーライドで変更できるのでスーパークラスのメソッドをそのまま使用することができる.

 1 class Item
 2   def initialize(base_price, tax_rate)
 3     @base_price = base_price
 4     @tax_rate   = tax_rate
 5   end
 6 
 7   def total
 8     @base_price * (1 + @tax_rate / 100.0)
 9   end
10 end
11 
12 class ImportedItem < Item
13   def initialize(base_price, tax_rate, import_duty)
14     super(base_price, tax_rate)
15     @import_duty = import_duty
16   end
17 
18   def total
19     @base_price * (1 + (@tax_rate + @import_duty) / 100.0)
20   end
21 end

税抜き価格 + 税率 の定義が変更したわけでなく税率が加算され変化しただけなので上記の様にtotalを再定義するのは、保守面からも問題がある。

 1 class Item
 2   attr_accessor :base_price, :tax_rate
 3 
 4   def initialize(base_price, tax_rate)
 5     @base_price = base_price
 6     @tax_rate   = tax_rate
 7   end
 8 
 9   def total
10     base_price * (1 + tax_rate / 100.0)
11   end
12 end
13 
14 class ImportedItem < Item
15   attr_reader :import_duty
16 
17   def initialize(base_price, tax_rate, import_duty)
18     super(base_price, tax_rate)
19     @import_duty = import_duty
20   end
21 
22   def tax_rate
23     super + import_duty
24   end
25 end

スーパークラスでtax_rateのアクセサを定義したことで、オーバーライド可能となりtotalを再定義せずに済んだ。




comments powered by Disqus


© 2015 kyuden