文書化すべき内容

WordPressにおけるJavaScriptの文書化は、フォーマットされた文書ブロックまたはインラインコメントの形を取ります。

以下は、WordPressのJavaScriptファイルで文書化すべき内容のリストです:

  • 関数とクラスメソッド
  • オブジェクト
  • クロージャ
  • オブジェクトプロパティ
  • 要件
  • イベント
  • ファイルヘッダー

文書化のヒント

言語

短い説明は明確でシンプル、かつ簡潔であるべきです。「何」と「いつ」を文書化し、「なぜ」はほとんど含める必要はありません。「なぜ」は必要に応じて長い説明に含めることができます。例えば:

関数とクロージャは三人称単数の要素であり、各々が何をするかを説明するために三人称単数動詞を使用する必要があります。

三人称単数動詞の活用を思い出すのに助けが必要ですか?関数、フック、クラス、またはメソッドの要約の前に「それ」を付けることを想像してください:

  • 良い: 「(それ) は何かをします。」
  • 悪い: 「(それ) は何かをする。」

関数: 関数は何をしますか?

  • 良い: X要素のクリックを処理します。
  • 悪い: X要素のための後方互換性のために含まれています。

@since: WordPressに何かが追加されたバージョンを検索する際に推奨されるツールは svn blame です。

これらのツールを使用した後にバージョン番号が特定できない場合は、@since Unknownを使用してください。

コードリファクタリング: 文書の変更時にファイル内のコードをリファクタリングしないでください。

文法

記述要素は完全な文として書かれるべきです。この基準の唯一の例外は、ファイルヘッダーの要約であり、これは文よりもファイルの「タイトル」として意図されています。

要約、説明、パラメータまたは戻り値の説明で要素を列挙する際には、連続(オックスフォード)カンマを使用するべきです。

フォーマットガイドライン

以下のガイドラインに従って、ドキュメントブロックの内容がコードリファレンスに含まれるために適切に解析できるようにします。

短い説明:

短い説明は1文であり、いかなるマークアップも含まれてはいけません。説明がHTML要素またはタグを指す場合は、「リンクタグ」と書くべきであり、「<a>」とは書かないでください。例えば: 「ヘッダーでリンクタグを印刷するときに発火します」。

長い説明:

必要に応じて、長い説明ではMarkdownを使用できます。

@paramおよび@returnタグ:

これらのタグの説明にはHTMLまたはMarkdownは許可されていません。HTML要素とタグは「オーディオ要素」または「リンクタグ」として書かれるべきです。

行の折り返し

DocBlockテキストは、80文字のテキストの後に次の行に折り返すべきです。DocBlock自体が左に20文字分インデントされている場合、折り返しは位置100で発生する可能性がありますが、合計120文字を超えてはなりません。

コメントの整列

関連するコメントは、より読みやすくするために整列されるように間隔を空けるべきです。

例えば:

  1. /**
  2. * @param {very_long_type} name Description.
  3. * @param {type} very_long_name Description.
  4. */

関数

関数は以下のようにフォーマットされるべきです:

  • 要約: 関数の目的についての簡潔な1行の説明。文末にピリオドを使用します。
  • 説明: 要約の補足として、より詳細な説明を提供します。文末にピリオドを使用します。
  • @deprecated x.x.x: 非推奨の関数にのみ使用し、関数が非推奨になったバージョンを提供します。これは常に3桁であるべきです(例: @deprecated 3.6.0)、および代わりに使用する関数を提供します。
  • @since x.x.x: 初回導入のために3桁であるべきです(例: @since 3.6.0)。重要な変更が行われた場合は、追加の@sinceタグ、バージョン、および説明を追加して変更履歴として機能させるべきです。
  • @access: プライベートな場合にのみ関数に使用します。関数がプライベートである場合、それは内部使用のみを意図しており、コードリファレンスには文書化されません。
  • @class: クラスのコンストラクタに使用します。
  • @augments: クラスのコンストラクタの場合、直接の親をリストします。
  • @mixes: オブジェクトにミックスインされたミックスインをリストします。
  • @alias: この関数が一時変数に最初に割り当てられた場合、文書化される名前を変更できます。
  • @memberof: JSDocが自動的に解決できない場合、この関数が含まれる名前空間を示します。
  • @static: クラスのために、関数がクラスコンストラクタの静的メソッドであることを示します。
  • @see: 依存している関数またはクラス。
  • @link: さらなる情報を提供するURL。
  • @fires: 関数によって発火されるイベント。特定のクラスに関連付けられたイベントは、クラス名をリストするべきです。
  • @listens: この関数がリッスンするイベント。イベントはイベント名前空間でプレフィックスされる必要があります。特定のクラスに関連付けられたイベントは、クラス名をリストするべきです。
  • @global: この関数をグローバル関数としてマークし、グローバル名前空間に含めることを示します。
  • @param: 変数の簡潔な説明を提供し、特に(例: 変数がオプションである場合、そのデフォルト)をJSDoc @param構文で示します。文末にピリオドを使用します。
  • @yield: ジェネレーター関数の場合、この関数から期待される値の説明。その他の説明と同様に、文末にピリオドを含めます。
  • @return: 説明の後にピリオドを記載します。
  1. /**
  2. * Summary. (use period)
  3. *
  4. * Description. (use period)
  5. *
  6. * @since x.x.x
  7. * @deprecated x.x.x Use new_function_name() instead.
  8. * @access private
  9. *
  10. * @class
  11. * @augments parent
  12. * @mixes mixin
  13. *
  14. * @alias realName
  15. * @memberof namespace
  16. *
  17. * @see Function/class relied on
  18. * @link URL
  19. * @global
  20. *
  21. * @fires eventName
  22. * @fires className#eventName
  23. * @listens event:eventName
  24. * @listens className~event:eventName
  25. *
  26. * @param {type} var Description.
  27. * @param {type} [var] Description of optional variable.
  28. * @param {type} [var=default] Description of optional variable with default variable.
  29. * @param {Object} objectVar Description.
  30. * @param {type} objectVar.key Description of a key in the objectVar parameter.
  31. *
  32. * @yield {type} Yielded value description.
  33. *
  34. * @return {type} Return value description.
  35. */

