AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wozu sind Attribute gut ?

Ein Thema von OlafSt · begonnen am 10. Jul 2013 · letzter Beitrag vom 8. Aug 2013
Antwort Antwort
Seite 5 von 5   « Erste     345   
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#41

AW: Wozu sind Attribute gut ?

  Alt 6. Aug 2013, 12:52
Nachdem ich mir Attribute nun auch etwas näher angesehen habe, stört mich eins doch irgendwie gewaltig: Vielleicht habe ich nicht lange genug im Wasser der AOP gebadet, aber spontan weiß ich nur einen Weg, an die Attribute zu kommen:

Mittels RTTI über GetAttributes(): TArray<TCustomAttribute> auf einem TRttiObject . Nehmen wir an, ich habe eine ganz normale Property Derp eines Objekts und möchte nun schauen, ob ein Attribut "Lebensmittel" für diese Property existiert bzw. ob dieses Attribut sagt "Wurst" oder "Käse". Jetzt muss ich über alle Properties meines Objekts iterieren, bis ich eine finde, welche den Namen 'Derp' hat. Nachdem ich die Property nun habe, kann ich wiederum alle Attribute durchsuchen, nach Namen suchen und weitermachen.

Das Durch-Iterieren stört mich nicht. Aber dass ich nicht Dinge tun kann wie
meinObjekt.Derp.GetAttributes() sondern doch hier eigentlich aufgrund der RTTI gezwungen bin, mit Zeichenfolgen zu arbeiten, oder? Soll bedeuten, ich muss in meinem Quelltext mindestens einen String mit dem Inhalt 'Derp' und 'Lebensmittel' ablegen. Ändere ich nun den Namen der Property und/oder des Attributs, habe ich ein Problem: Die Strings passen nicht mehr. Denn ich kenne keinen Weg, einer Methode eine "Property an sich" übergeben zu können. Attribute schon, das sind ja normale Klassen. Aber bei Properties scheitert es hier irgendwie...
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.351 Beiträge
 
Delphi 11 Alexandria
 
#42

AW: Wozu sind Attribute gut ?

  Alt 6. Aug 2013, 13:55
Soll bedeuten, ich muss in meinem Quelltext mindestens einen String mit dem Inhalt 'Derp' und 'Lebensmittel' ablegen.
Das verstehe ich gerade nicht... wofür willst du das denn benutzen?
Mal ein Beispiel:
Delphi-Quellcode:
type
  ColorElementAttribute = class(TCustomAttribute)
  private
    var
      FColor: TColor;
    procedure SetColor(const Value: TColor);
  public
    constructor Create(const AColor: TColor);
    property Color: TColor read FColor write SetColor;
  end;

constructor ColorElementAttribute.Create(const AColor: TColor);
begin
  FColor := AColor;
end;

procedure ColorElementAttribute.SetColor(const Value: TColor);
begin
  FColor := Value;
end;
Und im Formular mit zwei Buttons und zwei Memos:
Delphi-Quellcode:
  TFormX = class(TForm)
    Button1: TButton;
    Button2: TButton;
    [ColorElement(clRed)]
    Memo1: TMemo;
    [ColorElement(clBlue)]
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
  end;

procedure TFormX.Button1Click(Sender: TObject);
var
  LCtx: TRttiContext;
  LField: TRttiField;
  LAttr: TCustomAttribute;
begin
  for LField in LCtx.GetType(Self.ClassInfo).GetDeclaredFields do
    for LAttr in LField.GetAttributes do
      if LAttr is ColorElementAttribute then
        SetPropValue(LField.GetValue(Self).AsObject, 'Color', ColorElementAttribute(LAttr).Color);
end;
Wenn ich den Namen des Attributes ändere, kompiliert das nicht mehr. Und in deinem Fall könnte das z.B. eine Enumeration sein, dann brauche ich auch da keinen String, das könnte dann auch beim Kompilieren geprüft werden.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#43

AW: Wozu sind Attribute gut ?

  Alt 6. Aug 2013, 14:29
Das blöde ist nur, dass in

SetPropValue(LField.GetValue(Self).AsObject, 'Color', ColorElementAttribute(LAttr).Color); der Name der Property noch einmal redundant als String hinterlegt ist. Möchte ich den Namen der Property ändern, wäre ich so faul, das direkt mittels Refactoring-Funktionen zu erledigen. Das ändert direkt überall den Namen, wo die Property verwendet wird. Der String bleibt dabei natürlich unangetastet. Und fortan finde ich unter diesem Namen keine Property mehr.

