前の記事のコメントで npmのコーディングスタイル を紹介されて、ちょっと読んでみたら面白かったので翻訳してみました。
なお、かなり意訳している部分やそもそも上手く理解できなかった部分もあります。
以下、本文。
#コーディングスタイル
npmは面白いコーディングスタイルです。(原文: npm's "funny" coding style)
##説明
npmのコーディングスタイルはちょっと変わっています。それは異なる理由から変えられてるのではなく、故意的に見かけの混乱を減少させバグを明確にするという、製作に優しいスタイルになっているというわけです。
もしあなたがnpmにコードを送ろうとしているなら(応援します)、あなたはこのnpmスタイルに適合するようにコーディングするべきです。
Note: npmjs.orgのパッケージまで一々チェックしているわけではありません。
##一行の長さ
一行は80文字短くなるようにしてください。それが短すぎずも長すぎずもしないちょうどいい一行の長さです。長い行や、オブジェクトやその他ステートメントがあるときは、複数行に分けてください。
##インデント
二つのスペースで。タブは別に構いませんが、ブラウザで見ると死んでますし(github上でも)、nodeでは二つのスペースを使ってますから、何て言うかアレです。
あなたのエディタに合った設定にしてください。
##波括弧とかひげ括弧とか呼ばれるもの(原文:Curly braces)
波括弧とかひげ括弧(数学でいう中括弧――つまり { }
)は必要とされるところと同じ行に置いてください。
悪い例:
function ()
{
良い例:
function () {
もしブロックが次の行まで含む場合は波括弧を使ってください。しかし、そうじゃないときは使ってはいけません。(訳註:ブロックの内容が同じ行のみのときのことだと思う)
悪い例:
if (foo) { bar() }
while (foo)
bar()
良い例:
if (foo) bar()
while (foo) {
bar()
}
##セミコロン
下の四つの例を除いて、セミコロンは使ってはならない。
-
for (;;)
というループのとき。このときは絶対にセミコロンが必要。 -
while (something) ;
みたいな空のループのとき(しかし、空のループはよっぽどの理由があるときのみ使うようにしてください)。 -
case "foo": doSomething(); break
のようなとき。 - 最初が
[
や(
の行の行頭。セミコロンをつけないと、関数の呼び出しや配列の参照と勘違いされます。
いくつかの良い例を示します。
;(x || y).doSomething()
;[a, b, c].forEach(doSomething)
for (var i = 0; i < 10; i ++) {
switch (state) {
case "begin": start(); continue
case "end": finish(); break
default: throw new Error("unknown state")
}
end()
}
+
や -
から始まる行についてもセミコロンをつけるべきです。しかし、それは必須というわけではありません。
##コンマファースト・スタイル
コンマによって区切られたリストがあり、複数行にまたがっているとき、コンマは次の行の行頭に置いてください。トークンから行が始まるのは相応しくないです。最後はトークン自身で終わらせてください。
例を示します。
var magicWords = [ "abracadabra"
, "gesundheit"
, "ventrilo"
]
, spells = { "fireball" : function () { setOnFire() }
, "water" : function () { putOut() }
}
, a = 1
, b = "abc"
, etc
, somethingElse
##空白
一つのスペースを関数呼び出し以外の (
の前に置いてください。
また、スペースは可読性を上げるためにはどこにでもよく使われます。
行末のスペースを放置したり、空行をインデントしないでください。また、必要以上にスペースを使ってはいけません。
##関数
名前付きの関数を使うようにしてください。それらはスタックトレースをとても読みやすくします。
##コールバック、同期/非同期のスタイル
可能ならば、非同期でノンブロッキングなものを使ってください。
また、同期する fs の API を使うことで npm がいい感じになることもあるかもしれません。しかし、その方法だと fs や http や child process の全てを同じコールバック渡し
で呼び出すことができます。
コールバック関数は、常に仮引数の最後に設定するべきです。そして、その最初の引数はエラーオブジェクトか null
にするべきでしょう。
わたしたちは上手く行かなかったとき、いつもいつも何かを投げますが、それはあまり良くない方法です。エラーメッセージはコールバック関数の最初の引数に渡すようにしましょう。
##エラー
いつも新しいエラーオブジェクトを作るようにしてください。文字列を返してはいけません。
スタックトレースが便利になります。
##ロギング
ロギングには npmlog を用いています。
たいして役にたたないログがあったときは、整理しておいてほしいです。特に、何度も同じオブジェクトをロギングしているときはお願いします。
ログはどこに問題があるのか見つけるのを簡単にするようなレポートをするべきです。
また、適切なログレベルを使うようにしてください。詳しくは config(1)
を見て、 "loglevel" と調べるなりしてください。
##命名規則
lowerCamelCase
は複数の単語からなるオブジェクト、関数、メソッド、メンバに用いてください。
UpperCamelCase
はクラスの名前に使います。(new に渡すものです)
ファイル名や設定のキーには all-lower-hyphen-css-case
という風にしてください。
また、関数の名前はスタックトレースしやすいような名前にするといいです。
CAPS_SNAKE_CASE
は定数に用いてください。
大文字一字の関数名は、匿名の関数として扱いたいが再帰する必要があるときに用いてください。それによって使い捨ての関数であることが明確になります。
##null
とか undefined
、 false
、 0
真偽値の変数や関数(訳註:意味は分かるけどどう訳せばいいんだろう。述語とか?)は常に true
か false
のどちらかであるべきです。いずれ数値になると想定している場合でも 0
にしてはいけません。
初期化に失敗した、もしくは削除された、などのときは null
にしてください。
undefined
は代入してはいけません。「まだ代入されていない」という意味が予約されているからです。
Boolean
オブジェクトは絶対に使わないでください。
##SEE ALSO
というわけでこんな内容でした。
セミコロンが非推奨だったり、コンマファースト・スタイルだったりする辺りかなりぶっ飛んでるコーディングスタイルな気がしますが、名前つき関数を推奨してる辺りはいいなと思います。あと、短い文章のわりにスタックトレースに対する言及が多いです。
翻訳については、非英語圏の人が書いたように思えるくらい(実際に誰が書いたかは知らない)平易で読みやすい文章でした。独特の言い回しとか皮肉も少ないし、日本語訳しなくても良かったんじゃないかと思えるくらい。
ただそれでもいくつか分からなかったところがあるので、教えていただけると幸いです。
- 13/04/30 @kzys 様のアドバイスを基に訂正。ありがとうございます!