TECH EXPERT 23日目 Ruby文法 補足
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"
オブジェクト指向に正解はない。
アプリケーションにおける役割ごとにクラスがあり
そのクラスはその役割が持つ処理以上のことはできない。