Используете ли вы АОП (аспектно-ориентированное программирование) в производственном программном обеспечении?
Автор вопроса: Martin KlinkeОтветов: 11
На мой взгляд, АОП представляет собой интересную парадигму программирования. Однако здесь, в stackoverflow, об этом еще не было обсуждений (по крайней мере, я не смог их найти). Что ты вообще об этом думаешь? Вы используете АОП в своих проектах? Или вы думаете, что это скорее нишевая технология, которой давно не будет или она не станет мейнстримом (как ООП, по крайней мере теоретически;))?
Если вы все же используете АОП, сообщите нам, какие инструменты вы тоже используете. Спасибо!
Ортогональные проблемы, такие как безопасность, лучше всего решать с помощью перехвата в стиле АОП. Будет ли это сделано автоматически (через что-то вроде контейнера внедрения зависимостей) или вручную, не имеет значения для конечной цели.
Один пример: атрибуты "до / после" в xUnit.net (проект с открытым исходным кодом, который я выполняю): форма перехвата метода в стиле АОП. Вы украшаете свои тестовые методы этими атрибутами, и непосредственно перед и после запуска этого тестового метода вызывается ваш код. Его можно использовать для таких вещей, как настройка базы данных и откат результатов, изменение контекста безопасности, в котором выполняется тест, и т. Д.
Другой пример: атрибуты фильтра в ASP.NET MVC также действуют как специализированные перехватчики методов в стиле AOP. Один, например, позволяет вам сказать, как следует обрабатывать необработанные ошибки, если они происходят в вашем методе действия.
Многие контейнеры для внедрения зависимостей, включая Castle Windsor и Unity, поддерживают это поведение либо "в коробке", либо с помощью расширений.
Ответ 2 · рейтинг 20 · Eli Courtwright
Python поддерживает AOP, позволяя вам динамически изменять его классы во время выполнения (что в Python обычно называется monkeypatching, а не AOP). Вот некоторые из моих вариантов использования АОП:
У меня есть веб-сайт, на котором каждая страница создается функцией Python. Я хотел бы взять курс и сделать все веб-страницы, созданные этим классом, защищенными паролем. На помощь приходит АОП; перед вызовом каждой функции я провожу соответствующую проверку сеанса и при необходимости перенаправляю.
Я хотел бы вести журнал и профилировать множество функций в моей программе во время ее фактического использования. АОП позволяет мне рассчитывать синхронизацию и распечатывать данные в файлы журналов, не изменяя при этом ни одну из этих функций.
У меня есть модуль или класс, полный функций, не связанных с потоками, и я использую его в каком-то многопоточном коде. Некоторые АОП добавляют блокировку для этих вызовов функций, не заходя в библиотеку и ничего не меняя.
Подобные вещи возникают нечасто, но когда бы то ни было, обезьяна ОЧЕНЬ полезна. Python также имеет декораторы, которые реализуют шаблон проектирования Decorator (http://en.wikipedia.org/wiki/Decorator_pattern) для выполнения аналогичных действий.
Обратите внимание, что динамическое изменение классов также может позволить вам обходить ошибки или добавлять функции в стороннюю библиотеку без фактического изменения этой библиотеки. Мне почти никогда не нужно это делать, но несколько раз это было невероятно полезно.
Ответ 3 · рейтинг 9 · Dónal
Я не понимаю, как можно решить общие проблемы, такие как ведение журнала, безопасность, управление транзакциями, обработка исключений, без использования АОП.
Любой, кто использует фреймворк Spring (вероятно, около 50% корпоративных разработчиков Java), использует АОП, знают они об этом или нет.
Ответ 4 · рейтинг 4 · Scott Bale
В Terracotta мы довольно широко используем AOP и инструментарий байт-кода для интеграции и инструментария стороннего программного обеспечения. Например, наша Spring интеграция в основном выполняется с помощью aspectwerkz. Вкратце, нам нужно перехватывать вызовы Spring beans и bean-фабрик в различных точках, чтобы сгруппировать их.
Таким образом, АОП может быть полезен для интеграции со сторонним кодом, который иначе не может быть изменен. Однако мы обнаружили огромную ловушку - по возможности используйте только сторонний общедоступный API в своих точках соединения, иначе вы рискуете, что ваш код сломается из-за изменения какого-то частного метода в следующем второстепенном выпуске, и он станет кошмар обслуживания.
Ответ 5 · рейтинг 4 · skaffman
AOP и разграничение транзакций - это союз, заключенный на небесах. Мы используем аннотации Spring AOP @Transaction, они упрощают и упрощают разграничение tx, чем я когда-либо видел.
Ответ 6 · рейтинг 3 · Matt McMinn
Мы довольно долгое время использовали аспектJ в одном из моих больших проектов. Проект состоял из нескольких веб-служб, каждая из которых выполняла несколько функций, которые служили интерфейсом для сложной системы обработки / запросов документов. Где-то около 75 тысяч строк кода. Мы использовали аспекты для двух относительно незначительных частей функциональности.
Во-первых, отслеживание потока приложений. Мы создали аспект, который запускался до и после каждого вызова функции, чтобы распечатать "вошла 'функция'" и "вышла из 'функции'". С помощью селектора функций (может быть, pointcut? Я не помню правильного имени) мы смогли использовать его как инструмент отладки, выбирая только те функции, которые мы хотели отслеживать в данный момент. Это было действительно хорошее использование аспектов в нашем проекте.
Второе, что мы сделали, - это метрики для конкретных приложений. Мы помещаем аспекты в методы наших веб-сервисов для сбора времени, информации об объектах и т. Д. И выгружаем результаты в базу данных. Это было хорошо, потому что мы могли фиксировать эту информацию, но при этом хранить весь этот код захвата отдельно от "реального" кода, который выполнял эту работу.
Я читал о некоторых хороших решениях, которые аспекты могут предложить, но я все еще не уверен, что они действительно могут сделать то, что вы не смогли бы сделать (может быть, лучше) с "нормальной" технологией. Например, я не мог придумать ни одной важной функции или функциональности, которые требовались для любого из наших проектов, которые не могли бы быть выполнены так же легко без аспектов - где я нашел полезные аспекты, это те второстепенные вещи, о которых я упоминал. .
Ответ 7 · рейтинг 1 · Chris Canal
Я активно использую АОП в своих приложениях на C #. Я не большой поклонник использования атрибутов, поэтому я использовал Castle DynamicProxy и Boo для применения аспектов во время выполнения, не загрязняя свой код.
Ответ 8 · рейтинг 1 · Chris R
Мы используем АОП в фасаде нашего сеанса, чтобы предоставить нашим клиентам единообразную основу для настройки нашего приложения. Это позволяет нам предоставить единую точку настройки без необходимости добавлять ручную поддержку ловушек для каждого метода.
Кроме того, АОП предоставляет единую точку настройки для дополнительной настройки и удаления транзакций, а также обычных вещей для ведения журналов. В общем, обслуживание намного проще, чем делать все это вручную.
Ответ 9 · рейтинг 1 · Yes - that Jake.
Основное приложение, над которым я работаю, включает хост скриптов. АОП позволяет хосту проверять свойства сценария, прежде чем решить, загружать или нет сценарий в домен приложения. Поскольку некоторые сценарии довольно громоздки, это значительно ускоряет загрузку во время выполнения.
Мы также используем и планируем использовать значительное количество атрибутов для таких вещей, как управление компилятором, управление потоком и отладка в среде IDE, которые не обязательно должны быть частью окончательного распределенного приложения.
Ответ 10 · рейтинг 1 · Brian Adams
Мы используем PostSharp для нашего решения АОП. У нас есть аспекты кэширования, обработки ошибок и повторных попыток базы данных, которые мы используем в настоящее время и находимся в процессе превращения наших проверок безопасности в Аспект.
У нас отлично работает. Разработчикам действительно нравится разделение интересов. Архитекторам очень нравится, когда логика уровня платформы объединена в одном месте.
Библиотека PostSharp - это пост-компилятор, который выполняет инъекцию кода. У него есть библиотека предопределенных перехватов, которые очень легко реализовать. Похоже на проводку в обработчиках событий.
Ответ 11 · arif abbas
Да, мы действительно используем АОП в прикладном программировании. Я предпочитаю использовать AspectJ для интеграции aop в свои приложения Spring. Взгляните на эту статью, чтобы получить более широкие представления о том же.