- Published on
他人のコード読むのが好きじゃない私だが、いくつかのRailsのコードだけはよく読んで参考にしている
- Authors
- ジャバ・ザ・ハットリ
他人の書いたコード読むのがあまり好きじゃない私だが、いくつかの Rails プロジェクトのコードだけは自分のフォルダにクローンしてよく読んで参考にしている。
「この世でもっとも理想的な Rails プロジェクトのソースコードってどんなのだ?」「どこかにそういうコードないの?」というのが Rails をある程度マスターした後で考えていたことだった。
会社の中にもそれなりのコードがあって、それはそれでいいのだけど、なんか違う。普段の仕事のやり方や技術者独自のクセなんかを知ってしまっているから「アイツってこういう書き方好きだなー」とか「ホントにこれが理想の形か?」の疑問が残ってしまう。文献を調べても GitHub のパブリップリポジトリを見ても、どれもたすきに長く帯に短し。
よくある Ruby on Rails を学ぼう、レッスン1とかのサンプルコードでは極端にコード量が少ない。確かに理想形を示しているが、Model 見ても2つだけとか。そんな少ないコード量だとツッコミどころも無いわ、と。もっと Model が 10 とか 20 を超えてきて、コードがぐちゃっとなりかけている際に「こうすればいいのヨ!」と示してくれる例が欲しかった。
でもコード量が多ければいいってもんじゃない。あまりに巨大かつ複雑なコードで「そんなもん勉強で読むには大き過ぎるんだよ!」とういのとか。
そういうある程度の Rails は分かった上でさらに上のレベルを目指す際にいいコードというのがあって、それはひとそれぞれだが、私にとってはこれとか。
まず言えることはあるレベル以上になるとそれぞれのエンジニアの思想が出てくる。その思想が気に入ったのを自分の理想とすべきだ、と。で、このコードは私の理想と一致しているし、なによりコードを読んでいて気持ちがいい。「そうそう、こうするべきよねー。こう言ってはナンだが私もそう思っていたのよ」という気持ちになる。
例えばこちらが User Model
class User < ActiveRecord::Base
has_many :entries, dependent: :destroy
has_many :imports, dependent: :destroy
has_one :subscription, dependent: :destroy
before_create :generate_reply_token
delegate :stripe_customer_id, to: :subscription
def self.promptable(time = Time.zone.now.utc)
where(prompt_delivery_hour: time.hour)
end
def reply_email
"#{reply_token}@#{ENV.fetch('SMTP_DOMAIN')}"
end
def generate_reply_token
self.reply_token = ReplyToken.generate(email)
end
def newest_entry
entries.newest
end
def prompt_entry
PromptEntry.best(entries, time_zone)
end
def prompt_delivery_hour
PromptDeliveryHour.new(super, time_zone).in_time_zone
end
def prompt_delivery_hour=(hour)
super PromptDeliveryHour.new(hour, time_zone).in_utc
end
end
見事に1メソッド1行が徹底されている。全部ではないけど基本的にメソッドの中の行数が少なくて、それが様々な工夫でそうなっている。だからとても読みやすい。私をこれを見て、自分のコードで 3 行以上あるメソッドを全て書き直した。
また Extract Class(クラスの抽出)がふんだんに使われている。クラスの抽出は初心者があまりやりたがらないことのひとつだが、これをすることで読みやすさが激変する。
とはいっても全てが理想的というか自分の考えと一致する訳でもないので、あくまでこれも一例としつつ、他にもいいコードがあれば自分のフォルダーにクローンして、時々読んで勉強するようにしている。
パーフェクト Ruby on Rails |
作者: すがわらまさのり,前島真一,近藤宇智朗,橋立友宏 |
出版社/メーカー: 技術評論社 |
発売日: 2014/06/06 |
メディア: 大型本 |