【初心者向け】Rubyで超簡単な本紹介アプリを作ってみる（リファクタリング編）

#本紹介アプリのリファクタリングをしてみました。

ありがたいことに、@scivolaさんよりご指摘いただきました。
まじくそ初心者の私に感謝しきれないくらいに細かいところまでフィードバックいただきました・・・。

他の方にもみていただければと思いアウトプットさせていただきます。

こちらの記事は、前回ご紹介させていただいた、
https://qiita.com/pontarou194/items/c9d4d7e64e6eadbd5de2
の続きで、下記にリファクタリングを主として実施しています。


#もともとのリファクタリングする前はこんなコードでした。

```rb
puts "本の名前を登録"
    title= gets.chomp
puts "著者を登録"
    author = gets.chomp
puts "本のカテゴリを入力してください"
categorys = ["小説","ノンフィクション","ビジネス書"]

categorys.each.with_index(1) do |category, number|
  puts "#{number}：#{category}"
  number += 1
end
  category = gets.chomp

if category == "1" then
  category = "小説"
elsif 
  category == "2" then
  category = "ノンフィクション"
elsif
  category == "3" then
  category = "ビジネス書"
else
  category = "その他"
end

require "date"
time = DateTime.now
print(time.hour,"時",time.min,"分",time.sec,"秒\n")
puts "以下の通り登録しました"
puts "本の名前は「#{title}」"
puts "著者の名前は「#{author}」"
puts "カテゴリは「#{category}」"

```
多分上級者の方であれば、「みたらわかる、初心者なやつ」だとわかるかと思います・・・。



#念の為コードを実行すると、こんな感じの結果になります。
```
本の名前を登録
7つの習慣
著者を登録
コビー
本のカテゴリを入力してください
1：小説
2：ノンフィクション
3：ビジネス書
3
17時24分34秒
以下の通り登録しました
本の名前は「7つの習慣」
著者の名前は「コビー」
カテゴリは「ビジネス書」

```


#①ご指摘いただき、リファクタリングした箇所を以下にまとめます。

1. number += 1を削除
2. thenは不要、そして、elsifで改行せずそのまま記述。


```rb

puts "本の名前を登録"
    title= gets.chomp
puts "著者を登録"
    author = gets.chomp
puts "本のカテゴリを入力してください"
categorys = ["小説","ノンフィクション","ビジネス書"]

categorys.each.with_index(1) do |category, number|
  puts "#{number}：#{category}"

end
  category = gets.chomp

if category == "1" 
  category = "小説"
elsif category == "2" 
  category = "ノンフィクション"
elsif category == "3" 
  category = "ビジネス書"
else
  category = "その他"
end

require "date"
time = DateTime.now
print(time.hour,"時",time.min,"分",time.sec,"秒\n")
puts "以下の通り登録しました"
puts "本の名前は「#{title}」"
puts "著者の名前は「#{author}」"
puts "カテゴリは「#{category}」"

```

これだけでも少しすっきりしました。

#②ifではなくcase whenを使用する

※変数名にcategory_numberを使用
「1のとき○○、2のとき○○」 としたいため、categoryという変数名ではわかりずらくなるためです。

```rb

category_number =
  case category
  when "1"
    "小説"
  when "2"
    "ノンフィクション"
  when "3"
    "ビジネス書"
  else
    "その他"
  end
```

さらにすっきりしました。念の為、each.with_index以降のコードを残します。

```rb

 categorys.each.with_index(1) do |category_number, number|
  puts "#{number}：#{category_number}"

end
  category_number = gets.chomp

  category_number =
  case category_number
  when "1"
    "小説"
  when "2"
    "ノンフィクション"
  when "3"
    "ビジネス書"
  else
    "その他"
  end

require "date"
time = DateTime.now
print(time.hour,"時",time.min,"分",time.sec,"秒\n")
puts "以下の通り登録しました"
puts "本の名前は「#{title}」"
puts "著者の名前は「#{author}」"
puts "カテゴリは「#{category_number}」"

```

#③ifやcase whenを使わずに、1を選択した際○○と変換して表示させる。

（そして、categorysという変数名は、スペルとして正確には間違っていました。
○ categories
× categorys

中学の英語の問題ですね・・・。基礎英語ができていませんでした。
細かいご指摘までありがとうございます。）

```rb

puts "本の名前を登録"
    title= gets.chomp
puts "著者を登録"
    author = gets.chomp
puts "本のカテゴリを入力してください"
categories = ["小説","ノンフィクション","ビジネス書"]

  categories.each.with_index(1) do |category_names, number|
  puts "#{number}：#{category_names}"

end
category_names = gets.chomp

category_names = categories[category_names.to_i - 1] || "その他"

require "date"
time = DateTime.now
print(time.hour,"時",time.min,"分",time.sec,"秒\n")
puts "以下の通り登録しました"
puts "本の名前は「#{title}」"
puts "著者の名前は「#{author}」"
puts "カテゴリは「#{category_names}」"

```

（@scivolaさん、実はこれがわからなくてif文で書いてました。
これにて知見が深まりました、ありがとうございます。）

フィードバックいただいておりますが、実はこの場合
カテゴリを0と入力した場合、ビジネス書と表示されてしまいます。
0と入力した場合は本来「その他」と表示したいのですが、ビジネス書と表示されてしまいます。
諸々理由はこちらをご参照ください↓
https://qiita.com/pontarou194/items/c9d4d7e64e6eadbd5de2


||の使用についても、自分にとっては新しかったため、もっと深掘りして、ミニアプリ作って活用できるようにしようと思います。

PS.
Qiitaでシンタックスハイライトがつけられることを始めてしりました。
```のあとにrbとつければいいのですね。

今回は以上となります。

最後までみていただきありがとうございます。