Сквозной пример озабоченность


что является хорошим примером cross-cutting concern? Пример медицинской карты на Википедия страница кажется мне неполной.

в частности, из этого примера, почему ведение журнала приведет к дублированию кода (рассеяния)? (Кроме простых вызовов, таких как log("....") везде, что не кажется большим делом).

В чем разница между a core concern и cross-cutting concern?

моя конечная цель - получить лучшее понимание АОП.

3 68

3 ответа:

прежде чем понять Перекрестные Отношения, мы должны понять беспокойство.

A беспокойство - это термин, который относится к части системы делятся по принципу функциональности.

проблемы бывают двух типов:

  1. проблемы, представляющие Единую и конкретную функциональность для основных требований, известны как ядро опасения.
    Или
    Первичная функциональность системы известна как основные проблемы.
    : бизнес-логика
  2. проблемы, представляющие функциональные возможности для вторичных требований, называются сквозные проблемы или общесистемные проблемы.
    Или
    Элемент перекрестные отношения это проблема, которая применима во всем приложении, и это влияет на весь приложение.
    например: ведение журнала, безопасность и передача данных-это проблемы, которые необходимы почти в каждом модуле приложения, поэтому они являются сквозными проблемами.

вежливость

enter image description here

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

(вежливость)

Я думаю, что единственный лучший пример сквозной проблемы-это транзакционное поведение. Например, необходимость помещать блоки try-catch с вызовами commit и rollback во все ваши методы обслуживания была бы отталкивающей. Аннотирование методов с помощью маркера, который AOP может использовать для инкапсуляции их с желаемым транзакционным поведением, является большой победой.

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

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

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

в дополнение к принятому ответу я хочу упомянуть еще один пример для сквозной проблемы: remoting. Скажем, я просто хочу вызвать другие компоненты в моей экосистеме локально, как если бы они работали в процессе. Может быть, в некоторых случаях они даже делают. Но теперь я хочу запустить свои сервисы, распространяемые в облаке или кластере. Почему я должен заботиться об этом аспекте как разработчик приложений? Аспект может позаботиться о том, чтобы выяснить, кому звонить и как, сериализуя передаваемые данные, если это необходимо и выполнение удаленного вызова. Если бы все работало в процессе, аспект просто перенаправил бы локальный вызов. На стороне вызываемого объекта аспект десериализует данные, выполняет локальный вызов и возвращает результат.

System.out.println(*) там, где действительно должен был быть выход журнала. Поэтому я закончил тем, что исправил тысячи строк кода, разбросанных по всей базе кода. К счастью, я мог бы использовать некоторые умные трюки в IntelliJ IDEA (structural search & replace), чтобы ускорить все действие, но мальчик, вы не думаете, что это было тривиально! Конечно, сильно контекстно-зависимое ведение журнала отладки всегда будет происходить в теле метода, но многие важные типы ведения журнала такие как трассировка вызовов методов (даже иерархически с хорошим отступом на выходе), регистрация как обработанных, так и необработанных исключений, аудит пользователей (регистрация вызовов ограниченных методов на основе ролей пользователей) и т. д. могут быть легко реализованы в аспектах без их загрязнения исходного кода. Разработчику повседневного приложения не нужно думать об этом или даже видеть вызовы регистратора, разбросанные по базе кода. Кто-то несет ответственность за поддержание аспекта в актуальном состоянии и может даже переключить стратегия ведения журнала или вся структура ведения журнала централизованно в одном месте.

Я могу придумать аналогичные объяснения для других сквозных проблем. Сохранение кода чистым и свободным от рассеивания и запутывания IMO-это вопрос профессионализма, а не что-то необязательное. Последнее, но не менее он сохраняет код читабельным, ремонтопригодны, refactorable. Да будет так.