Maintainable Javascriptを読んだ
( javascript )javascriptは以前からいろいろ実装していたものの、なんとは無しに実装していたが運用しやすいコードってどんなもんだろうな。どういう気概でやってるのだろうと思ってこの本を読んでみました。
だいたい大きく纏めると
- Style Guidlines
- Programming Practice
- Automation
で構成されています。今回はその「Style Guildlines」についてぼやいていこうと思います。 だいたい言っていることは他の言語でも通ずるところがあったのでしっくり腹に落とし込めた気がします。あと、「Style Guidlines」に関してはおすすめだけじゃなくてなんでこういう書き方いいのかを説明されているので納得いくものがありました。「Programming Practice 」は結構知らないことが多々あったのでちょっと実用性があるかは疑問なものもあったけど勉強になったと思います。
Basic formatting
コードのインデントや変数名・関数名の決め方がこんな書き方がいいよという紹介から始まり、変数の型について説明されていた。
特にnullとundefinedで細かく説明されていたのでメモ。
null
- 変数宣言の際には初期化しようね
var hoge = null;
- 期待されていないオブジェクトだったりしたときはnullを返す
function getPerson(){ if (condition) { return new Person(); } else { return null; } } var person = getPerson(); if (person !== null) { doSomething(); }
- 引数に設定(供給)されたかどうかをnullでチェックしないで!
この関数に技術的に間違っているわけじゃないけどそういう想定で
やるとあとで大変なことになるからやらんほうがいいのかな。
(すこしわかってない)
function hoge(arg1, arg2) { if (arg2 != null) { doSomething(); } }
undefined
基本的にこれは混乱を招くものなので使わないようにしよう!と筆者は書いていた
var person; typeof(person); // "undefined" typeof(hoge); // "undefined"
変数宣言したけど初期化してないからundefined、宣言してなくてもundefined。仮にエラーが発生しても宣言されていな変数と統一するべきだろう。 あとはこんな混乱が起きないように初期化しようって話
var person = null; if (person === null) { do(); }
Comments
コメントの書き方のおすすめなんかが説明されています。
Statements and Expressions
条件文を書くときの作法なんか書かれていて、基本的な者から筆者のおすすめやら各コーディング規約に準ずるとこんな書き方できるよっての書かれていてそれを採用してるときりがないので自分もしっくり書き方を紹介
// if,forの次は必ずspace // ()内部は空白を入れない if (condition) { do(); } else { doElse(); } for (var i = 0;i < 10; i++) { do(); } switch (condition) { 'hoge': // do something break; 'moge': // do something break; default: // none }
個人的には「if」は以下のように書きたい
if (condition) { do(); } // ここにコメント入れられたりできて見やすい else { doElse(); }
The loop
言わずと知れた構文だが、continueは利用しないほうが分かりやすくてバグの原因とならない
var values = [1,2,3,4,5], i; for (i=0; values.length < 5; i++) { if (i != 2) { process(values[i]); } }
The for-in loop
for-in は基本的にはオブジェクトのプロパティを走査するときに利用される。 利用するときはhasOwnPropertyを利用することを筆者はおすすめしている
var prop; for (prop in object) { if (object.hasOwnProperty(prop)) { console.log(prop); console.log(object[prop]); } }
単純な配列の走査はしないようにすすめている。これは数値的インデックスされたプロパティとして 走査されてしまい、本来値としてのデータとして扱われないのだ!なので先天的なエラーをお越しかねない。
Valiables, Functions, and Operators
まぁ、あたりまえのことなのですが最初に変数宣言はちゃんとしようぜ。 から、無名関数を宣言するときは最後の行でオブジェクトか無名かわからなくなるから 無名関数の場合は()でくくってね!
// Bad var hoge = function() { alert('hohoho-'); }(); var hoge = (function() { alert('hohoho-'); }());
Primitive Wrapper Type
結論から言うと型としての扱い方がわからなくなるので利用しないことを進めている。
var name = 'hoge'; // このとき、処理の裏側では一時的にインスタンスが生成されている // のでこの書き方をしてもエラーにはならないらしい name.toUpperCase(); console.log(name.toUpperCase()); // ので以下のものはBad var name = new String('hoge'); var num = new Number(20); var bool = new Boolean(true);
次回は、「Programming Practice」をメモってみる。