Подтвердить что ты не робот

Примеры аспект-ориентированного программирования

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Безопасность

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

Дружественные сообщения об ошибках для asp.net webcontrols/webparts

Производительность

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

Ответ 3

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

Ответ 4

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

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

    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 - но вы получаете идею.

Ответ 5

Реализация шаблона проектирования в Java и AspectJ (Hannemann and Kiczales): http://www.cs.ubc.ca/labs/spl/papers/2002/oopsla02-patterns.pdf

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

Ответ 6

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

Ответ 7

Инъекция зависимостей

Строго говоря, инъекция зависимостей - не что иное, как перекрестная озабоченность. В большинстве инфраструктур инъекций зависимостей используется стиль программирования на основе атрибутов:

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

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

Ответ 11

Мой фотоальбом использует aspectj для трех вещей:

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

Ответ 12

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

В основном:
(i) Пользователь двигателя отмечает свои классы как KeywordSearchable,
(ii) Двигатель начинает отслеживать создание и уничтожение этих экземпляров KeywordSearchable,
(iii) Механизм извлекает ключевые слова из этих объектов KeywordSearchable,
(iv) Учитывая объекты и ключевые слова, алгоритм выполняет поиск.

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

Ответ 13

Примеры АОП:

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

Предположим, вы хотите записать сообщение внутри методов вашей модели домена:

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

Ответ 14

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

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