Subscribed unsubscribe Subscribe Subscribe

Augmented Usamimi

it { is_expected.to be_blog.written_by(izumin5210) }

Sinatraの実装を読む

対象読者

  • Ruby初心者を抜け出したい人
  • あまり人のコードとか読まないけどそろそろ読む練習したい人

コードリーディングに慣れてる人だと30分もかからないので,対象読者じゃないかも.

前提知識

  • Rackアプリケーションの実装に関する基本的な事項
  • Sinatraを利用したアプリのつくりかた
    • ここではget '/' do ... endで実装するClassicアプリケーションを見ていく

Rack内部の実装については触れず,I/Fだけ知ってる状態という体ですすめる. あくまでSinatraが「どうやって起動するか」「どうやってルーティングを定義してるか」「どうやってリクエストを捌くか」「どうやってDSLを定義しているか」等に着目する.

実装を読む

ここでは2017年1月末時点での最新安定版であるv1.4.7を読む. sinatra/base.rbにほとんどの実装が集中しており,頭から読み進めたり秩序なく読んだりは非常にしんどい(そもそもコードリーディングを頭から進めることはないけど).

なので,ここでは以下の3実装に分けて読み進める.

  • Rack middlewareの実装
    • リクエストを受け取って,どうやって定義されたルーティングに流していくか
  • Classic appの実装
    • 起動
      • rackupしてrun Sinatra::Applicationしなくても,ruby app.rb -p $PORT -o $IPで起動するのはどういう仕組みか
    • DSL定義
      • どのようにしてDSLを定義しているか
  • ルーティング実装
    • DSLにより定義されたルーティングをどのように保持し,受け取ったリクエストをどのようにdispatchしていくか

以下は読んだコードの順番とちょっとしたメモの記録. メタプロや闇のコードはほとんどない,非常にシンプルな実装なのでそんなにメモることもないという感じ. あとで参照しやすいようにリンクだけ残してある.

注意点として,いま自分がクラスを見ているのか特異クラス(class << self ... end)を見ているのかを意識しておいたほうがいいかも.

Rack middlewareの実装

Classic appの実装

起動

DSL定義

ルーティング実装

感想

読み進めるに当たっての入り口はわかりやすいのと,そこまで複雑な処理がないということでコードリーディング入門としては悪くない気がする.sinatra/base.rbが分割されておらずそこそこ巨大なことを除けば.

三時のおやつのお供にどうぞ,くらいの難易度.

(特異クラスまわりが若干ごちゃごちゃなので,メタプロRubyとか読んでると理解しやすいのかも)

Effective Ruby

Effective Ruby

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版