第 27 回 Ruby/Rails 勉強会 の演習問題
ボーナスは給料の4倍と書いてあるんだけど実行例を見ると 基本給の4倍になってる。
でも給料の4倍の方が面白いのでそのままやってみた。
shacho1.rb
$KCODE = "u" require "Shain1" #p = eval("#{ARGV[0]}.new") p = Object.const_get(ARGV[0]).new p.standup p.kyuryo = ARGV[1].to_i p.kyuryo p.bonus
shain1.rb
class Shain def standup; end def kyuryo; end def price; end def kyuryo=(base); @base = base; end def bonus puts "ボーナスは#{self.price*4}です" end end class Tanto < Shain def standup puts "担当が普通に起立しました" end def kyuryo puts "給料は#{self.price}です" end def price; @base; end end class Shunin < Shain def standup puts "主任が素早くたちました" end def kyuryo puts "給料は#{self.price}です" end def price; @base * 2; end end class Bucho < Shain def standup puts "部長がだるそうにたちました" end def kyuryo puts "給料は#{self.price}です" end def price; @base *3 ; end end class Torishimariyaku < Shain def standup puts "取締役がふんぞりかえってたちました" end def kyuryo puts "給料は#{self.price}です" end def price; @base *4;end end
追記:
かえってきてから見てみたら見事なまでに非DRYだ。下から順に設計、ではなくて課題1、2、3と、詰めvimしてるとこういう罠が。
def kyuryoは全部 Shain (baseクラス)にまとめるべきですね。典型的なので恥をさらし残しとこう。
下が直した版。
class Shain def standup; end def price; end def kyuryo=(base); @base = base; end def bonus puts "ボーナスは#{self.price*4}です" end def kyuryo puts "給料は#{self.price}です" end end class Tanto < Shain def standup puts "担当が普通に起立しました" end def price; @base; end end class Shunin < Shain def standup puts "主任が素早くたちました" end def price; @base * 2; end end class Bucho < Shain def standup puts "部長がだるそうにたちました" end def price; @base *3 ; end end class Torishimariyaku < Shain def standup puts "取締役がふんぞりかえってたちました" end def price; @base *4;end end