My practice by JavaScript: The Good Parts Section 1〜3.
javascript は、私にとって身近な言語の内の一つですが、ブラウザでの処理が主体でシェル環境が無い (Rhino の存在を知らなかったのです) ということもあって、言語としてマジメに勉強したことはありませんでした。
もともと、仕様的にそういう状況が想定されていたとは思うのですが、ちょこっと弄って、少々スパゲッティでも大体希望通りに動いてしまう。ましてや、「クロスブラウザ対応を謳った充実野菜ならぬ充実ライブラリが百花繚乱」ともなれば、ますます「勉強」という領域は私的には遠のいて行きました。
しかし、最近 GAE に取り組むようになって、いささか状況が変わりました。
従前、WebServer(Apache or lighttpd) + WebFramework(django) + MySQL という組み合わせで製作してきたシステムでは、能力を専有できたという事情もありますが、サーバ側で何でもかんでも背負い込んで解決することが当たり前でした。ちなみに、javascript に与えられる役割は、せいぜい見栄えの部分でした。
しかしながら、GAE のようなクラウドでは常に制限が憑いて回ります。以前は力技を使えたところが、規定の処理時間を超過するだけでアウトです。
一つ一つの処理を色々と見直すものの、もともと違う思想のもとに製作されている訳ですから、劇的な改善には至ることは、ほとんどありません。
つまり、従来の手法は選択すらできない。パラダイムが、ごっそり変わってしまったのです。多くの方がブログなどで言及されていらっしゃいますが、サーバとクライアント双方の役割分担を再度見直す必要があるのでしょう。
幸いなことに、Google Chrome のようなマルチスレッド型の高速なブラウザが登場したおかげで、クライアントに任せられる領域は相当広がって来ていると思います。
であれば、重過ぎるサーバ側をどれだけ軽くするか。クライアント側にお願いできるものは、どんどんお願いする。サーバ側にはサーバにしかできないことが残る。
私にとってのクラウドの登場は、ある意味当たり前のことだが、今まで意外とできていなかったことを気づかせてくれた。例えて言うならば、温故知新のような感覚でもありました。
さて、そういうことになれば、javascript でのデータ処理は格段に増えます。Gmail をソースを見ても、笑っちゃうくらい HTML のタグがありません。大部分がメールデータです。
どんな言語でもそうですが、データハンドリングほど難しいものはありません。GUI などは一見難しく見えますが、一定の作法に従うか、パターンを発見すれば、後はそのレールに乗るだけです。
しかしながら、データ構造において、より効率的な処理を指向するためには、言語仕様に精通しておかねば最適な解を得ることはできません。それは Lisp を初めて学習した時に気がつきました。Lisp 脳とは、手続型のマインドから離れることを意味していました。
そんなこんなで、ちゃんと勉強できる書籍が欲かったのですが、書店を覗いてみても「エフェクトがどーのこーの」みたいなものしかありません。こんな時、twitter は素晴しいですね。
Javascript 関連の書籍って、アニメがどうのこうのみたいな、どうして見た目の話ばかりなんだろう。言語的にじっくり解説した本って、ありませんか?
こんなことを呟いたら、お二方が返信してくださいました。
@toomore_such オライリーの本をオススメします。http://www.oreilly.co.jp/books/9784873113296/
そう。オライリーがありましたね。ただ、ご紹介いただいた書籍は、私にはいささか重厚でした。もう少しライトにポイントを学習できるものはないか? とオライリーのサイトを彷徨っていたら、標題の書籍を発見して非常に満足しています。
何やら長い前振ではありましたが、今 (2010/1/20 現在) は、第3章まで読み進みました。目新しい内容は概ね下記の通りでした(お恥しい)。
第1章 良いパーツ
- 良いパーツの説明
第2章 文法
- /* */ によるコメントは使わず、代わりに // によるコメントだけを使う。
- 名前は 1文字以上のアルファベット、数字、アンダースコアで構成。予約語は使用できない。
- 数値型は、64ビット浮動少数のみ。1 と 1.0 は等しい。
- 「2.5 命令文」の説明は分かりづらい。鉄道ダイアグラムは、言語の厳密なパースパターンを明示することには適しているとは思われるが、プログラム的にはサンプルコードで理解する方が早いと思う。
- 関数の章に到達したら、「2.5 命令文」をやり直す。
- 新しいスコープを生成しない。したがって、変数は先頭で定義すべき。
- 偽は false, null, undefined, ’’, 0, 数値の NaN
- for in は ruby で言うところの each に近い感じがする。
- throw では name と message というプロパティが生成されるので、throw 元のチェックができる。
- return に式が追記されていない場合の戻値は、undefined となる。
- = は値の設定。equal ではない。
- += は足し算、もしくは文字列の連結に使用できる。
- 三項演算子は最初よく理解できなかった。サンプルを見つけて、ようやくガッテン。
var a = 1; var b = 1.0; (a > b) ? document.writeln(a) : document.writeln(c);
第3章 オブジェクト
- 数値・文字列・真偽値はイミュータブル。しかし、オブジェクとはミュータブル。
- プロパティ名には空文字も利用可能。
- プロパティの前後のクォートは、名前に則っていれば省略可。
- || でデフォルト値を設定できる。
- && で undefined を回避できる。
flight.equipment が undefined の場合。 document.writeln(flight.equipment && flight.equipment.model);
- オブジェクトは参照渡し。コピーではない。
var x = {}, y = {}; document.writeln(x === y); var xx = yy = {}; document.writeln(xx === yy);
- グローバル変数を 1つだけ定義し、グローバル領域の利用を減らす。
var stooge = { "first-name": 'Jerome', "last-name": 'Haword', '': 'empty string' }; var MYAPP = {}; MYAPP.stooge = { "first-name": 'Jerome', "last-name": 'Haword', '': 'empty string' }; document.writeln('stooge equals stooge, is...', stooge === stooge); document.writeln('stooge equals MYAPP.stooge, is...', stooge === MYAPP.stooge);