第27回 Ruby勉強会@関西

参加してきました。演習の回答は例によって無駄に長かったり、無駄な機能が付いていたりします。プログラムを書き慣れていないため、書いているそばからメソッドのインタフェース部分を書き換えてしまい、時間がかかりまくった上に、統一感のないコードになっています・・・
ある程度書くことに慣れてきたら、設計というかデザインパターンを復習した方が良さそうです。

shian.rb
#!ruby -Ku

class Shain
  attr_accessor :kihonkyu 

  ROLE = "社員"
  HOW_STANDUP = "立ち"
  AMP = 1
  
  def self.shain?(q)
    begin
      q ? self.const_get(q.to_s).ancestors.include?(self) : nil
    rescue => e
      false
    end
  end
  
  def self.create(h = {})
    names = h[:names] || [nil]
    names.map { |name|
      h[:name] = name
      shain = self.new(h)
    }
  end
  
  def initialize(h = {})
    @name = h[:name]
    @role = self.class::ROLE
    @how_standup = self.class::HOW_STANDUP
    @amp = self.class::AMP
    @kihonkyu = h[:kihonkyu] || 15
  end
  
  def keisho
    if @name and !@name.empty?
       "#{@role}#{@name}" 
    else
      @role
    end
  end
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
  def standup
    "#{keisho }#{@how_standup}ました。"
  end
  
  def kyuryo(_kihonkyu = @kihonkyu)
    sl = _kihonkyu * @amp
    "給料は #{sl} 円です。"
  end
  
  def my_kyuryo(_kihonkyu = @kihonkyu)
    _kihonkyu * @amp
  end
  
  def bonus(_kihonkyu = @kihonkyu)
    sl = my_kyuryo(_kihonkyu) * 4
    "ボーナスは #{sl} 円です。"
  end
  
end

class Tanto < Shain
  ROLE = "担当"
  HOW_STANDUP = "普通に起立し"
  AMP = 1
end

class Shunin < Shain
  ROLE = "主任"
  HOW_STANDUP = "すばやく立ち"
  AMP = 2
end

class Bucho < Shain
  ROLE = "部長"
  HOW_STANDUP = "だるそうに立ち"
  AMP = 3
end

class Torishimariyaku < Shain
  ROLE = "取締役"
  HOW_STANDUP = "ふんぞりかえって立ち"
  AMP = 4
end
enshu4.rb
#!ruby -Ku

require 'shain'

def output str
  puts NKF.nkf('-Ws', str)
end

module Enshu4
  def self.main_1
    base = 100
    [Tanto, Shunin, Bucho, Torishimariyaku].each do |shain_cls|
      shain = shain_cls.new
      output( shain.standup )
      output( shain.kyuryo(base) )
      output( shain.bonus(base) )
    end
  end
  
  def self.main_2
    argvs = [ [], [nil], [''], %w(Tanto), %w(Shunin), %w(Bucho), %w(Torishimariyaku) ]
    namess = [ [], [nil], [''], ['hoge'], ['huga', nil], ['uuu', ''], ['aaa', 'iii'] ]
    
    argvs.zip(namess) do |argv, names|
      kihonkyu = 100
      puts "--\nargv: #{argv.inspect}\nname: #{names.inspect}"
      self.main_detail argv, kihonkyu, names
    end
  end
  
  def self.main_detail(argv, kihonkyu=25, names = nil)
   shains = []
    case Shain.shain?(arg = argv.shift)
    when nil
      output "引数がありません"
      shains << Shain.new
    when true
      shains = const_get(arg).create(:names => names, :kihonkyu => kihonkyu)
    else
      output "引数が正しくありません"
      shains << Shain.new
    end
    shains.each do  |shain|
      shain.kihonkyu = kihonkyu
      output( shain.standup )
      output( shain.kyuryo ) if kihonkyu.to_i > 0
      output( shain.bonus )  if kihonkyu.to_i > 0
    end
  end
  
  def self.main(argv)
    role = argv[0] || nil
    kihonkyu = (argv[1] || 30).to_i
    names = (argv.size >= 3) ? argv[2 .. -1] : nil
    main_detail(argv, kihonkyu, names)
  end
end

if $0 == __FILE__
  MyKconv.incode = 'utf'
  if $debug
    Enshu4.main_1
    Enshu4.main_2
    puts
  end
  Enshu4.main ARGV
end