7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

CBcloudAdvent Calendar 2019

Day 15

PHPerが久しぶりにRubyを書いて思ったこと

Last updated at Posted at 2019-12-15

内容

  • PHPer(Laravler)が感じたRuby(Rails)への感想

私の背景

  • PHP成分が多い人生
    • 初期だとFuelPHPとか触ってた
    • ここ数年はLaravel使ってた
  • Rubyは2011年頃に遊びで触ってた
    • メタプログラミングRubyとか読んで興奮した記憶はある
    • この当時のRailsを触って「ほーん、なるほど」、みたいに思った記憶もある
    • 仕事では結局使わなかったけど、Project Euler をRubyで解いたりしてみてた

といった感じの背景です。
最近Railsで仕事することになったので、PHPer(というかLaraveler)が感じたRailsに対するギャップをいくつか書きたいと思います。
すでにRailsのプロジェクトがあり、そこにJOINした感じです。

Autoloadがわからない

PHPのロード

require_once __DIR__ . '/path/to/file.php'

Rubyのロード

require "path/to/file"

ここまではなんの問題もなくわかるんですが、autoloadがわからない。

PHPの場合

namespace \Foo;

use \Foo\Bar\Hoge;

class Xxx extends Hoge {
}

みたいな感じで「利用するクラスのフルパスを書かなければならない」っていう制約があるので、面倒ではあるんだけど「 (appRoot)/Foo/Bar/Hoge.php にあるんだな」っていうことが分かる。

最近はほとんどPSR-4のautoloadが多いと思うので、PSR-4読めばいいと思う

参考: https://qiita.com/inouet/items/0208237629496070bbd4

Ruby(Rails)の場合

module Foo do
  class Xxx extends Hoge
  end
end

なんなん!?!?!?急に Hoge どこから出てきたん!?!?!?!?
Hogeって誰なの!?!?!?!

ってすごく思った。

https://qiita.com/eggc/items/ae09d32df5d994522ca1
https://qiita.com/tachiba/items/5b293ca8e9430b9bd07e

最新のバージョンでどう動くかはわからんですけど「Railsが頑張って探してるんや」って言われて納得。

納得すると同時に「あぁ〜〜〜パスを明示したいんじゃ〜〜〜」という気持ちになる。

カッコがない

追記: 以下「カッコがない」の項については私の勘違いが多分に含まれてたのでスルーしてください。
コメントにてご指摘いただき、ありがとうございました :bow:

PHPのこれが

piyo(bar(foo($x)));

Rubyだとこうなる

piyo bar foo x

いいんだけど、「どんだけカッコ嫌いなん???」って気持ちで溢れた。
foo の引数が3つあるときは

piyo bar foo 1,2,3

ってなって、なんか、分かるんだけど、なんやねんカッコ書きたいやんって気持ちになる

piyo(bar(foo(1,2,3))

シックリくる〜〜!

って思うけどRubocopとか言うやつが「カッコ書くなや」みたいにいってくる。もうやだ。

blockに感じる違和感

[1,2,3].reject {|n| n > 2}.map {|n| n * 2}.map &:to_s

これと

[1,2,3].reject do |n|
  n > 2
end.map do |n| 
  n * 2
end.map &:to_s

これって同じ感じだけど、なんで構文2つ分けたん。どっちかひとつでいいじゃんね!

end.map とかにすごくなにか感じる。

returnが無い

def hoge(x)
  if x > 5
    return x * 3
  end
  x
end

returnつけたりつけなかったり!!!なんなの!!!

不要なのにreturnつけるとRubocopが「てめぇreturnつけてんじゃねぇよ!」とか言ってくるしもう。もう。

RubyDocが無い・・・?

最近のPHPは割と型がしっかり・・・とは言わないけど、少なくとも宣言する際の不便はかなりなくなってきた。
コンパイル用っていうよりは、プログラミングするときの手助けとしての型、という側面でとても便利。
PHP7より前の時代においてもPHPは PHPDoc で何となく「型が何なのか明示しろや」文化が多少なりとあった。

class Foo {
  /**
   * @param integer $x
   * @param integer $y
   * @return integer
   */
  public function something($x, $y) {
    return $x * $y;
  }
}

みたいな感じで、「俺は型を宣言したいんじゃ!!!」という欲求に応えてくれた。

class Foo {
  public function something(int $x, int $y): int {
    return $x * $y;
  }
}

最近はこんな感じにスマートにかけてよかったね^^という気持ち

JSにもTypeScript以前にJSDocあったし、当然RubyにもRubyDocがあると思ってた。

そしたら、RubyDocはなんか違うやつだった。ドキュメント作るやつ。
ちゃうねん、そうじゃないねん。

一応RDLってやつがあるみたいだけど、なんか違うというか・・・too muchというか・・・。

「Rubyの思想・文化的にそういう型宣言とは仲良くない」的なことだってのはわかってるんですが、「引数が何くるのかわからない状況ってのが怖くて、「え・・・string渡してくるバカがいたら死ぬの・・・?」みたいな気持ちになる。「string渡してくるやつがアホい」っていう思想なんだろうけど。

まとめ

なんか他にもいろいろあったと思うんですけど、思い出した範囲で感じた違和感をかきました。

別にRubyをディスってるわけじゃなくて「全然Rubyの世界観に馴染めてない俺」っていう感じです。

ワンライナー書いたりとかRspecのDSL感とか、書いててシックリくることも多いのですが、なんかやっぱ型システム周りの思想の違いは大きいなぁと思ってます。
ダックタイピングって誰得なのかがまだわかってないので、しっくりくる日を待ち望んでます。

かしこ

7
3
3

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
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?