2008-08-21 3 views
36

AOP - интересная парадигма программирования, на мой взгляд. Однако об этом еще не было обсуждений в stackoverflow (по крайней мере, я не смог их найти). Что вы думаете об этом вообще? Вы используете АОП в своих проектах? Или вы считаете, что это скорее нишевая технология, которая не будет существовать долгое время или не будет попадать в мейнстрим (например, ООП, по крайней мере теоретически;))?Вы используете AOP (Aspect Oriented Programming) в программном обеспечении для производства?

Если вы используете AOP, пожалуйста, сообщите нам, какие инструменты вы используете. Благодаря!

ответ

12

Да.

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

Один пример: атрибуты «до/после» в xUnit.net (проект с открытым исходным кодом, который я запускаю) являются формой перехвата метода в стиле AOP. Вы украшаете свои методы тестирования этими атрибутами, и как раз до и после этого метода тестирования вызывается ваш код. Он может использоваться для таких вещей, как создание базы данных и откат результатов, изменение контекста безопасности, в котором проходит тест, и т. Д.

Другой пример: атрибуты фильтра в ASP.NET MVC также действуют как специализированные перехватчики методов в стиле AOP , Один, например, позволяет вам сказать, как обрабатывать необработанные ошибки, если они происходят в вашем методе действий.

Многие контейнеры для инъекций, в том числе Castle Windsor и Unity, поддерживают это поведение либо «в коробке», либо посредством использования расширений.

+1

Будьте осторожны, когда требуется что-то лучшее. Многие эксперты считают, что модель возможностей - лучший способ сделать безопасность, и что АОП - это ужасно. – 2011-10-15 15:41:21

+0

@Brad, Вы говорите, что некоторые вещи лучше всего делать с АОП. Можете ли вы объяснить, что * точно * является преимуществом, делая это методом AOP по сравнению с традиционным способом? – Pacerier 2014-06-13 22:44:40

3

Мы использовали aspectJ в одном из моих больших проектов в течение довольно долгого времени. Проект состоял из нескольких веб-сервисов, каждый из которых имел несколько функций, которые были интерфейсом для сложной системы обработки/обработки документов. Где-то около 75 тыс. Строк кода. Мы использовали аспекты для двух относительно небольших функций.

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

Вторая вещь, которую мы сделали, - это специфические для приложения метрики. Мы ставим аспекты вокруг наших методов веб-сервисов для сбора времени, информации об объектах и ​​т. Д. И дампа результатов в базе данных. Это было приятно, потому что мы могли захватить эту информацию, но все равно сохраняем весь этот код захвата отдельно от «реального» кода, который выполнял эту работу.

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

15

Python поддерживает AOP, позволяя динамически изменять его классы во время выполнения (что в Python обычно называется monkeypatching, а не AOP). Вот некоторые из моих вариантов использования АОП:

  1. У меня есть сайт, на котором каждая страница создается функцией Python.Я хотел бы взять класс и сделать все веб-страницы, созданные этим классом с защитой паролем. АОП приходит на помощь; перед вызовом каждой функции я выполняю соответствующую проверку сеанса и при необходимости перенаправляю.

  2. Я хотел бы сделать некоторые записи и профилирование на кучу функций в моей программе во время ее фактического использования. AOP позволяет мне рассчитать время и распечатать данные в файлах журналов без фактической модификации любой из этих функций.

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

Этот вид вещей не возникает очень часто, но всякий раз, когда это происходит, monkeypatching ОЧЕНЬ полезен. Python также имеет декораторы, которые реализуют шаблон дизайна Decorator (http://en.wikipedia.org/wiki/Decorator_pattern), чтобы выполнить аналогичные вещи.

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

1

Я использую АОП в своих приложениях на C#. Я не большой поклонник использования атрибутов, поэтому я использовал Castle DynamicProxy и Boo для применения аспектов во время работы, не загрязняя мой код.

4

В Terracotta мы используем инструменты AOP и байт-кода довольно широко, чтобы интегрировать и инструменты, стороннего программного обеспечения. Например, наш Spring intergration выполнен в значительной степени с использованием aspectwerkz. Короче говоря, нам нужно перехватить вызовы на весенние бобы и бобовые фабрики в разных точках, чтобы сгруппировать их.

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

4

АОП и демаркация сделок - это матч, совершенный на небесах. Мы используем аннотации Spring AOP @Transaction, это упрощает и интуитивно понятное tx-демаркацию, чем я когда-либо видел.

1

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

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

7

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

Любой, кто использует платформу Spring (возможно, около 50% разработчиков Java-приложений), использует AOP, знают ли они это или нет.

1

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

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

1

Мы используем PostSharp для нашего решения АОП. У нас есть операции кэширования, обработки ошибок и повторной загрузки баз данных, которые мы в настоящее время используем и которые находятся в процессе проверки безопасности в Aspect.

Отлично подходит для нас. Разработчики действительно любят разделение проблем. Архитекторам очень нравится иметь логику уровня платформы, консолидированную в одном месте.

Библиотека PostSharp представляет собой пост-компилятор, который выполняет инъекцию кода. У этого есть библиотека предопределенных перехватов, которые мертвы мозги, легко реализуемые. Это похоже на проводку в обработчиках событий.