2008-11-28 3 views
43

Может ли кто-нибудь опубликовать пример Aspect-ориентированного программирования (AOP), который является не протоколированием?Примеры программирования, ориентированные на аспекты

Я просмотрел несколько ресурсов, но все примеры - тривиальное протоколирование. Для чего это полезно?

ответ

33

Одним из примеров, который был отдан в аренду прямо из этого Aspect Oriented Programming: Radical Research in Modularity, Youtube video рисовал на дисплее. В примере у вас есть программа рисования, которая состоит из точек, фигур и т. Д., И когда происходят изменения этих объектов, вам нужно сказать, что дисплей обновляется. Не обращаясь с этим в одном аспекте, вы в конечном итоге повторяете себя совсем немного.

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

Более подробной информации о аспектно-ориентированном программировании можно найти из этих источников:

3

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

2

Публичный контроль инварианта. Поскольку PostSharp 1.5 будет поставляться с наследованием аспектов, даже через интерфейсы, он даст много новых возможностей.

11

безопасности

  • Вводят код, который проверяет права доступа и блокирует доступ

дружелюбнее сбщ ошибок для asp.net WebControls/WebParts

Performance

  • Вводят код, который устанавливает PErF счетчики, чтобы получить обзор, где ваше приложение работает медленно
6

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; } 
+1

Где находится Aspect? Но вы можете использовать некоторые советы для чтения этих «аннотаций», которые исходят от точки соединения, предоставленной pointcute наподобие: * * save (..) Таким образом, вы можете использовать перед советом для проверки и продолжения, если это так, или бросания некоторых не удалось установить состояние недопустимого состояния. – paulosuzart 2008-11-28 12:37:23

+0

Это зависит от того, где используется валидация и какая структура пользовательского интерфейса. Я не использую аспекты для объектов, которые должны быть проверены, но больше для «защитного кодирования». Я не использую проверку сущностей в методе сохранения в репозитории, но я проверяю где-то в пользовательском интерфейсе. – Paco 2008-11-28 19:50:29

4

Design Pattern Реализация в Java и AspectJ (Hannemann и Kiczales): http://www.cs.ubc.ca/labs/spl/papers/2002/oopsla02-patterns.pdf

В статье показано, как некоторые из шаблонов проектирования GoF может осуществляться в лучшую сторону в Java с использованием AspectJ

3

Вы не можете иметь множественное наследование в Java. Однако, используя АОП, вы можете иметь «ограниченное» множественное наследование. Попробуйте Google, чтобы увидеть некоторые примеры.

Я также согласен с Eyvid. Газета Hannemann и Kiczales отлично подходит для изучения основ проектирования и получения отличных примеров АОП.

2

My photo album использует AspectJ три вещи:

  1. Implementing the observer "pattern" as a reusable piece of code.
  2. Destroying a session for a specific type of call.
  3. Setting dirty flags on DTOs when mutation occurs.

Первый, в частности, было в значительной степени прямо из google tech talk on AOP. Речь идет о модульности по-другому, чем большинство людей считают. Определенно рекомендуем смотреть, если вы заинтересованы в том, как использовать его навсегда.

4

Другой классический пример (например, ведение журнала) - это кеширование. Но другие примеры интереснее.

6

Undo - я вызываю стороннюю сборку, которая поддерживает операции отмены. Это требует от вызывающих абонентов создания контекста отмены, вызова некоторых методов в сборке, а затем уничтожить контекст отмены. Контексты могут быть вложенными. Кроме того, если контекст создан, но остается в нежелательном состоянии, требующем перезапуска приложения.

Обычно использовать отмены я хотел бы написать что-то вроде этого

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 контекстов - но вы Получите эту идею.

1

Управление транзакциями.

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

2

Я использовал аспектно-ориентированное программирование для внедрения поисковой системы поиска по ключевым словам. Это больше похоже на эксперимент, но он показывает, как АОП можно использовать для целей, отличных от ведения журналов и трассировки.

В основном:
(я) Пользователь двигателя отмечает его/ее классы как KeywordSearchable,
(II) Двигатель начинает отслеживать Сотворение & разрушение этих KeywordSearchable случаев,
(III) Экстракты двигателя ключевые слова из этих объектов KeywordSearchable,
(iv) Учитывая объекты и ключевые слова, алгоритм выполняет поиск.

Подробнее об этом можно узнать по адресу: http://montrealistic.blogspot.com/2011/08/aspect-oriented-implementation-of.html.

4

Dependency Injection

Строго говоря, инъекции зависимость является не более чем сквозная беспокойство. Много рамок нагнетательных зависимостей использовать атрибут на основе стиля программирования, как это:

public class Car:IDisposable 
{ 
    [Inject] 
    public IGearBox Gearbox { get; set; } 
    ... 
} 

код [Inject] атрибут может также разработан как аспект без какой-либо зависимости от внешней рамки.

2

Примеры АОП:

  • синтаксический анализатор и оценщика для арифметических выражений. Это можно было бы запрограммировать с использованием шаблона посетителя, но я считаю, что аспекты - лучшая альтернатива.
  • Простой текстовый редактор, в котором некоторые задачи управления (например, сохранение флага «Файл изменен» и заголовок окна) рассматриваются как отдельные аспекты.
  • Структура данных для символьных строк, в которой строки представлены в виде деревьев, так что объединение и подстрока могут быть реализованы без копирования. Для поддержания эффективности деревья иногда необходимо перебалансировать; балансирующий код рассматривается как аспект.

Допустим, вы хотите, чтобы войти в сообщение внутри методов вашей доменной модели:

Пример: Logging без АОП:

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 код внутри вашей модели ничего не знает о регистрации. Он просто сосредоточится на бизнес-логике.

Смежные вопросы