30分以内でつくれるアプリでRubyの練習をする

Rubyの練習のため、毎日簡単なアプリケーションをつくってますが、
レベルアップにとてもよかったので、記事にしてみます。

# この記事はこんな人に向いてます
- Ruby初心者
- 毎日コードを書く練習をしたいが、何をしたらよいかわからず困っている人
- Rubyを書くことを頭で理解するだけでなく、体で覚えたい人

# 練習の方針
- 30分以内でつくれるアプリケーションを題材にする
- 最初から最後まで通しでできるものをつくる
- 毎日の練習で使えるくらいの小規模なものをつくる

毎日続けることなので、あまり大きなものを作る必要はないですね。

# 仕様
- ぱっと作って確認できるコンソールアプリとする
- 本のレビューとして以下の3つを入力できる  
 - タイトルを入力できる
 - 本の評価を5段階で入力できる
 - 本の感想を入力できる
- 入力したレビューを参照できる

# アプリケーションの開発
## 1. メイン処理をつくる
まずはアプリケーションの骨組みをつくります

```ruby
LINE = "---------------"
class BookApp
  WRITE_REVIEW = 0
  DISPLAY_REVIEW = 1
  END_PROGRAM = 2
end

while true do
  puts "実行したい処理の番号を入力してください"
  puts "[#{BookApp::WRITE_REVIEW}] 本のレビューを書く"
  puts "[#{BookApp::DISPLAY_REVIEW}] 本のレビューを見る"
  puts "[#{BookApp::END_PROGRAM}] プログラムを終了する\n#{LINE}"

  operation = gets.chomp.to_i

  case operation
  when BookApp::WRITE_REVIEW
    # reviewを書く
  when BookApp::DISPLAY_REVIEW
    # reviewを表示する
  when BookApp::END_PROGRAM
    exit
  else
    puts "入力値が正しくありません"
  end
end
```
ユーザーの入力を受け付け、実行する処理を決定します。

## 2. レビューの投稿処理をつくる
続いて、本のレビューの投稿処理をつくります。

```ruby
def write_review(posts)
  post = {}
  puts "本のタイトルを入力してください"
  post[:title] = gets.chomp

  puts "本の評価(1 ~ 5)を入力してください"
  post[:point] = gets.chomp.to_i

  if post[:point] < 1 || post[:point] > 5
    puts "評価は1 ~ 5で入力してください"
    return
  end

  puts "本の感想を一言入力してください"
  post[:review] = gets.chomp

  posts << post
end

posts = []
```

レビューに必要な3つの要素（タイトル、評価、感想)をユーザーに入力させて、
投稿を扱う配列``posts``を返します。

メイン処理につくった関数を埋め込みます。

```ruby
case operation
  when BookApp::WRITE_REVIEW
    write_review(posts)　# reviewを書く
  when BookApp::DISPLAY_REVIEW
    # reviewを表示する
  when BookApp::END_PROGRAM
```

## 3. レビューの表示処理をつくる

最後に、投稿したレビューを表示する処理をつくります。

```ruby
def display_review(posts)
  index = 0
  posts.each do |post|
    puts "[#{index}] #{post[:title]}"
    index += 1
  end

  puts "見たいレビューの番号を入力してください"
  input = gets.chomp.to_i
  item = posts[input]

  puts LINE
  puts "タイトル: #{item[:title]}"
  puts "評価: #{item[:point]}"
  puts "感想: #{item[:review]}"
  puts LINE
end
```
投稿したレビューのタイトルを一覧表示して、見たいレビューの番号をユーザに入力させます。
指定された投稿について、3つの要素(タイトル、評価、感想）を画面に表示します。

忘れずにメイン処理も更新しましょう。

```ruby
while true do
  when BookApp::WRITE_REVIEW
    write_review(posts)
  when BookApp::DISPLAY_REVIEW
    display_review(posts)　　#　reviewを表示する
  when BookApp::END_PROGRAM
    exit
  else
```

## コード全体

```ruby
LINE = "---------------"
class BookApp
  WRITE_REVIEW = 0
  DISPLAY_REVIEW = 1
  END_PROGRAM = 2
end

def write_review(posts)
  post = {}
  puts "本のタイトルを入力してください"
  post[:title] = gets.chomp
  puts "本の評価(1 ~ 5)を入力してください"
  post[:point] = gets.chomp.to_i

  if post[:point] < 1 || post[:point] > 5
    puts "評価は1 ~ 5で入力してください"
    return
  end

  puts "本の感想を一言入力してください"
  post[:review] = gets.chomp

  posts << post
end

def display_review(posts)
  index = 0
  posts.each do |post|
    puts "[#{index}] #{post[:title]}"
    index += 1
  end

  puts "見たいレビューの番号を入力してください"
  input = gets.chomp.to_i
  item = posts[input]

  puts LINE
  puts "タイトル: #{item[:title]}"
  puts "評価: #{item[:point]}"
  puts "感想: #{item[:review]}"
  puts LINE
end

posts = []

while true do
  puts "実行したい処理の番号を入力してください"
  puts "投稿レビュー数: #{posts.length}"
  puts "[#{BookApp::WRITE_REVIEW}] 本のレビューを書く"
  puts "[#{BookApp::DISPLAY_REVIEW}] 本のレビューを見る"
  puts "[#{BookApp::END_PROGRAM}] プログラムを終了する\n#{LINE}"

  operation = gets.chomp.to_i

  case operation
  when BookApp::WRITE_REVIEW
    write_review(posts)
  when BookApp::DISPLAY_REVIEW
    display_review(posts)
  when BookApp::END_PROGRAM
    exit
  else
    puts "入力値が正しくありません"
  end
end

```


# 毎日練習することで感じた効果
- Rubyってどう書けばいいんだっけ、って思わなくなった
- 以前より人の書いたコードがわかるようになった
- 開発するスピードがあがった

ちょっとした空き時間でもできるので、試してみてください。
タイムアタックなんかやってみると面白いかも知れませんね。