Пойнткат
В аспектно-ориентированном программировании pointcut — это набор точек соединения . Pointcut указывает, где именно применять советы , что позволяет разделить задачи и помогает модульизировать бизнес-логику. [1] Pointcuts часто указываются с использованием имен классов или методов, в некоторых случаях с использованием регулярных выражений, соответствующих имени класса или метода. Различные платформы поддерживают разные выражения Pointcut; Синтаксис AspectJ считается стандартом де-факто. Доступны платформы для различных языков программирования, таких как Java , Perl , Ruby и многих других, которые поддерживают pointcut.
Фон
[ редактировать ]Из-за ограничений различных языков программирования сквозные задачи не были модульными. Сквозная проблема относится к частям программного обеспечения, которые логически принадлежат одному модулю и влияют на всю систему: это может быть, например, безопасность или ведение журнала. [2] Аспектно-ориентированное программирование пытается решить эти сквозные проблемы, позволяя программистам писать модули, называемые аспектами, которые содержат фрагменты кода, выполняемые в определенный момент. Выражения, необходимые для выбора конкретной точки, привели к созданию выражений Pointcut.
Исполнение
[ редактировать ]Всякий раз, когда выполнение программы достигает одной из точек соединения, описанных в pointcut, выполняется фрагмент кода, связанный с pointcut (называемый советом). Это позволяет программисту описать, где и когда должен выполняться дополнительный код в дополнение к уже определенному поведению. Pointcut позволяет добавлять аспекты к существующему программному обеспечению, а также разрабатывать программное обеспечение с четким разделением задач , при этом программист объединяет (объединяет) различные аспекты в законченное приложение.
Пример
[ редактировать ]Предположим, есть приложение, в котором мы можем изменять записи в базе данных . Всякий раз, когда пользователи изменяют базу данных, мы хотим иметь журнал информации о том, кто изменяет записи. Традиционный способ регистрации — вызвать метод журнала непосредственно перед изменением базы данных. При аспектно-ориентированном программировании мы можем применить pointcut к методу «Изменить базу данных» и получить совет, вызываемый для регистрации необходимой информации. [3]
Выражения
[ редактировать ]Ниже приведены некоторые важные выражения pointcut, поддерживаемые AspectJ . Эти выражения можно комбинировать с помощью логических операторов. [4]
execution(void User.setPassword(password))
Этот pointcut соответствует выполнению метода User.setPassword.
call(void User.getPassword())
Когда вызывается User.getPassword, этот pointcut сопоставляется.
handler(ArrayIndexOutOfBounds)
Pointcut будет соответствовать при наличии исключения ArrayIndexOutOfBounds.
this(UserType)
Pointcut будет соответствовать, если выполняющийся в данный момент объект имеет тип UserType.
target(UserType)
Pointcut будет соответствовать, если целевой объект имеет тип UserType.
within(UserType)
Pointcut будет соответствовать, если исполняемый код принадлежит UserType.
Критика
[ редактировать ]влияют на важные свойства программного обеспечения, такие как возможность развития Языки Pointcut отрицательно и понятность. Может возникнуть ситуация, когда необходимо выполнить рефакторинг для определения правильного аспекта, чего в целом не должно происходить, поскольку рефакторинг предназначен для того, чтобы сделать код чище. Он также не масштабируем , когда к одному и тому же коду нужно применить несколько аспектов, и каждый аспект требует отдельного рефакторинга. [5] В общем, каждый аспект будет тесно связан со структурой приложения, поскольку pointcut явно содержит сигнатуру метода, поэтому при изменении приложения необходимо также изменить pointcut. Это может быть довольно проблематично для разработчика. [5]
Ссылки
[ редактировать ]- ^ «Классификация языковых конструкций Pointcut» (PDF) . Проверено 29 декабря 2019 г.
- ^ «Введение в AspectJ» . Проверено 14 сентября 2016 г.
- ^ «JBoss AOP — Руководство пользователя» . docs.jboss.org . Проверено 14 сентября 2016 г.
- ^ «Соединение точек и точечных разрезов» . Проверено 14 сентября 2016 г.
- ^ Перейти обратно: а б «Индуктивно сгенерированные PointCuts для поддержки рефакторинга в аспекты». 2004. CiteSeerX 10.1.1.2.594 .
Внешние ссылки
[ редактировать ]- Статья « Назад в будущее: точки как предикаты над следами ». Карла Клозе и Клауса Остерманна
- Статья « Remote Pointcut — языковая конструкция для распределенного АОП », авторы Муга Нисидзава , Сигэру Чиба и Мичиаки Тацубори
- Статья « Даталог как язык Pointcut в аспектно-ориентированном программировании »
- Статья « Выразительность и сложность перекрестных языков » Карла Дж. Либерхерра , Джеффри Палма и Рави Сундарама