駄文型

プログラミングとか英語とかの話題を中心にした至極ちゃらんぽらんな日記です。

今日こそ始めるソースコード・リーディング Node.js のコードを読んでみよう

細かくカスタマイズできるメソッドを実装しようとして、引数が多くなってしまうことがある。オプションを引数で渡すことになる。デフォルト引数を利用して省略可な引数を用意したいが、一番後ろは必須のこれがいいみたいなケースがないだろうか。僕は4年に1回くらいある気がする。最後尾の引数はコールバック関数に、というのは Node.js だとよくある気がする。そういえば fs.readFile() なんかは真ん中にオプションを詰め込むタイプになっている。どう実装するのが一番普通なんだろうか。気になったので Node.js のソースを読むことにする。

フォークしてローカルにダウンロード

別にフォークしなくても git clone git@github.com:nodejs/node.git でダウンロードできる。フォークするのは「俺は〇〇っていうフレームワークを読んでいるぜ」というのをアピールするためでもあるし、フォークしておけばなんとなくテンションが上って自分のモチベーションが上がる気がするからだ。ストイックな方はフォークしなくてよい。

https://github.com/nodejs/node にアクセスして右上にある Fork ボタンを押してフォークしよう。簡単すぎる。GitHubってすごい。フォークしたらそこから git clone でクローンしよう。軽く読むだけならクローンしなくてもブラウザでいい。

読む

fs.readFile()

前置きが無駄に長くなったが、ソースを読んで見る。 fs.readFile()lib/fs.js にある。

arguments[arguments.length - 1] で最後尾の要素を取って maybeCallback に渡しているようだ。この時点で似たような機能がない言語だと同じように実装できないことがわかる。つらい。

ところでこのコードは gist-it で持ってきているのだが、非常に便利。下記のスクリプトでいける。

<script src="http://gist-it.appspot.com/github/kohei-kimura/node/blob/master/lib/fs.js?slice=271:298"></script>

参考にしたエントリ: はてなブログでGitHubのコードを貼り付け/引用する - メンチカツには醤油でしょ!!

maybeCallback

maybeCallback では型のチェックをしているだけのようだ。 retthow() は同じく lib/fs.js で定義されているがここでは省略する。単にエラーなら thow するだけの関数だ。 fs.readFile() にコールバック関数を渡さなければこれがコールバック関数になるようだ。

getOptions

まず fs.readFile() にオプションを渡さなければ、optionsは未定義かnullかコールバック関数が入っているはずなので、デフォルトを返す。

で、stringの場合はエンコーディング設定にして、objectならそのまま返す。ここで自分が勘違いしていたことに気づいた。fs.readFile()

fs.readFile("file.txt", "utf-8", "r", callback);

などとすれば、いい感じに引数を解釈してオプションをセットしてくれるのかと思っていたが、オプションが複数ある場合はちゃんとオブジェクトで渡さないとだめなようだ。ちゃんとドキュメントにもそう書いてある

感想

結構普通だった。自分の勘違いにも気づけてよかったのでソース読むの大事だね(泣)

具体的なモチベーション重要。ただ漠然と「勉強になるって言うし、フレームワークのソース読んでみよう」と思っても量が多すぎて理解できない。自分がいつも使っているフレームワーク・ライブラリで「そういえばこの辺の処理どうなってるんだろう」と疑問が湧いたらその部分だけ読むと、自分が読むべき範囲が限られるのでよい。というか、仕事のプロジェクトでいきなり既存のコード全体読んだりしないよね。機能追加やバグフィックスというゴールがあって、そのために必要な箇所を都度読んでいくことが多い。OSSも同じだ。なんか「レールズのコードは勉強になるってみんな言ってる!読まなきゃ!(焦)」みたいな漠然としたモチベーションで始めてもうまくいくはずなかった。それで年間12回くらい挫折してる。みんなって誰だよ。まずは自分の分かる範囲の浅いところからはじめて、少しずつ深めていけばよいのだ。仕事と同じだ。OSSだからって変な肩肘張ってた。

あとは、そのフレームワーク・ライブラリのユーザーとして使いこなせるようになるのが先。使いこなしてないってことは、まだ仕様を理解できてないってことだし、仕様がわからないコード読んでもわかるわけない。こんな当たり前すぎることに何故気づかなかったのか。