78
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rubyスクリプトにもmainメソッドを定義するといいかも、という話

Last updated at Posted at 2021-01-24

はじめに

Ruby(Railsではない、単純なRubyスクリプト)では、以下のようにトップレベルで変数を宣言したり、様々な処理を記述したりすることができます。

require 'date'

def play
  puts 'あそぶよー'
end

def study
  puts '勉強するよー'
end

# トップレベルで変数宣言
today = Date.today

# トップレベルで条件分岐とメソッド呼び出し
if today.sunday?
  play
else
  study
end

上のコードの問題点

もちろんこれでもよいと言えばよいのですが、以下のような問題点もあります。

コードリーディング時に下から上に進まないといけない

プログラムとしてのロジックが開始されるのは today = Date.today の行からですが、プログラムの構造上、どうしてもメソッド定義(def playdef study)の方を先に書かざるを得なくなります。

よって、コードリーディング時(またはコードレビュー時)は先にファイルの下に進んでから、メソッドの内容を確認するために上スクロールしなければならなくなります。

Screen Shot 2021-01-24 at 17.28.24.png

できれば実行の起点となるコードはできればスクリプトの先頭に書いて、上から下へ文章っぽく自然に読みたいところです。

可読性の低いコードを書いてもRubocopに指摘されない

コードレビューを自動化するためにRubocopを導入している人も多いと思います。

しかし、トップレベルに書いたロジックはいくらダラダラと何行に渡って書いても、Rubocopに「長すぎる」と怒られることがありません。
その結果、他の人にとって理解しづらいメソッドを書いてしまう恐れがあります。

Screen Shot 2021-01-24 at 17.31.13.png

これがメソッドになっていれば、メソッドの長さをRubocopがチェックしてくれるはずです。

そこでmainメソッドを導入してみる

こういった問題を避けるため、僕は明示的な main メソッドを導入することが多いです。

require 'date'

# トップレベルに書いていたロジックをmainメソッドに移動させる
def main
  today = Date.today
  if today.sunday?
    play
  else
    study
  end
end

def play
  puts 'あそぶよー'
end

def study
  puts '勉強するよー'
end

# トップレベルではmainメソッドの呼び出しを最後に書くだけ
main

mainメソッドを導入するメリット

main メソッドを導入すると、実行の起点となるコードをスクリプトの先頭に書くことができるので、コードを上から下へ順に読み下しやすくなります。
また、 main メソッドが無駄に長くなるとRubocopのチェックで「メソッド長すぎ!」と指摘されるようになります。

なぜmainという名前なのか

main というメソッド名は任意です。 start でも run でも execute でも何でも構いません。
ただ、C言語やJavaなどでは main メソッド( main 関数)から処理を開始するようになっています。

#include <stdio.h>

// C言語
int main(void)
{
    puts("Hello, world!");
    return 0;
}
// Java
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

そのため、 main という名前にしておけば他の開発者も「あ、ここから処理が始まるんだな」と推測しやすくなると思い、この名前を付けるようにしています。

まとめ

というわけで、この記事ではRubyスクリプトにmainメソッドを導入する理由やメリットについて書いてみました。

メソッド定義がいくつかあって、1画面に収まらないぐらいの長さのRubyスクリプトを書く場合は、 main メソッドを導入して可読性を上げることを検討してみてください😉

あわせて読みたい

mainメソッドを導入したら、次はメソッドの並び順にも気を配ってみましょう。

【新人プログラマ応援】メソッドは呼ぶ側を手前に、呼ばれる側を後ろに定義しよう - Qiita

78
28
4

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
78
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?