前説
- 株式会社SUPER STUDIOの2022年Adventarの記事です。
- 7年ぐらいJava(Spring)を使っていたエンジニアが初めてRuby(Rails)を使ってみた所感のまとめです。
- JavaもRubyもどちらもまだまだ未熟者が書いた記事です。
- Javaの最新のバージョンもキャッチアップできてないのでちょっと知識が古いです。
- Javaの方がいいとか、Rubyの方がいいとか、対立煽りを助長するつもりはありません。
- 自分と同じでJavaばかり使ってきて、Rubyとかどんな感じなんかなあって思ってる人に読んでもらえたら幸いです。
Ruby(Rails)を使い始めて思ったことまとめ
- 型宣言が必要ない
- メソッドの引数にデフォルト値を設定できる
- メソッドの戻り値の型の定義が必要ない
- 最終行の結果がreturnされる
- 後置ifが使える
- if文の戻り値が設定できる
- ActiveRecordが便利
1個ずつ見ていきます。
型宣言が必要ない
これは解説不要かと思いますが、Rubyは動的型付け言語ですので、Javaのような静的型付け言語と違い型宣言が必要ありません。
// Javaの場合
Integer count = 0;
String text = "";
int i = 1;
TestClass testClass = new TestClass();
# Rubyの場合
count = 0
text = ''
i = 1
test_class = TestClass.new
のような感じ。
メソッドの戻り値を変数に代入する場合も、Javaの場合は変数の型と戻り値の型が一致している必要がありますが、
Rubyの場合はそれも不要です。
個人的にはこの変数今何入ってるんだっけ?ってなることもありますが、命名とか気をつければ問題ない範疇かなと思いました。
メソッドの引数にデフォルト値を設定できる
個人的にこれが一番Rubyやってて有用かなと思いました。
開発してて、色んな所から呼び出されているメソッドがあって、そのメソッドに特定の条件のときだけ処理を変えたい、もしくは処理を加えたい、ってことがあると思うんですが(ありますよね?)、
そういうときにメソッド引数に変数を追加して制御しようとしたとき(もっと良い解決策があるかは置いておいて)、
Javaだと呼び出し箇所に引数を追加する必要がある(もしくは他の呼び出し箇所に影響が無いよう別メソッドを定義するなど)のですが、
Rubyの場合はデフォルト値を定義できるので、他の呼び出し箇所に影響を与えることなく引数の追加ができます。
Javaの場合は、
// 修正前のメソッド
public void example(String hoge) {
// 何かしらの処理
}
上記のようなメソッドがあって
// 修正後のメソッド
public void example(String hoge, Boolean flag) {
if (flag) {
// flag == trueのときだけ実行される処理
}
// 何かしらの処理
}
このような修正をした場合、メソッドの呼び出し箇所全てに影響があります。
(そもそも設計が〜、とかそういう話は一旦なしでお願いいたします。)
Rubyの場合は、
# 修正前のメソッド
def example(hoge)
# 何かしらの処理
end
上記メソッドに同じようにflagを追加する場合
# 修正前のメソッド
def example(hoge, flag = false)
if flag
# flag == trueのときだけ実行される処理
end
# 何かしらの処理
end
このようにデフォルト値を設定することで、他の呼び出し箇所には影響なく引数の追加ができます。
メソッドの戻り値の型の定義が必要ない
先程の「メソッドの引数にデフォルト値を設定できる」の項でメソッドの定義のイメージを書きましたが、
動的型付け言語なのでRubyではメソッドの戻り値の型を定義する必要がありません。
Javaの場合は戻り値がない場合はvoid、ある場合はその型を定義する必要があるので、
これはめちゃめちゃ便利だなあと思いました。
最終行の結果がreturnされる
Javaの場合は
public int calc(int a, int b) {
return a + b;
}
のように明示的にreturnが必要ですが、Rubyの場合は
def calc(a, b)
a + b
end
このようにメソッドの最終行がreturnされるので、単純に最終行の結果をreturnしたい場合はreturnが不要です。
もちろんメソッド途中の分岐で明示的にreturnすることも可能です。
これに関しては好みが分かれると言うか、場合によっては予期せぬ値が返ることもあるので、ちょっと注意が必要な印象です。
後置ifが使える
Rubyは後置ifが使えます。Javaエンジニアの方には馴染みがないかも知れませんが、
ifの条件を満たしたときのみその行が実行される、みたいなイメージです。
特定に条件を満たしたときだけメソッドを呼び出すような処理の場合、
# 普通のif文
if flag
hoge.fuga
end
# 後置ifの場合
hoge.fuga if flag
のように書くことが出来ます。
1行でスッキリ書けるのでメソッドの見通しが良くなる反面、多用し過ぎは注意が必要かも知れません。
(余談ですが、ifに対してunlessというfalseの場合に実行される制御文もあります。)
if文の戻り値が設定できる
これは三項演算子みたいなもので
hoge = if flag
'hoge'
else
'fuga'
end
みたいにif~elseブロックの最終結果を戻り値として変数に設定できます。
三項演算子だと行が長くなりすぎたり、ちょっと複雑な処理をする場合に使えるかも知れません。
ActiveRecordが便利
こちらはRailsの機能になりますが、めちゃめちゃ便利で簡単なCRUD操作するアプリを作るなら、取り敢えずRailsで作ろうかなと思うくらい便利でした。(他の言語やフレームワークへの見識が浅いだけかもですが)
詳細は省きます。
Rails Consoleも便利
こちらもRailsの機能ですが、ちょっとした実行結果を得たりするのにめちゃめちゃ便利です。
詳細は省きます。
まとめ
他にも色々Ruby使ってみて思ったことはありますし、今でも結構戸惑うことは多いのですが、今まで業務でJavaしか使ってこなかったので、今回めちゃめちゃ見識が広がった気がします。この記事を書いていて、そういえばRubyの場合はここはどうなるんだっけ?とかRailsのもっと深い部分まで理解できていない事がわかったので、今後はそういったところも勉強していきたいです。