3

過去 4 ~ 5 年間、C# 属性を使用する多くの設計とフレームワークをベースにしてきました。

しかし最近、多くの人が公然とその使用を思いとどまらせたり、フレームワークを変更して必要性や使用を減らしたりしているのを目にします。

私はそれらが天の恵みであることを発見しましたが、今私は何が欠けているのか疑問に思い始めています.

明確にするために:構成よりも規約を使用することは、特にORM分野で従うべき主要な原則になりつつあります。この領域では、構成ファイル (XML) を使用してフィールドをマップしたり、属性を使用したり、データベース テーブルのフィールドに直接マップする共通の命名規則を使用したりできます。引用への言及はありませんが、ミックスに別の属性を追加することに対する反発を読みました.

しかし、今挙げた 3 つの選択肢の中で、やはり属性が最も理にかなっている気がします。構成ファイルは保守が難しく、一般的な命名規則により、データベース フィールドの実装に結び付けられます。属性は必要な場所に正確に配置され、使用されている場所から切り離すことなく実装を変更できます。

4

7 に答える 7

7

これは、一般的な答えを出すのが難しい質問です。属性は、正しく使用すると信じられないほど強力なもう 1 つの言語機能ですが、悪用される可能性があります。属性の使用を完全に破棄する説得力のある理由を見たことがありませんし、属性が悪い考えだと考える理由も実際にはありません。

実際、正反対のことが当てはまります。属性を使用すると、フレームワーク固有の情報をメタデータに追加できます。型階層を介して簡単に表現できない情報。これにより、属性を使用するフレームワークの能力が劇的に向上します。

私は確かに、人々がそれらを少し乱用した実装を 1 つまたは 2 つ見ましたが、目を見張るものはありませんでした。もっと具体的に言えますか?あなたが話している特定の属性/フレームワークはありますか。

于 2009-04-17T18:08:26.273 に答える
5

それは、「キャセロールにチーズを入れるべきか」など、かなり幅広い質問です。両方の答えは、「何を作っているかによる」です。

addributes を多用し、ほとんど宣言型プログラミング パラダイムのように使用している場合、おそらく途中で問題に遭遇するでしょう。それがリフレクションのどこかでの減速によるものなのか、それとも一般的なメンテナンス性によるものなのかは誰にもわかりません。

それは他のすべてのものと同じです...適切なときにそれらを使用して、コードをより効率的または読みやすくします。それらを使用するために使用しないでください。また、それらを放棄するためにそれらを放棄しないでください。

于 2009-04-17T18:09:08.597 に答える
3

属性には実際には 2 つの目的があります。ユーザーに表示されるものとして、およびコンパイラによって出力されるものとしてです。

ユーザーに表示される属性について話していると思います。

一般に、ユーザーに表示される属性は理想的ではないと思います。

ほとんどの場合、C# の上に何らかの形のカスタム言語を埋め込むために使用されます。DLINQ 属性は、この良い例です。消費者の観点から見たより良いアプローチは、ホスト言語にファースト クラスのサポートを追加することです。そのほうがずっと自然に感じられるでしょう。(テーブルと外部キーを定義するための言語サポートがあると、すべてのクレイジーな linq-to-sql 属性よりもはるかに簡単に操作できます)。

しかし実際には、プログラミング言語を拡張することは、ほとんどの開発者にとって法外な費用がかかりすぎます。メリットがコストを上回るわけではありません。

おそらくいつの日か、C# にメタプログラミング機能が追加され、そのようなことを簡単に行えるようになるでしょう。

ただし、現時点ではその機能はありません。

これにより、次の 3 つのオプションが残ります。

  1. 属性を使用する
  2. 動的言語を使用し、実行時にコードを生成する
  3. 生成的プログラミングを使用しないでください

通常、理想的ではない場合でも、1 番が最も簡単な選択になります。

于 2009-04-17T18:24:43.817 に答える
2

コードに関するメタデータを定義する場合、これらは非常に便利です。カスタム レポートの生成、プラグイン アーキテクチャ、およびサードパーティ コードとの通信に使用しています。

慣習に従ってすべてを行うことができると思いますが、私はそれらが好きです。

于 2009-04-17T18:08:53.947 に答える
1

ASP.NET MVC では属性が多用されています。実際、MVC に切り替えたことで、属性の使用が大幅に増えました。反属性のバックラッシュに対するあなたの認識がどこから来ているのかはわかりませんが、少なくともMVCに関しては、MSからは確かにわかりません。

属性を使用して、装飾されたコントローラー/アクション全体で横断的な動作 (側面) を提供できる方法が特に気に入っています。アクション呼び出しの前後に属性呼び出しを処理するために MVC がどのように構築されているかを見て、これが MVC でアスペクトを機能させるための好ましい方法であると信じなければなりません。

于 2009-04-17T18:10:15.207 に答える
0

まあ、ASP.NET MVC が問題ないのであれば、心配する必要はないと思います。そのフレームワークでは、リフレクションと属性を使用して非常に多くのことが行われているため、問題は見られません。MVC はかなり新しいフレームワークであり、あらゆる場所で使用されています。入力の検証から、エラーの処理、非常に優れた ActionFilter 属性まで、たくさんあります。いいえ、私は個人的に彼らに何の問題もないと思います。

于 2009-04-17T18:09:07.987 に答える
0

個人的には、ほとんどの言語機能と同様に、属性にはその役割がありますが、悪用または誤用される可能性があると思います。

正しいフレームワークでは、それらは非常に貴重です。それらは間違いなく DI フレームワーク ( MEFが良い例です) などを単純化し、フレームワークのテストなどに非常に役立ちます。

ただし、ユーザー定義の属性を追加するのはやり過ぎだと思います。私は個人的に属性を使用するのが大好きですが、その使用を最小限に抑え、最も意味のある場所でのみ使用するようにしています.

于 2009-04-17T19:56:52.877 に答える