Backboneクラス

Backboneのextend呼び出しは以下のようにフォーマットされるべきです:

  • @lends このタグは、JSDocがBackboneのextend関数をクラス定義として認識できるようにします。これは、クラス定義を含むオブジェクトの直前に配置するべきです。

Backboneのinitialize関数は以下のようにフォーマットされるべきです:

  • 要約: 関数の目的についての簡潔な1行の説明。文末にピリオドを使用します。
  • 説明: 要約の補足として、より詳細な説明を提供します。文末にピリオドを使用します。
  • @deprecated x.x.x: 非推奨のクラスにのみ使用し、クラスが非推奨になったバージョンを提供します。これは常に3桁であるべきです(例: @deprecated 3.6.0)、および代わりに使用するクラスを提供します。
  • @since x.x.x: 初回導入のために3桁であるべきです(例: @since 3.6.0)。重要な変更が行われた場合は、追加の@sinceタグ、バージョン、および説明を追加して変更履歴として機能させるべきです。
  • @constructs: この関数をこのクラスのコンストラクタとしてマークします。
  • @augments: 直接の親をリストします。
  • @mixes: クラスにミックスインされたミックスインをリストします。
  • @requires: このクラスが必要とするモジュールをリストします。複数の@requiresタグを使用できます。
  • @alias: このクラスが一時変数に最初に割り当てられた場合、文書化される名前を変更できます。
  • @memberof: JSDocが自動的に解決できない場合、このクラスが含まれる名前空間を示します。
  • @static: クラスのために、関数がクラスコンストラクタの静的メソッドであることを示します。
  • @see: 依存している関数またはクラス。
  • @link: さらなる情報を提供するURL。
  • @fires: コンストラクタによって発火されるイベント。クラス名をリストするべきです。
  • @param: コンストラクタに渡される引数を文書化します。initializeに明示的にリストされていなくても、文書化します。文末にピリオドを使用します。
    • Backboneモデルにはattributesおよびoptionsパラメータが渡されます。
    • Backboneビューにはoptionsパラメータが渡されます。
  1. Class = Parent.extend( /** @lends namespace.Class.prototype */{
  2. /**
  3. * Summary. (use period)
  4. *
  5. * Description. (use period)
  6. *
  7. * @since x.x.x
  8. * @deprecated x.x.x Use new_function_name() instead.
  9. * @access private
  10. *
  11. * @constructs namespace.Class
  12. * @augments Parent
  13. * @mixes mixin
  14. *
  15. * @alias realName
  16. * @memberof namespace
  17. *
  18. * @see Function/class relied on
  19. * @link URL
  20. * @fires Class#eventName
  21. *
  22. * @param {Object} attributes The model's attributes.
  23. * @param {type} attributes.key One of the model's attributes.
  24. * @param {Object} [options] The model's options.
  25. * @param {type} options.key One of the model's options.
  26. */
  27. initialize: function() {
  28. //Do stuff.
  29. }
  30. } );

Backboneクラスに初期化関数がない場合は、@inheritDocを使用して文書化するべきです:

  1. /**
  2. * Summary. (use period)
  3. *
  4. * Description. (use period)
  5. *
  6. * @since x.x.x
  7. * @deprecated x.x.x Use new_function_name() instead.
  8. * @access private
  9. *
  10. * @constructs namespace.Class
  11. * @memberOf namespace
  12. * @augments Parent
  13. * @mixes mixin
  14. * @inheritDoc
  15. *
  16. * @alias realName
  17. * @memberof namespace
  18. *
  19. * @see Function/class relied on
  20. * @link URL
  21. */
  22. Class = Parent.extend( /** @lends namespace.Class.prototype */{
  23. // Functions and properties.
  24. } );

