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

StackOverflow https://stackoverflow.com/questions/20663

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

Да.

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top