やりたいこと
どうも、初心者Ruby書きです。
先日、モジモジしながら社内で
「土日を判定するRubyのメソッドを書いたのですが、どうも初心者臭さが抜けなくて...」
と、投げかけたところ、鬼殺隊の柱のような先輩たちが優しく教えてくれて、そのSlackのやりとりが超楽しかったのでメモ。
僕のような未経験者であっても基本的人権を尊重してくれて、楽しく教えてくれる会社、それが株式会社Fusicです。
実装!
今回の要件は下記です。
(1) 今日が土日かを判定する(日本時間で!)
(2) 土日ならば処理を終了する
0. 初心者(出発点)
私が違和感を感じながらも提示したコードがこちらです。
やりたいことはできるけど、絶対にダサい!でも、どう改善したらいいかわからない!
def weekend?
today = Time.now.localtime("+09:00") # Time#localtimeでUnix時間を日本時間に合わせる
if today.saturday?
true
elsif today.sunday?
true
else
false
end
end
return if weekend?
こんなコード晒すのが恥ずかしいですが...
これからこれを一歩ずついい感じにしていきます。
1. とりま初心者から一歩抜け出す
ひとまず、8行あった土日判定の処理がたったの3行になります...
def weekend?
today = Time.now.localtime("+09:00")
return true if today.saturday? || today.sunday?
false
end
return if weekend?
学ぶべきこと
- ifの条件文はOR(
||
)文で書けるので一行でイケる - if文はネストしやすいので
return if 条件
の形が見やすくなって善い
知っていたのに、ここでの使い方が思いつかなかったです。悔しい!恥ずかしい!
2. 初心者から二歩抜け出す
もう一行減らせます。
def weekend?
today = Time.now.localtime("+09:00")
today.saturday? || today.sunday?
end
return if weekend?
学ぶべきこと
- Rubyのメソッドは
return
を付けなくともその値を返すので、return true
とかfalse
とか書かなくて良い - プロを目指す人のためのRuby入門の一節も復習↓
Rubyは最後に評価された式がメソッドの戻り値になるのが特徴です。returnのようなキーワードは不要です。(中略)Rubyではreturnを使わない書き方の方が主流です。
「プロを目指す人のためのRuby入門」伊藤淳一著p37
3. さらにもう一歩。オープンクラス!
class Time
def weekend?
saturday? || sunday?
end
end
today = Time.now.localtime("+09:00")
return if today.weekend?
学ぶべきこと
- 既存のクラスに自分でメソッドを作って追加してしまう!(今回だとTimeクラス)
- 「オブジェクト指向的にもこれが一番綺麗」らしい。
- これをメタプログラミングと呼ぶらしい。
4. ダメ押しの一歩。祝日対応!
今回の要件とは少し外れますが、祝日まで判定したい場合はRailsにはこんなgemがあるそうな。
最後に
何かご指摘などあればぜひよろしくお願いします。