2009-04-17 9 views
3

Ich habe viele Designs und Frameworks, die C# -Attribute in den letzten 4 oder 5 Jahren verwenden.Glauben Sie, dass C# -Attribute (oder ähnliche Mechanismen) eine gute Idee sind, oder raten Sie davon ab, sie zu verwenden?

Aber in letzter Zeit sehe ich viele Menschen, die offen ihre Benutzung oder Änderung ihrer Frameworks entmutigen, um die Notwendigkeit oder den Gebrauch von ihnen zu reduzieren.

Ich fand sie ein Geschenk des Himmels, aber jetzt fange ich an mich zu fragen, was ich vermisse.

Zur Klarstellung: Verwendung Convention over Configuration wird zu einem wichtigen Prinzip, insbesondere im ORM-Bereich. In diesem Bereich können Sie Felder mit einer Konfigurationsdatei (XML) zuordnen, ein Attribut verwenden oder eine allgemeine Namenskonvention verwenden, die direkt Feldern in Ihren Datenbanktabellen zugeordnet ist. Ich habe keine Verweise auf ein Zitat, aber ich habe etwas Gegenreaktion gegen das Hinzufügen eines anderen Attributs zum Mix gelesen.

Aber ich fühle über die drei Möglichkeiten, die ich gerade aufgelistet habe, dass Attribute immer noch am sinnvollsten sind. Eine Konfigurationsdatei ist schwieriger zu pflegen und eine allgemeine Namenskonvention bindet Sie an die Implementierung des Datenbankfeldes. Die Attribute werden genau dort platziert, wo sie benötigt werden, und die Implementierung kann sich ändern, ohne dass sie von ihrem Einsatzort getrennt werden müssen.

+3

Können Sie auf einige Links verweisen, die deren Verwendung erschweren? –

+0

Ich werde versuchen zu sehen, was ich finden kann. –

Antwort

3

Es gibt wirklich zwei Zwecke von Attributen: als Benutzer sichtbare Dinge und als Dinge von einem Compiler emittiert.

Ich nehme an, Sie sprechen über Benutzer sichtbare Attribute.

Im Allgemeinen würde ich sagen, dass Benutzer sichtbare Attribute nicht ideal sind.

Die meiste Zeit werden sie verwendet, um eine Form der benutzerdefinierten Sprache zusätzlich zu C# einzubetten. DLINQ-Attribute sind ein gutes Beispiel dafür. Ein besserer Ansatz aus der Sicht des Verbrauchers wäre es, der Host-Sprache einen erstklassigen Support zu bieten. Das würde am Ende viel natürlicher erscheinen. (Mit Sprachunterstützung zum Definieren von Tabellen und Fremdschlüsseln wäre es viel einfacher, mit all den verrückten linq-to-sql-Attributen zu arbeiten).

In Wirklichkeit ist jedoch die Erweiterung einer Programmiersprache für die meisten Entwickler zu teuer. Die Vorteile überwiegen einfach nicht die Kosten.

Vielleicht wird C# eines Tages über Meta-Programming-Funktionen verfügen, mit denen man so etwas leicht machen kann.

Im Moment existiert diese Fähigkeit jedoch nicht.

Dies lässt Sie mit 3 Optionen:

  1. Attribute
  2. Verwenden Sie eine dynamische Sprache, und generieren Code zur Laufzeit
  3. Nur generative nicht programing verwenden

Regel # 1 ist am Ende die einfachste Wahl, auch wenn es nicht ideal ist.

7

Dies ist eine schwierige Frage, um eine allgemeine Antwort zu geben. Attribute sind ein weiteres Sprachfeature, das bei korrekter Anwendung unglaublich leistungsfähig ist, aber potenziell missbraucht werden kann. Ich habe noch nie einen zwingenden Grund gesehen, die Verwendung von Attributen komplett zu verschwenden und wirklich keinen Grund zu denken, dass sie eine schlechte Idee sind.

In der Tat ist das genaue Gegenteil der Fall. Attribute ermöglichen das Hinzufügen von Framework-spezifischen Informationen zu den Metadaten. Informationen, die einfach nicht über eine Typhierarchie ausgedrückt werden können. Dies erhöht die Leistungsfähigkeit von Frameworks, die Attribute verwenden, erheblich.

