第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