Subscribed unsubscribe Subscribe Subscribe

ジャバ・ザ・ハットリの日記

日本→シンガポール→ベルリンへと家族と共に流れ着き、ベルリンのスタートアップで働くソフトウェアエンジニアの日記

他人のコード読むのが好きじゃない私だが、いくつかのRailsのコードだけはよく読んで参考にしている

他人の書いたコード読むのがあまり好きじゃない私だが、いくつかのRailsプロジェクトのコードだけは自分のフォルダにクローンしてよく読んで参考にしている。

「この世でもっとも理想的なRailsプロジェクトのソースコードってどんなのだ?」「どこかにそういうコードないの?」というのがRailsをある程度マスターした後で考えていたことだった。

会社の中にもそれなりのコードがあって、それはそれでいいのだけど、なんか違う。普段の仕事のやり方や技術者独自のクセなんかを知ってしまっているから「アイツってこういう書き方好きだなー」とか「ホントにこれが理想の形か?」の疑問が残ってしまう。文献を調べてもGitHubのパブリップリポジトリを見ても、どれもたすきに長く帯に短し。
よくあるRuby on Rails を学ぼう、レッスン1とかのサンプルコードでは極端にコード量が少ない。確かに理想形を示しているが、Model見ても2つだけとか。そんな少ないコード量だとツッコミどころも無いわ、と。もっとModelが10とか20を超えてきて、コードがぐちゃっとなりかけている際に「こうすればいいのヨ!」と示してくれる例が欲しかった。
でもコード量が多ければいいってもんじゃない。あまりに巨大かつ複雑なコードで「そんなもん勉強で読むには大き過ぎるんだよ!」とういのとか。
そういうある程度のRailsは分かった上でさらに上のレベルを目指す際にいいコードというのがあって、それはひとそれぞれだが、私にとってはこれとか。

github.com


まず言えることはあるレベル以上になるとそれぞれのエンジニアの思想が出てくる。その思想が気に入ったのを自分の理想とすべきだ、と。で、このコードは私の理想と一致しているし、なによりコードを読んでいて気持ちがいい。「そうそう、こうするべきよねー。こう言ってはナンだが私もそう思っていたのよ」という気持ちになる。

例えばこちらが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

パーフェクト Ruby on Rails