Может ли кто-нибудь опубликовать пример Aspect-ориентированного программирования (AOP), который не регистрируется?
Я просмотрел несколько ресурсов, но все примеры - тривиальное журналирование. Для чего это полезно?
Может ли кто-нибудь опубликовать пример Aspect-ориентированного программирования (AOP), который не регистрируется?
Я просмотрел несколько ресурсов, но все примеры - тривиальное журналирование. Для чего это полезно?
Один из примеров, который был заимствован прямо из этого Aspect Oriented Programming: Radical Research in Modularity, видео Youtube, рисовал на дисплее. В примере у вас есть программа рисования, которая состоит из точек, фигур и т.д., И когда происходят изменения этих объектов, вам нужно сказать, что дисплей обновляется. Не обращаясь с этим в одном аспекте, вы в конечном итоге повторяете себя немного.
AOP, как я понял, был создан для того, чтобы не повторять себя для проблем с перекрестными ограничениями, которые могут не иметь ничего общего с бизнес-логикой. С помощью аспектов вы можете разделить эти аспекты на аспекты. Одним из примеров было протоколирование, но есть множество разных вещей, которые вы могли бы повторить. Он развивается с тех пор, и это не больше касается аспектно-ориентированного программирования, но также аспектно-ориентированного моделирования.
Более подробную информацию об аспектно-ориентированном программировании можно найти из этих источников:
Безопасность
Дружественные сообщения об ошибках для asp.net webcontrols/webparts
Производительность
Validation:
[NotNull]
public string Property1 { get; set; }
[Length(Min = 10, Max = 20)]
public string Property2 { get; set; }
[Regex(Expression = @"[abc]{2}")]
public string Property3 { get; set; }
Отменить - я вызываю стороннюю сборку, которая поддерживает операции отмены. Это требует от вызывающих абонентов создания контекста отмены, вызова некоторых методов в сборке, а затем уничтожить контекст отмены. Контексты могут быть вложенными. Кроме того, если контекст создан, но остается в нежелательном состоянии, требующем перезапуска приложения.
Обычно использовать отмену я бы написал что-то вроде этого
void foo()
{
int id = lib.create_undo_context();
try
{
lib.performsomeaction();
lib.performsomeaction();
lib.performsomeaction();
}
finally
{
lib.destroy_undo_context(id);
}
}
с PostSharp Я определяю атрибут, называемый [Undo], который создает контекст отмены, когда метод запускается и уничтожает его при выходе метода (даже если выбрано исключение) - поэтому код выглядит так:
[Undo]
void foo()
{
lib.performsomeaction();
lib.performsomeaction();
lib.performsomeaction();
}
Немного сложнее реализовать это, чем я показываю, потому что я уверен, что все контексты отмены отменены даже в тех случаях, когда вложенные контексты Undo - но вы получаете идею.
Реализация шаблона проектирования в Java и AspectJ (Hannemann and Kiczales): http://www.cs.ubc.ca/labs/spl/papers/2002/oopsla02-patterns.pdf
В документе показано, как некоторые шаблоны проектирования GoF могут лучше реализоваться на Java с помощью AspectJ
Другим классическим примером (например, ведение журнала) является кеширование. Но другие примеры интереснее.
Инъекция зависимостей
Строго говоря, инъекция зависимостей - не что иное, как перекрестная озабоченность. В большинстве инфраструктур инъекций зависимостей используется стиль программирования на основе атрибутов:
public class Car:IDisposable
{
[Inject]
public IGearBox Gearbox { get; set; }
...
}
Атрибут [Inject] также может быть разработан как аспект без какой-либо зависимости от внешней среды.
Безопасность - проверка того, что пользователи имеют соответствующие разрешения до выполнения определенных методов.
Вы не можете иметь множественное наследование в Java. Однако, используя АОП, вы можете иметь "ограниченное" множественное наследование. Попробуйте Google, чтобы увидеть некоторые примеры.
Я также согласен с Эйвидом. Hannemann и Kiczales отлично подходят для изучения основ проектирования и получения отличных примеров АОП.
Проверка государственного инварианта. Поскольку PostSharp 1.5 будет поставляться с наследованием аспектов, даже через интерфейсы, он даст много новых возможностей.
Мой фотоальбом использует aspectj для трех вещей:
Первое, в частности, было довольно прямо из google tech talk на AOP. Это о модульности по-другому, чем большинство людей считают. Определенно рекомендую смотреть, если вы заинтересованы в том, как использовать его навсегда.
Я использовал аспектно-ориентированное программирование для реализации поисковой системы ключевого слова. Это больше похоже на эксперимент, но он показывает, как АОП можно использовать для целей, отличных от ведения журнала и трассировки.
В основном:
(i) Пользователь двигателя отмечает свои классы как KeywordSearchable,
(ii) Двигатель начинает отслеживать создание и уничтожение этих экземпляров KeywordSearchable,
(iii) Механизм извлекает ключевые слова из этих объектов KeywordSearchable,
(iv) Учитывая объекты и ключевые слова, алгоритм выполняет поиск.
Подробнее об этом можно узнать на http://montrealistic.blogspot.com/2011/08/aspect-oriented-implementation-of.html.
Примеры АОП:
Предположим, вы хотите записать сообщение внутри методов вашей модели домена:
Пример: запись в журнал без AOP:
namespace Examples\Forum\Domain\Model;
class Forum {
/**
* @Flow\Inject
* @var \Examples\Forum\Logger\ApplicationLoggerInterface
*/
protected $applicationLogger;
/**
* Delete a forum post and log operation
*
* @param \Examples\Forum\Domain\Model\Post $post
* @return void
*/
public function deletePost(Post $post) {
$this->applicationLogger->log('Removing post ' . $post->getTitle(), LOG_INFO);
$this->posts->remove($post);
}
}
Если вам нужно сделать это во многих местах, регистрация станет частью вашей логики модели домена. Вам придется вводить все зависящие от журнала зависимости в ваших моделях. Поскольку регистрация не является чем-то, о чем должна заботиться модель домена, это пример нефункционального требования и так называемой сквозной проблемы.
С AOP код внутри вашей модели ничего не знает о регистрации. Он просто сосредоточится на бизнес-логике.
Управление транзакциями.
На мой взгляд, вы не хотите, чтобы объекты, которые могут быть частью транзакции, знали, что они находятся в транзакции. Используя АОП, вы можете создавать объекты в транзакциях по мере необходимости без объектов в транзакции, которые должны быть осведомлены о том, что они находятся в транзакции или даже о существовании структуры AOP.