「オブジェクト指向設計実践ガイド Rubyでわかる進化しつづける柔軟なアプリケーションの育て方」の2章の中身で一点気になった点を質問させてください。
2章では、以下のコードは良くないコードとして紹介されていました。
code1
1class Gear 2 def initialize(chainring, cog) 3 @chainring = chainring 4 @cog = cog 5 end 6end 7 8 def ratio 9 @chainring / @cog.to_f # <-- 破滅への道 10 end 11end
上のコードではなく、次のようにattr_renderを使ってカプセル化すべきだとあります。
code2
1class Gear 2 attr_reader :chainring, :cog 3 def initialize(chainring, cog) 4 @chainring = chainring 5 @cog = cog 6 end 7end 8 9 def ratio 10 chainring / cog.to_f 11 end 12end
このようにする理由として、@cogのインスタンス変数が10箇所で参照されていたとすると、@cogを修正する必要が生じた場合、修正するために何箇所ものコードを変更する必要があるからとあります。
しかしながら、もし変更するとしてもコード①のinitializeメソッドを修正するだけでやりたい動きができるのではないでしょうか。実際やってみましたが、問題なく動きました。
上のような例の場合、直接インスタンス変数を参照しに行く書き方が良くない理由をご教授いただけたらと思います。
何卒、宜しくおねがいします。
回答3件
あなたの回答
tips
プレビュー