#本紹介アプリのリファクタリングをしてみました。
ありがたいことに、@scivolaさんよりご指摘いただきました。
まじくそ初心者の私に感謝しきれないくらいに細かいところまでフィードバックいただきました・・・。
他の方にもみていただければと思いアウトプットさせていただきます。
こちらの記事は、前回ご紹介させていただいた、
https://qiita.com/pontarou194/items/c9d4d7e64e6eadbd5de2
の続きで、下記にリファクタリングを主として実施しています。
#もともとのリファクタリングする前はこんなコードでした。
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つの習慣」
著者の名前は「コビー」
カテゴリは「ビジネス書」
#①ご指摘いただき、リファクタリングした箇所を以下にまとめます。
- number += 1を削除
- thenは不要、そして、elsifで改行せずそのまま記述。
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という変数名ではわかりずらくなるためです。
category_number =
case category
when "1"
"小説"
when "2"
"ノンフィクション"
when "3"
"ビジネス書"
else
"その他"
end
さらにすっきりしました。念の為、each.with_index以降のコードを残します。
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
中学の英語の問題ですね・・・。基礎英語ができていませんでした。
細かいご指摘までありがとうございます。)
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でシンタックスハイライトがつけられることを始めてしりました。
今回は以上となります。
最後までみていただきありがとうございます。