インスタンス変数の隠蔽
- インスタンス変数はアクセサメソッドで包み、直接参照しないようにする方がよい。
# 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つで済む。
参考
オブジェクト指向設計実践ガイド