そんな今日この頃でして、、、

コード書いたり映画みたり。努力は苦手だから「楽しいこと」を探していきたい。

Rubyのお勉強 第14章「蔵書管理アプリケーションもクラスで構成しよう」&第15章「クラスを使った蔵書管理アプリケーションのまとめ」

はてなブログだと設定からはてな記法を使う設定にしないと綺麗にソースコード貼れなかったのね・・・


そんなこんなで引き続きRubyのお勉強。

作りながら学ぶRuby入門 第2版

作りながら学ぶRuby入門 第2版


第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ならこうやれるのに・・・」みたいなコマンドがすっと出てこないあたり、まだまだ勉強することは多そうだ。

                                                            • -

余談

今まで愛用していたイヤホンが断線してしまったので、どこぞのまとめでオススメされていた↓のヘッドホンを買ってみた。

ヘッドホン C515H ホワイト C515H-WH

ヘッドホン C515H ホワイト C515H-WH

正直な所さほど音質にこだわりがある方ではないが、これは確かにつけた時に「おっ」と思える。
少なくともデザイン重視で買った8000円のヘッドホンよりは明らかに良い音がする。

あまりガチっぽい見た目じゃないので、いかにも音楽好きアピールなしゃらくせぇ感がしないのも個人的には高評価。

コードも平型なので絡まりづらいのも良い。

あと、耳あての形がらメガネユーザーでも耳が痛くならないのが素晴らしい。


なんとこれで1500円なんですよ奥さん。

とりあえず耳が寒い冬場のうちは重宝しそう。