注意: 現在、JSDocのinheritDocタグのバグのため、期待される機能を提供していません。詳細は JSDocs3 issue 1012 を参照してください。

ローカル関数

時には、関数がクラスメンバーとして割り当てられる前にローカル変数に割り当てられることがあります。

そのような関数は、それを使用する名前空間の内部関数として~を使用してマークするべきです。

関数は以下のようにフォーマットされるべきです:

  1. /**
  2. * Function description, you can use any JSDoc here as long as the function remains private.
  3. *
  4. * @alias namespace~doStuff
  5. */
  6. var doStuff = function () {
  7. // Do stuff.
  8. };
  9. Class = Parent.extend( /** @lends namespace.Class.prototype */{
  10. /**
  11. * Class description
  12. *
  13. * @constructs namespace.Class
  14. *
  15. * @borrows namespace~doStuff as prototype.doStuff
  16. */
  17. initialize: function() {
  18. //Do stuff.
  19. },
  20. /*
  21. * This function will automatically have it's documentation copied from above.
  22. * You should make a comment ( not a DocBlock using /**, instead use /* or // )
  23. * noting that you're describing this function using @borrows.
  24. */
  25. doStuff: doStuff,
  26. } );

ローカル先祖

時には、クラスがローカル変数にのみ割り当てられた先祖を持つことがあります。そのようなクラスは、子供が属する名前空間に割り当てられ、~を使用して内部クラスにするべきです。

クラスメンバー

クラスメンバーは以下のようにフォーマットされるべきです:

  • 短い説明: 文末にピリオドを使用します。
  • @since x.x.x: 初回導入のために3桁であるべきです(例: @since 3.6.0)。重要な変更が行われた場合は、追加の@sinceタグ、バージョン、および説明を追加して変更履歴として機能させるべきです。
  • @access: メンバーがプライベート、保護、または公開であるかどうか。プライベートメンバーは内部使用のみを意図しています。
  • @type: クラスメンバーの型をリストします。
  • @property: このオブジェクトが持つすべてのプロパティをリストします。オブジェクトの場合、文末にピリオドを使用します。
  • @member: 必要に応じて、@typeの代わりにJSDocのメンバー検出をオーバーライドするために使用します。
  • @memberof: 必要に応じて、これはどのクラスのメンバーであるかをオーバーライドするために使用します。
  1. /**
  2. * Short description. (use period)
  3. *
  4. * @since x.x.x
  5. * @access (private, protected, or public)
  6. *
  7. * @type {type}
  8. * @property {type} key Description.
  9. *
  10. * @member {type} realName
  11. * @memberof className
  12. */

名前空間

名前空間は以下のようにフォーマットされるべきです:

  • 短い説明: 文末にピリオドを使用します。
  • @namespace: このシンボルを名前空間としてマークし、オーバーライドとして名前を提供することができます。
  • @since x.x.x: 初回導入のために3桁であるべきです(例: @since 3.6.0)。重要な変更が行われた場合は、追加の@sinceタグ、バージョン、および説明を追加して変更履歴として機能させるべきです。
  • @memberof: この名前空間が含まれている名前空間。
  • @property: この名前空間が公開するプロパティ。文末にピリオドを使用します。
  1. /**
  2. * Short description. (use period)
  3. *
  4. * @namespace realName
  5. * @memberof parentNamespace
  6. *
  7. * @since x.x.x
  8. *
  9. * @property {type} key Description.
  10. */

インラインコメント

メソッドや関数内のインラインコメントは以下のようにフォーマットされるべきです:

単一行コメント

  1. // Extract the array values.

複数行コメント

  1. /*
  2. * This is a comment that is long enough to warrant being stretched over
  3. * the span of multiple lines. You'll notice this follows basically
  4. * the same format as the JSDoc wrapping and comment block style.
  5. */

重要な注意: 複数行コメントは/**(二重アスタリスク)で始めてはいけません。代わりに/*(単一アスタリスク)を使用してください。

ファイルヘッダー

JSDocファイルヘッダーブロックは、ファイルに含まれる内容の概要を提供するために使用されます。

可能な限り、すべてのWordPress JavaScriptファイルにはヘッダーブロックを含めるべきです。

WordPressは一般的なコード品質テストのためにJSHintを使用します。インライン設定オプションは、ヘッダーブロックの最後に配置するべきです。

  1. /**
  2. * Summary. (use period)
  3. *
  4. * Description. (use period)
  5. *
  6. * @link URL
  7. * @file This files defines the MyClass class.
  8. * @author AuthorName.
  9. * @since x.x.x
  10. */
  11. /** jshint {inline configuration here} */

サポートされているJSDocタグ

タグ 説明
@abstract このメソッドは継承者によって実装(またはオーバーライド)される可能性があります。
@access このメンバーのアクセスレベルを指定します(プライベート、パブリック、または保護)。
@alias メンバーを異なる名前を持つかのように扱います。
@augments このクラスは親クラスから継承します。
@author アイテムの著者を特定します。
@borrows このオブジェクトは他のオブジェクトから何かを使用します。
@callback コールバック関数を文書化します。
@class この関数はクラスコンストラクタです。
@classdesc クラス全体を説明するために以下のテキストを使用します。
@constant オブジェクトを定数として文書化します。
@constructs この関数メンバーは前のクラスのコンストラクタになります。
@copyright 著作権情報を文書化します。
@default デフォルト値を文書化します。
@deprecated これはもはや推奨される方法ではないことを文書化します。
@description シンボルを説明します。
@enum 関連するプロパティのコレクションを文書化します。
@event イベントを文書化します。
@example 文書化されたアイテムの使用例を提供します。
@exports JavaScriptモジュールによってエクスポートされるメンバーを特定します。
@external 外部クラス/名前空間/モジュールを文書化します。
@file ファイルを説明します。
@fires このメソッドが発火する可能性のあるイベントを説明します。
@function 関数またはメソッドを説明します。
@global グローバルオブジェクトを文書化します。
@ignore [todo] 最終出力からこれを削除します。
@inner 内部オブジェクトを文書化します。
@instance インスタンスメンバーを文書化します。
@kind これはどのようなシンボルですか?
@lends 同じ名前の異なるオブジェクトを区別します。
@license [todo] このコードに適用されるソフトウェアライセンスを文書化します。
@link インラインタグ – リンクを作成します。
@member メンバーを文書化します。
@memberof このシンボルは親シンボルに属します。
@mixes このオブジェクトは他のオブジェクトからすべてのメンバーをミックスインします。
@mixin ミックスインオブジェクトを文書化します。
@module JavaScriptモジュールを文書化します。
@name オブジェクトの名前を文書化します。
@namespace 名前空間オブジェクトを文書化します。
@param 関数へのパラメータを文書化します。
@private このシンボルはプライベートであることを意図しています。
@property オブジェクトのプロパティを文書化します。
@protected このメンバーは保護されることを意図しています。
@public このシンボルは公開されることを意図しています。
@readonly このシンボルは読み取り専用であることを意図しています。
@requires このファイルはJavaScriptモジュールを必要とします。
@return 関数の戻り値を文書化します。
@see さらなる情報のために他の文書を参照します。
@since 関数が追加されたバージョン、または重要な変更が行われたときを文書化します。
@static 静的メンバーを文書化します。
@this ここでの「this」キーワードは何を指しますか?
@throws 発生する可能性のあるエラーを説明します。
@todo 完了すべきタスクを文書化します。
@tutorial 含まれているチュートリアルファイルへのリンクを挿入します。
@type オブジェクトの型を文書化します。
@typedef カスタム型を文書化します。
@variation 同じ名前の異なるオブジェクトを区別します。
@version アイテムのバージョン番号を文書化します。
@yield ジェネレーター関数の生成される値を文書化します。

サポートされていないJSDocタグ

タグ なぜサポートされていないか
@summary 使用すべきではありません。要約と完全な説明を分ける方法の例を参照してください。
@virtual サポートされていない同義語。代わりに@abstractを使用してください。
@extends サポートされていない同義語。代わりに@augmentsを使用してください。
@constructor サポートされていない同義語。代わりに@classを使用してください。
@const サポートされていない同義語。代わりに@constantを使用してください。
@defaultvalue サポートされていない同義語。代わりに@defaultを使用してください。
@desc サポートされていない同義語。代わりに@descriptionを使用してください。
@host サポートされていない同義語。代わりに@externalを使用してください。
@fileoverview サポートされていない同義語。代わりに@fileを使用してください。
@overview サポートされていない同義語。代わりに@fileを使用してください。
@emits サポートされていない同義語。代わりに@firesを使用してください。
@func サポートされていない同義語。代わりに@functionを使用してください。
@method サポートされていない同義語。代わりに@functionを使用してください。
@var サポートされていない同義語。代わりに@memberを使用してください。
@emits サポートされていない同義語。代わりに@firesを使用してください。
@arg サポートされていない同義語。代わりに@paramを使用してください。
@argument サポートされていない同義語。代わりに@paramを使用してください。
@prop サポートされていない同義語。代わりに@propertyを使用してください。
@returns サポートされていない同義語。代わりに@returnを使用してください。
@exception サポートされていない同義語。代わりに@throwsを使用してください。