Hitsuji_monのブログ~ 村上春樹のあれ ~

文学好きな組み込み系エンジニア

【#100DaysOfCode】10日目「作りながら学ぶRuby入門」第12章 課題 〜書けない理由〜

昨日(5/25)の分の記録。
色々あってあんま出来なかった、という言い訳!

Day 10

・「作りながら学ぶRuby入門」12章 課題

蔵書管理アプリケーションに【検索機能】を追加

さらっと実装したかったけど、出来なかったので悔しい。
とりあえず写経しただけになっていたことを感じ、反省

書けなかった理由

  • アプリケーションで呼び出す際の動きをイメージできてない
  • (C言語的には) 必要なモジュールを【適切なステップで】考えることができていない

問題点:書けない理由

  • 検索条件のクラスをどこの依存関係に追加するか
    • C言語の【変数の寿命・スコープ】みたいなもんで、変な階層のところにクラスをたしたら、インスタンスのメソッドを呼び出せない
  • 比較条件ってRubyでどう書くんだっけ?
    • if文のTrue,Falseを変数に格納したい(これはC的な考えなのか?)

改善方法
次のようなステップに分けて取り組む

  • まずは小さいモジュールに分けて、一つずつ機能を書く
    • まずは小さく回す:Cでも慣れてる取り組み方
  • 上記モジュールを外から呼び出す
    • 動きのイメージを具体的にする
  • ここまでだと、依存関係を盛り込めてない
    • 内部に取り込んで、構造を今一度考える

Cだと下手に外から作りすぎると、ポインタを色々変えたり面倒だけど。。
その点、Rubyのクラスでまとめる書き方は直しやすい



ということで、【クラス外部から検索メソッドを実行】するだけのコードが以下のやつ。
昨日はこれだけ〜〜。

# 「作りながら学ぶRuby入門」第12章
=begin
--------------------------------------
まず、「クラス外部から検索を行うだけ」のコード
--------------------------------------
=end
require 'date'

# 蔵書1冊分の蔵書データのクラスを作る
class CharInfo
    def initialize( character )
        @character = character
    end

    # 最初に検討する属性に対するアクセサを提供する
    attr_accessor :character
    
    # BookInfoクラスのインスタンスの文字列を返す
    def to_s
        "#{@character}"
    end
    
    # 蔵書データを書式をつけて出力する操作を追加する
    def toFormattedString( sep = "\n" )
        "文字列名: #{@character}#{sep}"
    end
end



# 複数冊の蔵書データを登録する
Char_infos = Hash.new
Char_infos["testChar"] = CharInfo.new(
    "Ruby2009",
    )

Char_infos["compareChar"] = CharInfo.new(
    "Haruki2019"
    )

Char_infos["compareChar2"] = CharInfo.new(
    "testChar2"
)

Char_infos["copyChar"] = CharInfo.new(
    "Ruby2009"
)

# 登録した蔵書データを文字列表現で1冊ずつ出力する
## valueがBookInfoクラスのインスタンスを担っていることに注意
Char_infos.each { |key, value|
    puts "#{key}: #{value.to_s}"
}

# 蔵書データを検索する
puts("蔵書データの検索結果")
puts ("include?")
puts Char_infos.include? ("Ruby2009")
puts Char_infos.include? ("compareChar")
puts Char_infos.include? ("compareChar2")
puts Char_infos.include? ("copyChar")
puts

## ハッシュから検索した蔵書データを取り出す
puts Char_infos["testChar"].character
puts Char_infos["compareChar"].character
puts Char_infos["compareChar2"].character
puts Char_infos["copyChar"].character

# 指定したキーのハッシュを変数に格納する
compareChar_var = Char_infos["compareChar"]
puts compareChar_var