TECH EXPERT 23日目 Ruby文法 補足

  1. 条件分岐処理 if以外
  2. 繰り返し処理 each 以外
  3. ブロックについて
  4. Ruby クラスの理解 効率的なコードを書く
  5. Rubyに最初から用意されてる機能
  6. 例外処理
  7. オブジェクト指向 ⭐︎

 

1.条件分岐処理 if以外

 

case文 #並列する条件が多数ある場合 ifより記述がシンプルに。

case 対象のオブジェクトや式  #この部分が条件の対象
when 値1
# 値1に一致する場合に実行する処理
when 値2
# 値2に一致する場合に実行する処理
when 値3
# 値3に一致する場合に実行する処理
else
# どれにも一致しない場合に実行する処理
end

 

2.繰り返し処理 each 以外

while (ワイル) 繰り返し構文 #指定した条件が真である間、処理を繰り返す。

while 条件式
# 条件が真である時に繰り返す処理
end

 

※この条件式は無限ループになる場合もある。 変化する変数 number+=1  を入れない場合など↓

if文などの条件分岐とbreakを使う。

例:

if number == 5
break
end

 

 

3.ブロックについて

ages.each do |age|     これの do~end までが 「ブロック」
puts age           |age| のage はブロック引数と呼ぶ

end

↓ do~end 以外に{} を使う書き方もある。

ages.each {|age| puts age}

 

 

自分でdef定義したメソッドでブロックを使う。

 

yield:メソッドに渡されたブロックを実行するための命令。

Rubyの文脈においては「取って代わられる」に近い。引数を守る門番

 

使い方

def greeting(&block)  #ブロックの引数を明確に受けとるため引数に”&”をつける 
puts "Hello"
block.call("Goodbye")
end

greeting do |text|
puts text
end

# ターミナル出力結果
# Hello
# Goodbye

 

 

4.Ruby クラスの理解 効率的なコードを書く

 

クラスの継承 親クラス→子クラス  

 

継承のやり方

class PoliceCar < Car    ←のように 新しいクラス < 元となるクラス と記述

end

 

継承されるもの 利点

・親のインスタンス変数
・親のインスタンスメソッド

※子クラスに新しくメソッドも追加できる。

 

メソッドの上書き可能

やり方→ 親クラスにあるメソッドを子クラスで定義する

メソッドの オーバーライドと呼ぶ。

 

 

クラス継承メリット

継承すれば、親クラスで定義されているメソッドを使えるようになる。

あるカテゴリーの共通要素を親クラスに定義して継承させれば、同じメソッドを何度も定義する必要がなくなり効率的である。

 

 

5.Rubyに最初から用意されてる機能

→ライブラリ

 

ライブラリの種類 3つ

標準ライブラリ インストール不要 明示的に記述が必要 例 Date
組み込みライブラリ インストール不要 例 String
外部ライブラリ(gemのこと) インストール必要 記述必要

 

使い方 (組み込みライブラリは読み込みいらず)

 

標準ライブラリ

「require ライブラリ名」

 

require "date"

puts Date.today  #Dateクラスに使える todayメソッド の実行

# ターミナル出力結果
# 20xx-xx-xx(本日の日付が表示)

 

 


外部ライブラリ(gemのこと)

①使いたいgemをインストールする

 

ターミナル「gem install gemの名前」


②インストールしたgemをrequireで読み込む

「require ライブラリ名」 標準ライブラリと同じ

 

 

6.例外処理

 

例外処理の必要性

プログラムが正しくても環境、ユーザーの動作でエラーを引き起こしてしまうことは多々ある。→その結果や状態を例外(期待されるものと異なる状況)と呼ぶ。

 

これを予期して、例外が発生したときに行う例外処理を定義しておく。

※例外処理をしておくことで緊急事態を早期復旧させたり、カバーが可能。

 

 

1つ目「メインの処理に失敗したらそのときだけ別の処理を実行して、そのままメインの処理を続ける」

 

begin(ビギン):
beginは、例外となりそうな箇所を囲い処理を実行できる文法です。
どんな条件でも最低1回は処理を実行するため、例外処理を始めるときなどに使用します。

(例)
begin
# 例外が起きると想定される処理
end

 

例外になりそうな箇所を捉える必要がある?

rescue を使う #例外が発生しそうな部分をbeginから始まるブロックで囲み、ブロックの内部にrescueを記述して使用

 

rescue:発生した例外を捕捉し、例外が起こった際に呼び出される条件節です。

例外が起こったときに実施する処理。

 

raise(レイズ)
raiseは、例外を発生させることができる文法。
第一引数に発生させたい例外クラス、第二引数にエラーメッセージを記述して使用

「raise 発生させたい例外クラス, 'エラーメッセージ'」

 

※ログを残して原因を特定しやすくできる。効率よくプログラムする上では強スキル。

 

2つ目 「メインの処理に失敗したらそのときだけ別の処理を実行して、メインの処理すべてをなかったことにして中止する」

 

トランザクション #レコードの更新を行う複数の処理を一つにまとめて行う。

全ての処理の成功 or 全ての処理の失敗 の状態になる。

(例)

ActiveRecord::Base.transaction do
# 処理1
# 処理2
# ...
end

たとえば、ECサイトの購入処理では、「商品の料金支払い処理」「注文確定処理」を常に1つのまとまりとして考えられる。

トランザクションを利用することで、「料金の支払いに失敗したけど、商品は購入できた」「料金は支払ったけど、注文の確定に失敗し商品が届かなかった」といった事態を防ぐことが可能。

 

 

7.オブジェクト指向

 

オブジェクト指向

アプリケーションを作成時、登場する役割ごとに分けて実装する方針のことを言います。RubyなどのWebアプリケーションに使用される言語の多くが、オブジェクト指向で実装する必要がある。

オブジェクト指向のメリット

・役割ごとにオブジェクトを分けることで、実装がしやすくなる
・役割ごとにオブジェクトを分けることで、あとからコードを改変するときも、他のオブジェクトに影響しなくなる(コードの改変がしやすくなる)

 

クラスを考える際は、「このアプリケーションにおいて、どのような処理が存在するのか」に着目すると良さそう。

 

 

単一責任の原則

「1つのクラスは1つの振る舞いしか持たない」原則

これを遵守しないと意図のわからないアプリケーションになる。

 

クラスごとにディレクトリを分割して require で読み込みを行う 

require "./drink"

require "./vending_machine"
require "./user"

 

 

オブジェクト指向に正解はない。

アプリケーションにおける役割ごとにクラスがあり

そのクラスはその役割が持つ処理以上のことはできない。