はてなブログだと設定からはてな記法を使う設定にしないと綺麗にソースコード貼れなかったのね・・・
そんなこんなで引き続き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円なんですよ奥さん。
とりあえず耳が寒い冬場のうちは重宝しそう。