| 

.NET C# Java Javascript Exception

5
Bei der Überarbeitung einer Anwendung bin ich über mehrere Markerinterfaces gestolpert die ich vor Jahren selber plaziert habe.
Vermutlich war einer meiner Gedanken seinerzeit: "evlt. kommt zu IExtServiceContract ja noch Funktionalität hinzu", welhalb ich mich dann für ein Interface und nicht für ein Attribut entschieden habe.
IExtServiceContract ist aber bis Dato leer geblieben, in einigen Zusammenhängen werden Implementierungen gegen dieses Interface geprüft. Rein technisch handelt es sich somit um ein Markerinterface.
Wäre aus Eurer Sicht die Verwendung eines Attributes technisch sauberer?
News:
25.10.2011
Jorgen Schumann 1,6k 1 9
3 Antworten
2
Hallo,

ich sehe es fast gleichwertig und eher als geschmackssache, wo es dann auf den Kontext der Verwendung darauf ankommt. Da du schreibst
in einigen Zusammenhängen werden Implementierungen gegen dieses Interface geprüft.

hat hier das Interface wohl den Vorteil, da es einfacher mit
if (myObject is IMyMarkerInterface)

geprüft werden kann. Mit Attributen wäre diese Prüfung schon aufwändiger.

Andererseits gibts Beispiele, wo Attribute vorteilhafter sind, wie eben die ganzen Test-Frameworks und sonstigen "Annotationen" von Klassen, Membern, etc.

Auf Assembly-Ebene gehen nur Attribute vernüftig.


mfG Gü
25.10.2011
gfoidl 9,4k 3 5
2
Hallo Jorgen,

ich schließe mich gfoidls Aussagen an. Prinzipiell ist es Geschmackssache, Attribute prüfen ist aufwändiger.
Ich sehe nichtsdestotrotz einen Vorteil beim Markerinterface. Die Prüfung

(myObject is IMyMarkerInterface)

kann der Compiler direkt in eine einzige MSIL isinst Operation übersetzen.

UPDATE:
Wenn es nur um eine kurze knackige Schreibweise geht, dann kann für Attribute z.B. mit Extension Methods arbeiten. Mal so als spontane Anregung:

public class TestClass
{
[Browsable(true)]
private void TestMethod()
{
// Prüfung des Attributs mit der Extension
bool isBrowsable = this.IsDefined<BrowsableAttribute>(() => TestMethod());
}
}
public static class Extensions
{
public static bool IsDefined<TAttribute>(this object self, Expression<Action> memberExpression)
{
bool result = false;
if (memberExpression.Body is MethodCallExpression)
{
MethodCallExpression methodExpression = memberExpression.Body as MethodCallExpression;
MethodInfo m = methodExpression.Method;
result = m.IsDefined(typeof(TAttribute), true);
}
// ...

return result;
}
}


Gruß
Florian
25.10.2011
ffordermaier 8,4k 3 9
Eine vergleichbare Extension habe ich natürlich auch in meiner Utils.Assembly.
Technisch gesehen sind Attribute für Kennzeichnungen zuständig, da sind wir uns wohl alle einig.
Schlaflose Nächte ein Interface(das ja Technisch nicht für die Kennzeichnung von Klassen da ist) zu verwenden hatte ich noch keine, werde ich auch sicher nicht bekommen.
Evlt. hat noch jemand die "Richtinien für's Frameworkdesign" zur Hand!? Ich meine da steht ein Hinweis drinnen warum keine Markerinterfaces verwendet werden sollen.
Jorgen Schumann 25.10.2011
1
Hallo Florian & Gü, danke für Eure Antworten.

Ein Aspekt aus den „Richtlinien für das Typdesign“ von meiner Seite noch nachgeschoben:
Zitat:“….das die Prüfung des Benutzerdefinierten Attributes nur zur Laufzeit stattfinden kann.Gelegentlich kommt es aber unbedingt darauf an, dass die Prüfung des Markers während der Kompilierung erflogt. Einen Methode, die Objekte beliebigen Types serialisieren kann , ist möglicherweise bei der Kompilierung mehr damit beschäftigt, sich vom Vorhandensein des Markers zu überzeugen, als die Typprüfung durchzuführen.“
-
27.10.2011
Jorgen Schumann 1,6k 1 9
Danke für den Hinweis. An den Auswertezeitpunkt hatte ich in dem Kontext gar nicht gedacht.
ffordermaier 28.10.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH