LoginSignup
7
8

More than 3 years have passed since last update.

Rubyで土日(週末)を判定するプログラム 〜いかに初心者な書き方から脱するか〜

Last updated at Posted at 2021-04-14

やりたいこと

どうも、初心者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?

学ぶべきこと

  • 既存のクラスに自分でメソッドを作って追加してしまう!:laughing:(今回だとTimeクラス
  • 「オブジェクト指向的にもこれが一番綺麗」らしい。
  • これをメタプログラミングと呼ぶらしい。

4. ダメ押しの一歩。祝日対応!

今回の要件とは少し外れますが、祝日まで判定したい場合はRailsにはこんなgemがあるそうな。

最後に

何かご指摘などあればぜひよろしくお願いします。

7
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8