はじめに
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 play
やdef study
)の方を先に書かざるを得なくなります。
よって、コードリーディング時(またはコードレビュー時)は先にファイルの下に進んでから、メソッドの内容を確認するために上スクロールしなければならなくなります。
できれば実行の起点となるコードはできればスクリプトの先頭に書いて、上から下へ文章っぽく自然に読みたいところです。
可読性の低いコードを書いてもRubocopに指摘されない
コードレビューを自動化するためにRubocopを導入している人も多いと思います。
しかし、トップレベルに書いたロジックはいくらダラダラと何行に渡って書いても、Rubocopに「長すぎる」と怒られることがありません。
その結果、他の人にとって理解しづらいメソッドを書いてしまう恐れがあります。
これがメソッドになっていれば、メソッドの長さを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メソッドを導入したら、次はメソッドの並び順にも気を配ってみましょう。