Используете ли вы АОП (аспектно-ориентированное программирование) в производственном программном обеспечении?

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

Если вы все же используете АОП, сообщите нам, какие инструменты вы тоже используете. Спасибо!


person Martin Klinke    schedule 21.08.2008    source источник


Ответы (11)


да.

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

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

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

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

person Brad Wilson    schedule 21.08.2008
comment
Будьте осторожны, когда заявляете о лучшем. Многие эксперты считают, что модель возможностей - лучший способ обеспечить безопасность, и что АОП - ужасная вещь. - person L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o&#x; 15.10.2011
comment
@Brad, ты говоришь, что некоторые вещи лучше всего делать с АОП. Можете ли вы объяснить, в чем именно преимущество, если использовать метод АОП по сравнению с традиционным способом? - person Pacerier; 14.06.2014

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

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

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

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

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

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

person Eli Courtwright    schedule 21.08.2008

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

Любой, кто использует фреймворк Spring (вероятно, около 50% корпоративных разработчиков Java), использует АОП, знают они об этом или нет.

person Dónal    schedule 17.10.2008
comment
Не могли бы вы объяснить, чем Log([arguments]) нечисто? Какие проблемы это создает? - person Pacerier; 14.06.2014
comment
@Pacerier, только что опоздал на вечеринку, просмотрев некоторые документы :) .... некоторые люди считают, что вам не нужно писать эти предложения, это не чистые средства: они не связаны с проблемой, которую вы собираетесь решать. - person davidmpaz; 16.10.2018

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

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

person Scott Bale    schedule 18.09.2008

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

person skaffman    schedule 24.09.2008

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

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

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

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

person Matt McMinn    schedule 21.08.2008
comment
Извините, это были проекты на Python? - person Adam Hughes; 18.06.2020

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

person Chris Canal    schedule 15.09.2008

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

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

person Chris R    schedule 29.09.2008

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

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

person Yes - that Jake.    schedule 17.10.2008

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

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

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

person Brian Adams    schedule 02.11.2008

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

http://codemodeweb.blogspot.in/2018/03/spring-aop-and-aspectj-framework.html

person arif abbas    schedule 30.04.2018