2010-11-22 7 views
1

Ich las kürzlich eine interesting blog post auf Anders Hejlsbergs Argumente gegen AOP.Wie hilft AOP bei der Datenbindung?

Der erste anti-anti Argument erwähnt Datenbindung: „Aspektorientierte Programmierung für das Debuggen und Instrumentierung des Codes ist interessant und ist kein vollwertiger Programmierdisziplin“

Mythos 1.

Wahrheit 1. Anders hielt wahrscheinlich bei dem "Hello, world" Beispiel an.

Obwohl die Code-Instrumentierung sicherlich ein wichtiger Anwendungsfall von AOP ist - und der, den Sie in jeder "Einstiegs" -Dokumentation sehen würden - vereinfacht die Technologie die Arbeit von Entwicklern erheblich, wenn es darum geht, nicht-triviale, reale Lebensanwendung. Nur um ein paar realen Szenarien zu anführen, in denen AOP wirklich hilft:

* Data Binding (INotifyPropertyChanged) 

Ich versuche AOP zu denken, wie in einem Datenbindungsszenario verwendet wird. Ich habe immer angenommen, dass die Bindung auf Reflexion beruht, um es "magisch" zu machen. Ich bin mir ziemlich sicher, dass alles, was Sie in einem verbindlichen Szenario benötigen, über Reflektion verfügbar ist. Wird AOP für einen (leichten) Leistungsschub verwendet?

Antwort

3

Es ist nicht die Datenbindung, auf die er sich bezieht, aber der INotifyPropertyChanged (und ähnliche) Teil, dass AOP wirklich scheinen würde.

Derzeit, wenn eine Klasse implementiert INotifyPropertyChanged, schauen Eigenschaften wie folgt aus:

private bool _isSomeProperty; 
public bool IsSomeProperty 
{ 
    get{ return _isSomeProperty;} 
    set 
    { 
    if(value != _isSomeProperty) 
    { 
     _isSomeProperty = value; 
     OnNotifyPropertyChanged("IsSomeProperty"); 
    } 
    } 
} 

Wo mit anständigen AOP, sie mögen dieses

[NotifyOnChange]  
public bool IsSomeProperty {get; set;} 

macht einen großen Lesbarkeit Unterschied aussehen könnte, vor allem, wenn die Setter für ein Paar Eigenschaften hat ein paar tatsächliche Regeln drin.

Auch mit generischen Basisklassen, Ausdrücke, Spiegelung, und einigen kniffligen Implementierungen, das Beste was Sie hoffen ist:

private bool _isSomeProperty; 
public bool IsSomeProperty 
{ 
    get{ return _isSomeProperty;} 
    set 
    { 
    SetAndNotify(x=>x.IsSomeProperty) 
    } 
} 

Und das ist auch nicht so lesbar (und weniger performant als auch)

+0

Gute Antwort. Ich Code in WPF nicht viel, wenn ich Data Binding denke, denke ich ASP.NET, und ich denke, eine Art und Weise nur lesen (in denen Reflexion wäre völlig in Ordnung). Vielen Dank. –