コンストラクターとクラス、および単一のクラスのみを含むファイルのコメントブロックを一貫して書き込むための、最も有用/最も標準的/最も驚くべき方法は何ですか?
そして、ファイル自体?クラスが1つしかない場合、コメントブロックが必要ですか?どのような詳細がそこに行くべきですか?
クラス、コンストラクター、ファイルコメントブロック間の繰り返しをできるだけ避けたいと思います。
これは、あなたの状況と、一緒に働く人々またはあなたの後に来る人々の想定されるスキルレベルに大きく依存します。
フレームワーク、ライブラリ、またはユーザーがすべてのスキルレベルであると通常想定している種類のものを公開する場合、mightできるだけ多くの些細ながらくたを文書化する必要がありますコミュニティが処理しなければならない質問の負荷を減らすため。
ドキュメントが大きな苦痛になる可能性があると思う例から始めましょう。
PHPDocを使用する場合は、ファイルdocブロックとその後の別のdocブロック(通常はクラスdocブロック)が必要です。
それらには@package
タグが**必要*です。それ以外はすべてオプションです。
これまでのところ、@package
タグでさえ、プロジェクト用に自動的に生成できる可能性があるため、オプションであると言います。そして、私が正しく覚えていれば、PHPDocを使用すると、タグのないすべてのものにデフォルトのパッケージを設定することもできます。
一般的なドキュメントについては、例から始めましょう(より長い例は最後にあります):
getUri
の場合、URIが何を表すかが説明されていることに注意してください(私が想定するコメントで何か話したいことがあるだけです)が、isAbsUri
にはないので、少なくとも「absは絶対を意味する」と2回言います。
オープンソースプロジェクトでない場合(またはCOMPLETE !!! 11elevenapiドキュメントを出荷する必要がある場合):
stronglyドキュメントの代わりに適切で長く説明的なクラス、変数、メソッド名を使用することをお勧めします。
Docブロックに何かを再度書き込むことによるメリットはありません。また、2011年であり、120文字幅の端末とオートコンプリートがあるため、一部の文字を節約するためにすべてを短縮する必要はありません。
些細なことを文書化することはあなたとあなたのチームを傷つけるとさえ主張します誰もあなたから価値を得られないことに時間を無駄にすることによって、常に些細なドキュメントを書く習慣になりますもう読んでいません。
良いコメントは何かが行われた理由を説明する必要がありますが、コード自体はそれ以上のコメントを必要とせずにどのように説明する必要があります。
class myClass {
/**
* Constructor
*/
public function __construct() {
}
いくつかのガイドラインでは、[〜#〜] have [〜#〜]to document[〜#〜]すべて[〜#〜 ]そしてあなたは人々が何度も何度も明白なことを述べることになります。
これは価値を追加しませんが、コードを読むときに時間を浪費します。
class Person {
/**
* Set a persons weight in Kilogram
*
* @param float $kg Weight in Kilogram
*/
public function setWeight($kg) {}
一部の人は別のシステムを使用している可能性があり、「kg」をグーグルで検索できないため、「kg」の意味を説明する必要があるため、このコードは簡単に文書化できます。
私は書くことに賛成です
class Person {
/**
* @param float $kilogram
*/
public function setWeight($kilogram) {}
setWeight
でPerson
を呼び出すと、人に重みを設定することが本当に期待できるため、docブロックは不要です。もう一度書き出す必要はありません。
$ kilogrammをパラメーターとして使用すると、ドキュメントで説明する手間も省けます。環境によっては、測定単位が本当にわからない場合は、誰もが「キログラム」をグーグルで検索することが期待できます。
public function generateReport() {
// get the db connection
$reg = WhateverGlobalStorage::get(“db“);
// auth
if(!$reg->getOne("SELECT view_report FROM USER ...")) {}
// template
$id = $reg->getOne("select ... ");
// render
new ReportTemplate($id); // ...
}
それらが別々の「ブロック」である場合は、それらを記述的な名前付き関数に移動するだけです。
public function generateReport() {
$this->checkAuthentication();
$template = this->createReportTemplate();
$this->renderReport($template);
}
// Not perfect but at least you can grasp what the method does much quicker
いくつかの会議でこのテーマについて行ったプレゼンテーションのスライド: Slideshare: clean-code-stop-wasting-my-time
そして、追加の小さく、少し古い、暴言: they-told-you-to-document-everything-they-lied
Clean Code: A Handbook of Agile Software Craftsmanship
abstract class xyzRequest {
/**
* Initializes this xyzRequest.
*
* Available options:
*
* * logging: Whether to enable logging or not (false by default)
*
* @param xyzEventDispatcher $dispatcher An xyzEventDispatcher instance
* @param array $parameters An associative array of initialization parameters
* @param array $attributes An associative array of initialization attributes
* @param array $options An associative array of options
*
* @return bool true, if initialization completes successfully, otherwise false
*
* @throws <b>xyzInitializationException</b> If an error occurs while initializing this xyzRequest
*/
public function initialize(xyzEventDispatcher $dispatcher, $parameters = array(), $attributes = array(), $options = array()) {
そのドキュメントの内容を1行ずつ見ていきましょう。(ここで少し冗談を言って、私の主張を理解します)
* Initializes this xyzRequest.
それで、xyzRequestで-> initializeを呼び出すと、そのリクエストが初期化されますか?本当に? Okそれなら、あなたがそう言うなら!
* Available options:
*
* * logging: Whether to enable logging or not (false by default)
2番目または3番目のパラメーターではなく、3番目のパラメーターのオプションが通知されますが、フレームワークを知っていれば、それらを知っているでしょうか。 (誰かが使用を言わずに->初期化が何をするのか理解できないので、私たちはそれほど賢くないかもしれません...)
* @param xyzEventDispatcher $dispatcher An xyzEventDispatcher instance
ええ、タイプのヒントがあります。したがって、メソッドが「xyzEventDispatcherインスタンス」を予期している場合は、「xyzEventDispatcherインスタンス」を渡す必要があります。知っておくと良い。
* @param array $parameters An associative array of initialization parameters
* @param array $attributes An associative array of initialization attributes
* @param array $options An associative array of options
OK。したがって、線形配列ではありません。しかし、「初期化パラメータ」を「初期化」メソッドに渡す必要があることは、私が理解できたはずです。
私が実際にそこに渡す必要があるものはまだわかりませんが、文書化されている限り、問題はありません!
* @return bool true, if initialization completes successfully, otherwise false
したがって、ブール値の戻り値は、「良い」の場合は「true」、悪い場合は「false」です。
* @throws <b>xyzInitializationException</b> If an error occurs while initializing this xyzRequest
*/
したがって、関数の名前を実行しているときにエラーが発生すると、例外がスローされますか?
したがって、エラーの場合は例外が使用されます。 OK。知っておくと良い。
個人的には、コンストラクターでコメントするのは、特別な何か(特別な初期化など)がある場合のみです。
これが「最も便利な」方法だとは言えませんが、コードを整理し、同じことを2回繰り返す必要はありません(それが懸念事項の場合)。
個人的には、クラスとメソッドのドキュメントが最も重要なドキュメントだと思います。コードを書くとき、コード補完によってメソッドに属するドキュメントが表示されたら、IDEの助けが必要です。こうすることで、必要なメソッドを簡単に見つけることができます。
クラスの明示的な初期化を最小限に抑えようとしているので、コンストラクターのコメントは使用しません。したがって、コンストラクター自体の使用は避けようとしています。
メソッドまたは関数のコードは、宣言型変数名を使用し、それらをできるだけ小さくして、できるだけ明確にする必要があります。統合の問題など、予期しないことをした場合にのみコメントします。