テスタブル JavaScript(ちょっと読んだ)

テスタブルJavaScript

テスタブルJavaScript


先に読んでるもので渋滞していたので持ち歩きだけでしたが、今朝より読み始めました。オライリーに限らずJavaScript書籍は、言語汎用に取り扱う場合でも大概がWEBブラウザ動作前提での説明になりがちで、それはこれまでの歴史や現在の使われ方に即せば当然なのですが、この本はNode.jsが前提な説明の書き方のためにWEBブラウザ特有?の雑音が少なくて読みやすいです(まだ読み始めですが)。一方で内容はもちろんNode.jsに特化したものではなくJavaScript開発一般におけるテストとは何か、どうしたらいいのかという論旨で、たいへん高度な内容です。具体的なテストツールの説明ではなく、テストしやすいコードの書き方についての説明が先に論じられてます。
たとえば冒頭のほう、for文の問題について書いてありました。

var a = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
for(var i = 0; i < a.length; i++) {
    console.log(i + ': ' + a[i]);
}
console.log(i);

こんなコードがあったとします。JavaScriptにおいてはJavaと異なり、スコープを作るのは関数単位となるために、for文のカウンターとして宣言したつもりの「i」が、for文の外でも見えてしまいます。Javaでは中括弧でスコープ作るのでカウンターが外から見えないところ、JavaScriptは違う。見えるという事は変更もできますし、別に宣言された同名の「i」があるならば意図に相違してこのカウンターがマスクしてしまうかもしれません。その危険をさせるために、安全なコードとしてはモダンJavaScriptに限られますが以下。

a.forEach(function(val, i) {
    console.log(i + ': ' + val);
});

Array#forEachはV8で利用可能です。このforEachでは関数の引数にカウンターがあり、すなわち繰り返し処理において新たに関数スコープを作ってますから、この「i」は外から見えない!という説明で配列なめるときはfor文じゃなくArray#forEach使おうねって。なるほどなるほど。
テストしやすいコードっていうのも、例えばこういう事の積み重ねだと説いています。内容難易度高いことを丁寧に論じている良書だと思います(ちょっと読んだところまでは)。