web-dev-qa-db-ja.com

PHPのコメント注釈の利点とコストの違いは何ですか?

私はsymfony2での作業を始めたばかりで、コメント注釈に出くわしました。

コメント注釈はPHPの固有の部分ではありませんが、symfony2はこの機能のサポートを追加します。

コメントについての私の理解は、それによってコードが人間にとってよりわかりやすくなるということです。コンピュータはコメントの内容を気にする必要はありません。

通常のPHPコードにコマンドを入力するだけの場合と比べて、このタイプの注釈を実行することにはどのような利点がありますか?

すなわち

/**
 * @Route("/{id}")
 * @Method("GET")
 * @ParamConverter("post", class="SensioBlogBundle:Post")
 * @Template("SensioBlogBundle:Annot:post.html.twig", vars={"post"})
 * @Cache(smaxage="15")
 */
public function showAction(Post $post)
{
}
6
Patrick

コメント注釈(特にsymfony2のフォーマット)ですぐに頭に浮かぶいくつかの問題があります:

  1. 開発者の混乱投稿したコードは、DocBlockドキュメントコメントのように正確に見えます。コメントは2つのメタプロセッサ間で効果的に交換可能ですが(それぞれは理解できないものを無視するか、他のものを適切に処理する他の方法を使用します)、特に開発者が特定のコメントの目的を理解する場合と理解しない場合があります。どちらか一方のシステムに完全に精通しているわけではありません。さらに、注釈とドキュメントを混同する可能性があります。これにより、ドキュメントであると思われるが実際には「コード」であるものを誰かが削除する可能性があります。
  2. 潜在的なメタプロセッサの競合上記の理由により、一方または他方のメタプロセッサがより厳密で、許可されていないものを許可しないと決定した場合に何が起こるか認識できますか?今、あなたのプロセッサは考えられるあらゆる点で壊れます。クリーンアップに時間を費やすことを要求し、必然的にプロセスで何か価値のあるものを失います(時間、およびドキュメントまたは注釈のいずれかを含む)。コメントで行う必要がある場合(利点を参照)、少なくとも別のインジケーターを使用して、ドキュメント標準と区別する必要があります(良い例は、SASS /コンパスコメントと標準CSSコメントです。CSS/**/コメントはコンパイルされたCSSに送信されますが、CSS以外のコメント//はコンパイラによって処理されます。さらに、最初の2文字を見れば、2つをかなり簡単に区別できます。
  3. コード/コメントの線ぼかし一般的なプログラミングでは、コードとコメントは別々になっているはずです。実行するコードはコメントに含めないでください。通常、明白な理由により実行しないため)。次に、コメント内で他のことを実行するための扉を開き、実際にコメントする機能を押し出すか、他のフープを飛び越えてコメント内コードと実際のコメントを区別する必要があります(これにより、コンパイル時間/リソースも増加します)コンパイラーは、すべてのコメントを無視してではなく、より多くのコメントを調べて、それらが意味があるかどうかを判断する必要があります。 Symfonyの注釈に関するコメントをざっと見た他の代替案には、注釈の周りに山括弧をラップするC#のスタイル、Pythonのデコレータースタイル(基本的にsymfonyにはすでにあるがコメントにラップされていないもの)、そしておそらく他のあらゆるスタイルが含まれますコメント内で行うよりも優れています。 (または、別の言い方をすると- 「バグの原因を見つけるためにコメント内を調べる必要がない」という規則に違反しています。

そうは言っても、このようなことをすることにはその利点がないわけではありません。

  1. 言語でネイティブに利用できない機能を追加します。何よりもまず、これがSymfonyによってこのように行われる理由です。 PHPにはデコレータ/アノテーションがないため、その機能が必要な場合は、実装する方法を見つける必要があります。さらに、ユーザーがPHP拡張機能に依存しないようにしたい場合(ユーザーが環境のそのレベルを常に制御できるわけではないため)、内部でそれを行う方法を見つける必要があります。 PHPコンパイラを壊しません。コメントは当然の選択です。

  2. 特定のセグメントにさまざまな機能を追加するためのクリーンな方法を提供します。アノテーション/デコレータを最もよく見たのはPythonですが、おそらくそれを見るでしょう。あなたがそれらを使うなら、他の多くの言語で。たとえば、CherryPyはそれを使用して関数をWebページコントローラーとして公開します(つまり、PHPコントローラーの特定のパブリック関数にアクセスするのと同じ方法で、ブラウザーから特定のデコレーターを持つ関数にアクセスできます)。それらは基本的に、関数またはクラスに「拡張」機能を提供し、関数内のコードを乱雑にすることなくユーティリティ機能を提供します。

残念ながら、私はSymfonyの形式で他の人を指摘するのに十分なほどSymfonyを知りませんが、これの賛否両論については、この Hacker Newsスレッド に興味があるかもしれません。また、ネイティブアノテーションの PHPサイトでの変更のリクエスト にも関心があります。

5
Shauna

これは確かにPHPコードに変換されてからキャッシュされるため、コストは事実上無視できます。コードを頻繁に変更しない限り、コードはPHP code(理論的には、手動で作成するコードよりも高速なコードでさえあります)

行う理由は、これがシステムにこの情報を提供するすてきでコンパクトな方法であるということです。これらの5行にPHP数行追加)が必要であり、それが関係していること。

欠点として、各抽象化はコストをもたらし、新しいバグのソースを追加します(パーサーにバグがあるか、バグのあるコードが生成された場合はどうなりますか?)

1
johannes

私にはそれは非常に悪い習慣のようです。上記の例のshowAction__META()のように、メタ関数がこの種のメタデータを関数に返すことで同じ結果を得ることができますが、欠点はすべて避け、それらは多数あります。ソースコードを実行するためだけにソースコードを読み取る必要性。これにより、コンパイラ/ランタイムの最適化が頭に浮かびます。また、直接テストすることもできず、構文チェックを行うときに特別な注意が必要です。これは、PHPを直接使用する代わりに、さまざまなテンプレート言語が採用しているのと同じ愚かなre-invent-the-wheelアプローチです。

1
Andris