日々精進

新しく学んだことを書き留めていきます

coffeescriptスタイルガイド日本語訳

coffeescriptスタイルガイドを抄訳してみました。
訳文は不正確なところがあるので詳しくは原典を参照してください。
polarmobile/coffeescript-style-guide · GitHub


コードレイアウト
インデントはスペース2つとする。タブは使わない。
1行の最大文字数は79とする。
トップレベルの関数、クラス定義、クラスのメソッド定義の間に1行分空行を入れる。
可読性をあげるために随時1行分の空行を入れる。

行末にスペースを置かないこと。
エンコーディングはUTF8とする。

モジュールインポート
他のモジュールをインポートする場合は、1行に1モジュールをインポートする
require 'lib/setup'
Backbone = require 'backbone'

requireは以下の順序で並べる。
1.標準ライブラリ
2.サードパーティ製ライブラリ
3.自分で作ったファイル

スペース
不要なスペースは削除する。例えば以下の場所
・括弧のすぐ内側
($ 'body') #これはOK
( $ 'body' ) #これはだめ
・カンマの直前
console.log x, y # これはOK
console.log x , y # これはだめ

演算子の両脇にスペースを一つ置く。演算子の例は以下。
=, -=, +=, ==, <, >, <=, >=, unless, +, -, *, /
演算子の位置は揃えない。例えば以下はだめ。
x = 1
y = 2
fooBar = 3

コメントが説明しているコードを変更したらコメントも一緒に修正すること。
コメントがいらないくらいコードをわかりやすくしてコメントを削除できればなおいい。
コメントの先頭は大文字で。(先頭にシンボル(変数名など)を書いた場合を除く)
コメントが短ければ最後のピリオドはなくてもいい。

ブロックコメントはすべての行の先頭を#とスペースで始める。
説明するコードと同じインデントの深さに書く。
パラグラフは#とスペースのみの行で1行空けて区切る。
# This is a block comment. Note that if this were a real block
# comment, we would actually be describing the proceeding code.
#
# This is the second paragraph of the same block comment. Note
# that this paragraph was separated from the previous paragraph
# by a line containing a single comment character.

init()
start()
stop()

コメントは説明するコードのすぐ上に書く。短ければコードの行末に書いてもいい。
# Comment
x = x + 1 # Compensate for border

命名規約
変数名、メソッド名、プロパティ名はすべてキャメルケース(先頭小文字)にする。
camelCase = 1

クラス名はパスカルケースにする。
class PascalCase

定数は大文字とアンダースコアにする。
CONSTANT_LIKE_THIS

プライベートな変数、メソッドは先頭にアンダースコアをつける。
_privateMethod: ->

関数、メソッド

  • >の前にスペースを置く。

foo = (arg1, arg2) -> # OK
foo = (arg1, arg2)-> # だめ

引数がない場合は括弧を省略する。
bar = ->

メソッドチェインが長い場合はドットを先頭にして行を分ける。インデントをつける。
[1..3]
.map((x) -> x * x)
.concat([10..12])
.filter((x) -> x < 11)
.reduce((x, y) -> x + y)

メソッド呼び出しの括弧は読みやすさを考慮してつけるか省略するかを決めること。
(訳注:括弧を省略すると、コンパイラプログラマーの意図と異なる解釈をする場合があるので括弧がなくても明確に引数がどれかがわかる場合のみ省略するべき)

()でグループ化できるが、これは使わない方がいい。
↓はグループ化されたコード。
($ '#selektor').addClass 'klass'
↑のコードは↓のコードと等価。
$('#selektor').addClass 'klass'

文字列への変数の埋め込みを積極的に使うこと。
"this is an #{adjective} string" # OK
"this is an " + adjective + " string" # だめ

条件文が否定になっている場合はunlessを使う。
console.log "test" unless foo == 1

unless…elseよりif…elseを使う。
if..elseは必ずインデントする。1行にまとめない。
# OK
if true
...
else
...

# だめ
if true then ...
else ...

内包式を積極的に使う。
# OK
result = (item.name for item in array)

# だめ
results = []
for item in array
results.push item.name

Stringなどのネイティブオブジェクトを変更しない。
例外を握りつぶさない。

アノテーション(TODO, FIXMEなど)を必要に応じて使う。
アノテーションの後ろにコロンとスペースをつける。
複数行になった場合はインデントをつける。
# TODO: Ensure that the value returned by this call falls within a certain
# range, or throw an exception.
analyze()

アノテーションの種類は以下。
TODO, FIXME, OPTIMIZE(最適化が必要), HACK(コードがいまいち), REVIEW(レビューすべき)

and,or,is,not,or=,::,@を積極的に使う。
ただし、@は単独では使わない。

reutrnはなるべく使わない。使った方がわかりやすくなる場合は使う。

可変長引数を取る場合は…を使う。
bar = (a, b, c, rest...) ->