Auch die "alte RTTI" bietet nur das Finden über den Namen als String an. In anderen Sprachen habe ich auch nie wirklich etwas mit Reflection gemacht, ist das dort auch so?

Mich bringt das um ehrlich zu sein ziemlich aus dem Konzept.


Das mit der Enumeration ist ein interessanter Weg, das lasse ich mir mal durch den Kopf gehen

Geändert von Der schöne Günther ( 6. Aug 2013 um 14:31 Uhr)
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#44

AW: Wozu sind Attribute gut ?

  Alt 6. Aug 2013, 15:03
In C# macht man so etwas mit Expression trees, da sie refactoring-safe sind.

Eine naive Implementierung frei Schnauze:

Code:
public static string GetName<TResult>(Expression<Func<TResult>> expression)
{
   var me = expression.Body as MemeberExpressin;
   if(me != null)
     return me.Member.Name;

   var mce = expression.Body as MetodCallExpressin;
   if(mce != null)
     return mce.Method.Name;
   

   throw ....
}

var methodName = Xyz.GetName(() => "".Substring(0, 1)); // ergibt "Substring"
Auf die Art kann man sich auch direkt PropertyInfos oder MethodInfos (vor allem den korrekten Overload) geben lassen. Sollte man aber möglichst so machen, dass es nicht unnötig oft passiert. Type-safe ist nett, aber schnell ist auch wichtig.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.351 Beiträge
 
Delphi 11 Alexandria
 
#45

AW: Wozu sind Attribute gut ?

  Alt 6. Aug 2013, 19:30
Auch die "alte RTTI" bietet nur das Finden über den Namen als String an. In anderen Sprachen habe ich auch nie wirklich etwas mit Reflection gemacht, ist das dort auch so?
Worüber willst du sie denn sonst ansprechen? Property-Referenzen kennt der Compiler nicht. Theoretisch kann man sich dafür etwas basteln... z.B. auch über Attribute. Indem man in einem Attribut hinterlegt, dass es sich dabei um die Farbe handelt. Dann kann man die Property suchen, die die Farbe repräsentiert. Für sinnvoll halte ich das allerdings weniger.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#46

AW: Wozu sind Attribute gut ?

  Alt 6. Aug 2013, 19:32
Man könnte sich ja einen Class Helper basteln der die Typeinfo für das die Farbe darstellende Element zurückgibt
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all

Geändert von Union ( 6. Aug 2013 um 19:37 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#47

AW: Wozu sind Attribute gut ?

  Alt 7. Aug 2013, 07:14
Property-Referenzen kennt der Compiler nicht.
Eben, mir fällt auch absolut nichts ein, wie man dem Compiler etwas von "der Property an sich" erzählen könnte, indem man nur sie selbst anfasst, und nicht noch ihren Namen in einem String aufschreiben muss.

Aber daran haben ja jetzt weniger die Attribute, sondern der Compiler an sich "Schuld". Vielleicht ändert sich das eines Tages ja mal. Die Class Helper und Dinge wie "42.toString()" sagen mir irgendwie, dass Hoffnung besteht
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie
Online

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#48

AW: Wozu sind Attribute gut ?

  Alt 7. Aug 2013, 07:43
Auf die Art kann man sich auch direkt PropertyInfos oder MethodInfos (vor allem den korrekten Overload) geben lassen. Sollte man aber möglichst so machen, dass es nicht unnötig oft passiert. Type-safe ist nett, aber schnell ist auch wichtig.
Ein
Code:
var name = typeof(Foo).GetProperty("Bar").Name;
ist nicht schneller als über die Expression.


Aber daran haben ja jetzt weniger die Attribute, sondern der Compiler an sich "Schuld". Vielleicht ändert sich das eines Tages ja mal. Die Class Helper und Dinge wie "42.toString()" sagen mir irgendwie, dass Hoffnung besteht
Nicht wirklich, denn die Implementierung dahinter ist eher schmuddelig. Ich wünsche mir ja schon lange property references oder besser noch member references.
Aber dazu müsste einiges am Compiler aufgebohrt werden - was aber nicht zuletzt einiges der arg hässlichen Implementierung der LiveBindings (jupp, die gehen komplett über magic string basierte RTTI) unnötig machen würde.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 7. Aug 2013 um 07:57 Uhr)
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#49

AW: Wozu sind Attribute gut ?

  Alt 8. Aug 2013, 21:35
Ein
Code:
var name = typeof(Foo).GetProperty("Bar").Name;
ist nicht schneller als über die Expression.
Jump, ist genau so lahm.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 5   « Erste     345   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz