Как АОП помогает в привязке данных? - PullRequest
1 голос
/ 22 ноября 2010

Я недавно прочитал интересное сообщение в блоге об аргументах Андерса Хейлсберга против АОП.

В первом анти-анти-аргументе упоминается привязка данных:

Миф 1«Аспектно-ориентированное программирование интересно для отладки и инструментирования кода и не является полноценной дисциплиной программирования».

Правда 1. Андерс, вероятно, остановился на примере «Привет, мир».

Несмотря на то, что инструментарий кода, безусловно, является важным примером использования AOP - и вы увидите его в каждой документации по началу работы, - эта технология значительно упрощает работу разработчиков, когда речь идет о реализации любого нетривиального, реального приложения.,Просто приведу несколько реальных сценариев, где AOP действительно помогает:

* Data Binding (INotifyPropertyChanged) 

Я пытаюсь подумать о том, как AOP используется в сценарии привязки данных.Я всегда предполагал, что привязка полагается на рефлексию, чтобы сделать это «магией».Я уверен, что все, что вам нужно в обязательном сценарии, доступно через рефлексию.Используется ли АОП для (небольшого) повышения производительности?

1 Ответ

3 голосов
/ 22 ноября 2010

Это не привязка данных, на которую он ссылается, а INotifyPropertyChanged (и аналогичная) часть, которую AOP будет действительно сиять.

В настоящее время, когда класс реализует INotifyPropertyChanged, свойства выглядят так:

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

Где при приличном АОП они могут выглядеть следующим образом

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

Вносит большую разницу в читаемость, особенно когда в установщике для пары свойств есть несколько реальных правил.

Даже при использовании базовых базовых классов, выражений, отражений и некоторых хитрых реализаций лучшее, на что вы надеетесь, это:

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

И даже это не так читабельно (и также менее производительно)

...