##インスタンス変数の隠蔽
- インスタンス変数はアクセサメソッドで包み、直接参照しないようにする方がよい。
# bad
class Gear
def initialize(chainring, cog)
@chainring = chainring
@cog = cog
end
def ratio
@chainring / @cog.to_f # ← bad!
end
end
# good
class Gear
attr_reader :chainring, :cog
def initialize(chainring, cog)
@chainring = chainring
@cog = cog
end
def ratio
chainring / cog.to_f
end
end
アクセサメソッドattr_reader
を使うと、Rubyが下記のようなラッパーメソッドを定義してくれる。
def cog
@cog
end
###隠蔽するメリット
インスタンス変数@chainring
が何十箇所で使われていた場合、それらすべてを変更しなくてはならない。
しかし、attr_reader
で定義していた場合、変更箇所は1つで済む。
##参考
オブジェクト指向設計実践ガイド