Ich habe sicherlich eine Implementierung oder zwei gesehen, wo Leute sie etwas missbraucht haben, aber nichts Spektakuläres. Kannst du genauer sein? Gibt es bestimmte Attribute/Frameworks, von denen du sprichst?

+0

Ich benutze Attribute sehr. Als Framework-Entwickler hilft es wirklich, bestimmte Implementierungsdetails zu verbergen, die ein Entwickler, der das Framework verwendet, nicht sehen muss. Ich denke, es ist ein allgemeines Meme ich hatte gesehen/gehört, dass Menschen von ihnen in DI, Persistenz Bewusstsein usw., wo sie behaupten, Attribute schmutzig ihre POCO-Klassen. –

2

Ich finde sie sehr nützlich, wenn es darum geht, Metadaten über meinen Code zu definieren. Ich verwende sie, um benutzerdefinierte Berichte, Plug-in-Architekturen und die Kommunikation mit Drittanbietercode zu erstellen.

Ich nehme an, Sie können alles per Konvention tun, aber ich mag sie.

0

Nun, wenn ASP.NET MVC ist etwas zu gehen, würde ich sagen, mach dir keine Sorgen darüber. In diesem Framework wird so viel mit Reflektion und Attributen getan, dass ich keine Probleme damit sehe. MVC ist ein ziemlich neuer Rahmen und wird überall verwendet. Von der Validierung der Eingabe, der Handhabung von Fehlern bis hin zum sehr tollen ActionFilter-Attribut gibt es viele davon. Also nein, ich persönlich sehe nichts falsch mit ihnen.

4

Das ist eine ziemlich breite Frage, wie "sollte ich Käse in meinen Topf geben"; Die Antwort auf beide ist "es hängt davon ab, was du machst".

Wenn Sie adributes verwenden und sie fast wie ein deklaratives Programmierparadigma verwenden, dann werden Sie wahrscheinlich auf dem Weg in Schwierigkeiten geraten. Ob es sich um eine Verlangsamung irgendwo in der Reflexion oder nur um allgemeine Wartbarkeit handelt, ist eine Vermutung.

Es ist wie alles andere ... verwenden Sie sie, wenn sie angemessen sind und machen Sie Ihren Code effizienter oder lesbarer. Benutze sie nicht, um sie zu benutzen, und verlasse sie nicht, um sie zu verlassen.

+2

+1, kann ich nicht aufhören zu lachen über den "Käse in der Auflaufformel" Kommentar. Hast du das von irgendwoher bekommen? – JaredPar

+0

Haha, nein, es kam gerade zu mir :) –

+0

Ich mache es ein Ziel, das in einer E-Mail-Konversation nächste Woche zu verwenden – JaredPar

1

Ich sehe starke Verwendung von Attributen in ASP.NET MVC. In der Tat hat mich der Wechsel zu MVC dazu veranlasst, meine Verwendung von Attributen signifikant zu erhöhen. Ich bin nicht sicher, woher Ihre Wahrnehmung von Anti-Attribut-Backlash kommt, aber ich sehe es sicherlich nicht von MS, zumindest in Bezug auf MVC.

Ich mag besonders die Art und Weise, wie Attribute verwendet werden können, um übergreifendes Verhalten (Aspekte) über die Controller/Aktionen hinweg bereitzustellen, die so eingerichtet sind. Da MVC für den Aufruf von Attributen vor und nach dem Aufruf von Aktionen entwickelt wurde, muss ich davon ausgehen, dass dies der bevorzugte Weg ist, um Aspekte in MVC zum Laufen zu bringen.

0

Ich persönlich denke, dass Attribute, wie die meisten Sprachfunktionen, ihren Platz haben, aber missbraucht oder missbraucht werden können.

Im richtigen Rahmen sind sie von unschätzbarem Wert. Sie vereinfachen Dinge wie DI-Frameworks (MEF ist ein großartiges Beispiel) und sind sehr, sehr nützlich für Dinge wie Frameworks zu testen.

Ich denke, verrückt zu werden benutzerdefinierte Attribute hinzuzufügen kann jedoch Overkill sein. Ich persönlich liebe es, Attribute zu verwenden, aber versuche, ihre Verwendung auf ein Minimum zu beschränken, und verwende sie nur dort, wo sie am sinnvollsten sind.