はてなブログだと設定からはてな記法を使う設定にしないと綺麗にソースコード貼れなかったのね・・・
そんなこんなで引き続きRubyのお勉強。

- 作者: 久保秋真
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2012/11/26
- メディア: 単行本
- クリック: 4回
- この商品を含むブログ (1件) を見る
第14章では、前章までで作成した蔵書管理アプリケーションについて、データだけではなく動作も含めてクラス化を行った。
今回作ってるような単一のアプリだと動作までクラス化してしまう必然性は特に無いが、もっと大規模で複雑なものを作る場合に有効だと思われる。
今回新たに出てきたのはcase文。
CでいうところのSwitch-Case文みたいなものだ。
case
when 条件1
動作1
when 条件2
動作2
else
動作3
end上記のように記述する。
書籍内のサンプルのコードのインデントが狂っていて若干イラっとした。
もっとも、この手の構文ってどの言語でもインデントの正解がいまいち分からないのだけれども。
そして15章では3部のまとめと14章で作成したアプリに検索機能を追加する課題が出される。
僕は下記のような感じで実装してみた。
# -*- coding: utf-8 -*-
require 'date'
class BookInfo
def initialize( title, author, page, publish_date )
@title = title
@author = author
@page = page
@publish_date = publish_date
end
attr_accessor :title, :author, :page, :publish_date
def to_s
"#{@title}, #{@author}, #{@page}, #{@publish_date}"
end
def toFormattedString( sep = "\n" )
"書籍名: #{@title}#{sep}著者名: #{@author}#{sep}ページ数: #{@page}ページ#{sep}発行日: #{@publish_date}#{sep}"
end
end
class BookInfoManager
def initialize
@book_infos = {}
end
def setUp
@book_infos["Yamada2005"] = BookInfo.new(
"実践アジャイル ソフトウェア開発法とプロジェクト管理",
"山田 正樹",
248,
Date.new( 2005, 1, 25 ) )
@book_infos["Ookba2006"] = BookInfo.new(
"入門LEGO MINDSTORMS NXT レゴブロックで作る動くロボット",
"大庭 慎一郎",
164,
Date.new( 2006, 12, 23 ) )
end
def addBookInfo
book_info = BookInfo.new( "", "", 0, Date.new )
print "\n"
print "キー:"
key = gets.chomp
print "書籍名:"
book_info.title = gets.chomp
print "著者名:"
book_info.author = gets.chomp
print "ページ数:"
book_info.page = gets.chomp.to_i
print "発刊年:"
year = gets.chomp.to_i
print "発刊月:"
month = gets.chomp.to_i
print "発刊日:"
day = gets.chomp.to_i
book_info.publish_date = Date.new( year, month, day )
@book_infos[key] = book_info
end
def listAllBookInfos
puts "\n---------------"
@book_infos.each { |key, info|
print info.toFormattedString
puts "\n---------------"
}
end
def run
#検索メニューの追加
while true
print "
1. 蔵書データの登録
2. 蔵書データの表示
3. 蔵書データの検索
9. 終了
番号を選んでください(1,2,3,9):"
num = gets.chomp
case
when '1' == num
addBookInfo
when '2' == num
listAllBookInfos
when '3' == num
searchBookInfo
when '9' == num
break;
else
end
end
end
#追加した検索メソッド
def searchBookInfo
book_info = BookInfo.new( "", "", 0, nil )
print "\n"
print "書籍名:"
book_info.title = gets.chomp
print "著者名:"
book_info.author = gets.chomp
print "ページ数:"
book_info.page = gets.chomp.to_i
print "発刊年:"
year = gets.chomp.to_i
print "発刊月:"
month = gets.chomp.to_i
print "発刊日:"
day = gets.chomp.to_i
if ( year > 0 and month > 0 and day > 0 )
book_info.publish_date = Date.new( year, month, day )
end
puts "---------------\n"
@book_infos.each { |key, info|
hit = 1
if ( book_info.title != "" and book_info.title != info.title)
#puts "#{key} title NG"
hit = 0
end
if ( book_info.author != "" and book_info.author != info.author)
#puts "#{key} author NG"
hit = 0
end
if ( book_info.page > 0 and book_info.page != info.page)
#puts "#{key} page NG"
hit = 0
end
if ( book_info.publish_date != nil and book_info.publish_date != info.publish_date)
#puts "#{key} pd NG"
hit = 0
end
if (hit == 1)
print info.toFormattedString
puts "---------------\n"
end
}
end
end
book_info_manager = BookInfoManager.new
book_info_manager.setUp
book_info_manager.run
検索条件の入力と書籍データの登録を共通化させるとか色々やりようは思いついたけど、単なる例題なので今回はサンプルの形を活かしつつベタに実装。
「Perlならこうやれるのに・・・」みたいなコマンドがすっと出てこないあたり、まだまだ勉強することは多そうだ。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
余談
今まで愛用していたイヤホンが断線してしまったので、どこぞのまとめでオススメされていた↓のヘッドホンを買ってみた。

- 出版社/メーカー: CRESYN
- 発売日: 2011/09/29
- メディア: エレクトロニクス
- 購入: 4人 クリック: 28回
- この商品を含むブログを見る
正直な所さほど音質にこだわりがある方ではないが、これは確かにつけた時に「おっ」と思える。
少なくともデザイン重視で買った8000円のヘッドホンよりは明らかに良い音がする。
あまりガチっぽい見た目じゃないので、いかにも音楽好きアピールなしゃらくせぇ感がしないのも個人的には高評価。
コードも平型なので絡まりづらいのも良い。
あと、耳あての形がらメガネユーザーでも耳が痛くならないのが素晴らしい。
なんとこれで1500円なんですよ奥さん。
とりあえず耳が寒い冬場のうちは重宝しそう。