WordPress Javascript コーディング基準
この記事は公開または最後に更新されてから2253日が経過しています。情報が古くなっている可能性があるのでご注意下さい。
Javascript Coding Standard コーディング基準
ちょっと思い立って、WordPress のコーディング規約なるものに目を通して見ました。
PHPに関してはcodex に訳したページがあって助かったのですが、このjavascript に関しては無かったので自分で訳すしかありません。
ぺージにしておけば、忘れてしまった時に後で何度でも見直せます。
WordPressのオリジナルページへのリンクは、『 WordPress Javascript Coding Standard 』
日本語訳は翻訳サイトを利用しつつ、私が訳したものなのでかなり怪しげではあると思います。所々、訳せなくて意味不明の部分が存在しますので、あしからず。以下、緑文字が原文、青文字が日本語訳。
その冒頭には、
All code in any code-base should look like a single person typed it, no matter how many people contributed. – Principles of Writing Consistent, Idiomatic JavaScript
どんなコードベースであれ全てのコードは、たとえどんなにたくさんの人が貢献したものであったにしても、一人が書いたように見えるものであるべきである。
そして、
The WordPress JavaScript Coding Standards are adapted from the jQuery JavaScript Style Guide. Our standard differs from the jQuery guidelines in the following ways:
・WordPress uses single quotation marks for string declarations.
・Case statements are indented within switch blocks.
・Function contents are consistently indented, including full-file closure wrappers.
・Some whitespace rules differ, for consistency with the WordPress PHP coding standards.
・jQuery’s 100-character hard line limit is encouraged, but not strictly enforced.Many of the examples below have been adapted directly from the jQuery style guide; these differences have all been integrated into the examples on this page. Any of the below standards and examples should be considered best practice for WordPress code, unless explicitly noted as anti-patterns.
WordPressのJavaScriptにおけるコーディング規約は、jQuery JavaScript Style Guide から適合されます。我々の規約は、以下の方法でjQueryのガイドラインとは異なります。
- WordPressは、文字列の定義には単一引用符を使用しています。
- case文はswitchブロック内でインデントされています。
- functionの内容部分は全てファイルを閉じるための最後部のラッパーを含めてインデントされています。
- WordPressのPHPコーディング規約との整合性のために、いくつかのスペースのルールは異なっています。
- jQueryの強度な1行100文字制限を奨励していますが、厳密には施行されていません。
以下の例の多くは、jQueryのスタイルガイドから直接適応されています。これらの違いは、すべてこのページの例に統合されました。明白にアンチパターンとして注記されない限り、以下の規約および実施例のどれもが、WordPressのコードのための最善なる慣習として考慮されるべきです。
とあるので、このページにあるのは Idiomatic JavaScript と jQuery style guideを照らし合わせつつ、そしてWordPress standard を主にしてまとめたものです。
- Table of contents
-
- Spacing
- Object
- Arrays and Function Calls
- Example of Good Spacing
- Indentation and Line Breaks
- Blocks and Curly Braces
- Multi-line Statements
- Chained Method Calls
- Assignments and Glovals
- Declaring Variables With
- Globals
- Common Libraries
- Naming Convention
- Comments
- Equality
- Type Checks
- Strings
- Switch statements
- Best Practices
- Best Practices - Arrays
- Best Practices - Object
- Best Practices - "Yoda" Conditions
- Best Practices - Iteration
- Best Practices - Underscore.js Collection Functions
- Best Practices - Iterating Over jQuery collections
- Principles of Writing Consistent, Idiomatic JavaScript
- Idiomatic JavaScript - Beautiful Syntax
- Idiomatic JavaScript - Type Checking
- Idiomatic JavaScript - Conditional Evaluation
- Idiomatic JavaScript - Practical Style
- Idiomatic JavaScript - Misc
- Idiomatic JavaScript - Naming
≪ Spacing ≫
これらのルールは、進歩した開発者の読みやすさのために大まかなスペースの使用を奨励しています。minification(ファイル圧縮化)は、ブラウザが読み込んで処理するために最適化されたファイルを作成します。
- インデントはタブを使用する。
- 行の終わり、また空行にはスペースはあってはならない。
- 行は80文字を超えてはならない、そしてタブを4つのスペースとしてカウントして100文字を超えてはなりません。これは緩い規則ですが、一般に長い行は読みづらく混乱させるコードであることを示しています。
if
/else
/for
/while
/try
ブロックは常にbrace{}を使用し、複数の行にかかるようにします。- 単項特殊文字演算子(たとえば、!、++、--)は、その演算子に接してスペースがあってはいけません。
- いずれの
,
と;
はスペースが前にあってはいけません。 - いずれの
;
は、文の終了記号として使用するには、行の末尾になければいけません。 - オブジェクト定義におけるプロパティ名の後の
:
は、スペースが前にあってはいけません。 - 三項演算子における
?
と:
は、その両側にスペースを使用します。 - 空のカッコ内にはスペースは使用しない。(例えば
{}
,[]
,fn()
)。 - 各ファイルの末尾には新しい空行が必要。
- いずれの否定演算子
!
においては、それに続くスペースを使用する。 - ファイル全体がクローじゃで包含されている場合でも、すべての関数の本体は一つのタブでインデントされています。
- スペースはドキュメントブロック内または行内のコードを整列することに使用できるが、先頭において使用されるべきはタブだけです。
*WordPressのJavaScriptの規約は、jQueryのスタイルガイドよりもわずかに広い空白のルールを選択しています。これらの違いは、WordPressのコードベースにおけるPHPとJavaScriptのファイルの間の一貫性を保つためです。
スペースは簡単に行の末尾にたまってしまいます。 -これを避けるには、 JSHintでは連なったスペースはエラーとしてキャッチされます。蓄積されたスペースをキャッチするもう1つの方法は、テキストエディタ内でスペースを見えるようにすることです。
Object オブジェクト
オブジェクトの宣言は、それが短い場合は(ライン長のガイドラインを思い出してください)1行で行うことができます。1行に収まらない場合には、1行につき1つのプロパティだけをあてます。プロパティ名は予約された言葉、または特殊文字が含まれている場合に引用符で囲む必要があります。
Arrays and Function Calls 配列と関数呼び出し
常に要素と引数の周りに付加したスペースが含まれています。
例外
Example of Good Spacing スペーシングの良い例
Indentation and Line Breaks インデントと改行
インデントや改行は、複雑な文に読みやすさを追加します。
インデントにはタブが使用されるべきです。ファイル全体がクロージャ(すなわち、すぐに呼び出される関数)に含まれている場合でも、その関数の内容は、1つのタブでインデントする必要があります。
Blocks and Curly Braces ブロックと中括弧
" if "、" else 、" for "、" while "、and " try " ブロックは常に中括弧{}を使用し、常に複数行に渡る必要があります。左中括弧は、関数定義、条件、またはループと同じ行にある必要があります。閉じ括弧は直接ブロックの最後の文の次の行にする必要があります。
Multi-line Statements 複数行のステートメント
文が長くて1行に収まらない場合には、改行は演算子の後に据える必要があります。
読みやすさを向上させるのであれば、たとえ両方が1行に収まる場合でも、自らの一行の上でも各式に分割されている三項演算子のように、論理的なグループに分割する必要があります。
条件が長くて1行に収まらない場合には、全体の中において連続する行を区別するために、1つレベルを追加してインデントされなければなりません。
Chained Method Calls 連鎖されたメソッド呼び出し
メソッド呼び出しのチェーンが1行に収まらない場合には、メソッドを呼び出すオブジェクトとは別の行の最初の呼び出しで、1行につき1つのコールを据えないといけません。この方法は、コンテキストを変更した場合、インデントの余分なレベルを使用する必要があります。
≪ Assignments and Glovals ≫
Declaring Variables With var 変数宣言におけるvar
各関数は、必要とされるいくつかのローカルな変数の宣言である、単一のコンマ区切りの var ステートメントを伴って開始されるべきである。仮に関数が var を使用して変数の宣言をしない場合は、外側のスコープにもれたり(頻繁にグローバルスコープとなる最悪のシナリオ)知らず知らずのうちに参照され、そのデータは変更されることもある。
var ステートメントにおける代入は個別の行にてリストされるべきで、宣言においては一行でグループ化することができる。いずれの付加された行も付加されたタブによりインデントされなければならない。5行以上を占めるオブジェクトと関数においては、過度のインデントを避けるために、var ステートメントの外側で指定されるべきである。
Globals グローバル変数
過去においてWordPress のコアはグローバル変数を多用していました。コアJavaScriptファイルが時々プラグイン内で使用されているので、既存のグローバル変数は削除すべきではありません。
ファイル内で使用される全てのグローバル変数は、そのファイルの先頭において記述されるべきです。複数のグローバル変数はカンマで分けることができます。
この例はそのファイル内で許されたグローバル変数 passwordStrength を作る。
passwordStrength の後の true は、このグローバル変数が、このファイル内で定義されていることを意味しています。あなたが他の場所で定義されているグローバルにアクセスしている場合は、読み取り専用としてグローバル変数を指定するために :true を省略します。
Common Libraries 共通のライブラリ
ここの部分がわからなくて訳せないので原文も載せておきます。
Backbone, jQuery, Underscore, and the global
wp
object are all registered as allowed globals in the root.jshintrc
file.
Backbone and Underscore may be accessed directly at any time. jQuery should be accessed through$
by passing thejQuery
object into an anonymous function:
Backbone、jQuery、Underscore、そしてグローバルなwp オブジェクトは全て .jshintrc ファイルのルートにて許可されたグローバルとして登録されています。
Backbone、Underscorehaはいつでも直接にアクセスすることができます。jQuery は匿名関数に jQuery オブジェクトを渡すことで$ を介してアクセスされるべきです。
This will negate the need to call
.noConflict()
, or to set$
using another variable. Files which add to, or modify, thewp
object must safely access the global to avoid overwriting previously set properties:
このことは .noConflict() を呼び出したり、別の変数を使用して $ にセットする必要がなくなります。
ファイルに追加する、または変更すること、WPのオブジェクトは、あらかじめ設定されたプロパティが上書きされないように、グローバルに安全にアクセスする必要があります:
≪ Naming Conventions 命名規則 ≫
変数名と関数名は、最初の文字には小文字を使用したキャメルケースを使用して、完全な単語である必要があります。この件においては、WordPressのPHPコーディング標準とこの規約とは異なる部分である。
new を用いてコンストラクタを使用する場合は、大文字の頭文字を使用するべきである(アッパーキャメルケース)。
名前はほどほどに説明的であるべきです。例外としては反復処理においてのループの指数を示すために使用されるような i に認められます。
≪ Comments コメント ≫
コメントはそれらが言及するコードの前に置き、常に空行が先にあるべきです。コメントの一文字目は大文字にし、完全な文章を書くときには最後にはピリオドを付けます。コメントトークン(//)とコメント文の間にはスペースが一つ必要です。
一行でのコメント
複数行のコメントは長いコメントの扱いにする必要があります。
Inline comments are allowed as an exception when used to annotate special arguments in formal parameter lists:
行の中のコメントにおいては、仮の引数リストの中の特別な引数の注釈として使用される時に例外として認められます。(formalの意味がよくわからない。)
≪ Equality 等価演算子 ≫
Strict equality checks (
===
) must be used in favor of abstract equality checks (==
). The only exception is when checking for bothundefined
andnull
by way ofnull
.
抽象的な等価演算子(==)は使いやすいが、厳格な同一演算子(===)が使用されなければならない。ただ一つの例外としては、「undefined」と「null」の両方を「null」を使用する方法において判別する時です。
≪ Type Checks 型チェック ≫
オブジェクトの型を確認するのに好ましい方法があります。
- String: typeof object === 'string'
- Number: typeof object === 'number'
- Boolean: typeof object === 'boolean'
- Object: typeof object === 'object' or _.isObject( object )
- Plain Object: jQuery.isPlainObject( object )
- Function: _.isFunction( object) or jQuery.isFunction( object )
- Array: _.isArray( object ) or jQuery.isArray( object )
- Element: object.nodeType or _.isElement( object )
- null: object === null
- null or undefined: object == null
- undefined:
- Global Variables: typeof variable === 'undefined'
- Local Variables: variable === undefined
- Properties: object.prop === undefined
- Any of the above: _.isUndefined( object )
Backbone もしくは Underscore はどこでも既に使われています。あなたはUnderscore.js の型チェックメソッドをjQueryで使用することを奨励されます。
≪ Strings 文字列 ≫
文字列リテラルには単一引用符を使用します。
文字列が単一引用符を含む時は、それらはバックスラッシュ(\)にてエスケープされる必要があります。
≪ Switch statements ≫
switch ステートメントの使用は、一般には反対されます。しかし、たくさんのケースがある時に、特に同じブロック内で複数のケースを扱える時に、もしくはロジックのフォールスルー(default のケース、case ブロックの通り抜け)を利用できることが重宝するかもしれません。
Switch ステートメントを使用する時は
- default 以外の各ケースにおいて break を使用する。フォールスルーをステートメントに許可するときは、明示的に記述する。
- switch 内において case は一つのタブでインデントする。
switch ステートメントの内部において値をリターンすることは推奨されない。case ブロックを使用して値をセットし、それから最後にそれらの値をリターンする。
≪ Best Practices 最良なる実践 ≫
Arrays 配列
Javascript で配列を作成する時は、new Array() 表記ではなくショートハンド [] コンストラクタを使用するべきである。
作成する時に配列を初期化することが出来ます。
Javascript においては、連想配列はオブジェクトとして定義されます。
Object オブジェクト
JavaScriptでオブジェクトを作成するにはいくつかの方法があります。オブジェクトリテラル表記は、{} 、最大のパフォーマンスであり、最も読みやすくもあります。
オブジェクトが特定のプロトタイプを必要としない場合はオブジェクトリテラル表記が使用されるべきであり、特定のプロトタイプが必要とされる場合は new を用いてコンストラクタ関数を呼び出して作成されるべきです。
オブジェクトのプロパティは、キーが変数ではない場合や予約後、もしくは文字列が有効な識別子では無い場合、ドット表記によってアクセスされるべきです。
"Yoda" Conditions ヨーダ条件式
PHP コーディング規約との一貫性をとるために、文字列、ブール値、数値もしくは他の定数やリテラルとオブジェクトを比較する時はいつでも、変数は常に右手に置かれるべきであり、定数やリテラルを左手に記述する。
「少し異様、読むために、そのうち慣れる」
Iteration 繰り返し
多きなコレクションを for ループで繰り返す時に、その都度最大値を再計算するのではなく、ループの最大値を変数に格納することを推奨します。
Underscore.js Collection Functions
Underscore.js collection と array methods を学び理解しましょう。_.each、_.map、そして _.reduce を含むこれらの関数は、さらなる効率と大きなデータのセットにおいて読みやすい変換を可能にします。
Underscore もまた、通常のJavaScriptオブジェクトとのjQuery スタイルの連鎖をゆるします。
Iterating Over jQuery collections
The only time jQuery should be used for iteration is when iterating over a collection of jQuery objects:
上の文、ちょっとわからない・・・jQuery オブジェクトのコレクションを反復処理するときに、一度だけのjQuery が反復に使用されるべきです。
生データやvanilla javascritp objects の反復にjQuery を使用してはいけない。
Principles of Writing Consistent, Idiomatic JavaScript一貫性のある慣用的な JavaScript の書き方
これ以下は『 Principles of Writing Consistent, Idiomatic JavaScript 』のページにある『一貫性のある慣用的な JavaScript の書き方』から。
Beautiful Syntax 美しい構文
A. 丸かっこ、中かっこ、改行
Copy‹›B. 割り当て、宣言、関数(名前、式、コンストラクター)
Copy‹›‹›‹›c. 例外や些細なこと
CopyD. 一貫性が常に勝つ
・・・省略・・・E. クオート
あなたの好みがシングルクオートだろうとダブルクオートだろうとどうでもいい事です。これらはJavaScript の解析においては違いはありません。絶対に強制されることは一貫性につながります。同じプロジェクトの中でクオートを混ぜないでください。一つのスタイルを選び、それにこだわって下さい。F. 行末と空行
スペースは読めない変更点を生み、差分を壊します。行末のスペースや空行のスペースを削除するためにコミット前の内容を組み込むかしっかり考えてください。Type Checking (Courtesy jQuery Core Style Guidelines) 型のチェック
A. 実際の型
WordPress Javascript Coding Standard で既出 ≪ Type Checks 型チェック ≫を参照のことB. 強制された型
次の実装を考えて見てください。
こういうHTML があったとします。Copy‹›これらは同じように強制的に変換するいくつかの方法です。
Copy‹›‹›CopyConditional Evaluation 条件分の評価
Copy‹›常にベストで正確な結果のための評価をしましょう - 上記はガイドラインであって、ドグマではありません。
注:ドグマとは・・・1.宗教上の教義。2.独断的な説。CopyPractical Style 実際のスタイル
CopyMisc 雑則
このセクションは偏見的と見なされるべきではないアイデアやコンセプトを説明する代わりに、一般的なプログラミングタスクを行うためのより良い方法を見つけるためのプラクティスを助長するものです。
A. switch の使用はできるだけ避けるべきでモダンなメソッドトレースは switch 文をブラックリストの関数にするでしょう。
Copy‹›B. ごくわずかなパフォーマンスと早く返り値を返すことでコードの可読性を促進します。
CopyNaming ネーミング
A. あなたがコードをコンパイルしたり圧縮したりするわけではないので、そういった事をしようとしてはいけません。
次のコードはひどいネーミングの例です。Copyまぎれもなくこう書いた方がいいでしょう。
これはロジックは同じですが、より親切で考えられたネーミングです(そして読みやすい構造になっています。):Copyネーミングの観点でいくつか補足すると
CopyB. this の扱い
後から呼び出される BoundFunction を定義する場合は call や apply の一般的な使われ方よりも .bind( this ) や同等の機能が好ましいです。好ましいオプションがない場合だけ、別の方法を考えましょう。Copyもし利用できない場合でも最近の多くのJavaScript ライブライには .bind と同様な機能があります。
Copy最後の回避方法は、識別子として this への別名に self を使うことですが、これは極端なバグになる傾向があるため、可能な限り避けるべきです。
CopyC. thisArg を使う
ES 5.1の各プロトタイプのメソッドでは特別な thisArg という署名に対応しています。これは可能な限り利用するべきです。CopythisArg は Array.prototype.every 、Array.prototype.forEach 、Array.prototype.some 、Array.prototype.map 、Array.prototype.filter と一緒に利用できます。
Native & Host Objects 以降は省略しました。
Post : 2015/07/06 11:22
Comments feed
Trackback URL : https://strix.main.jp/wp-trackback.php?p=56652