第 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