Введение

В аспектно-ориентированном программировании, точечный вырез (pointcut) – это набор точек соединения. Точечный вырез определяет, где именно применять перехватчики (advice), что обеспечивает разделение ответственности и способствует модульности бизнес-логики. Точечные вырезы часто задаются с использованием имен классов или методов, а в некоторых случаях – с помощью регулярных выражений, соответствующих именам классов или методов. Различные фреймворки поддерживают различные выражения для точечных вырезов; синтаксис AspectJ считается фактическим стандартом. Фреймворки доступны для различных языков программирования, таких как Java, Perl, Ruby и многих других, поддерживающих точечные вырезы.

Предыстория

В связи с ограничениями различных языков программирования, сквозная функциональность не была модулиризована. Сквозная функциональность относится к частям программного обеспечения, которые логически принадлежат одному модулю, но оказывают влияние на всю систему, например, безопасность или ведение журналов. Аспектно-ориентированное программирование пытается решить проблему сквозной функциональности, позволяя программистам создавать модули, называемые аспектами, которые содержат фрагменты кода, выполняемые в определенных точках. Выражения, необходимые для выбора конкретной точки, привели к созданию выражений точечного среза (Pointcut Expressions).

Исполнение

Всякий раз, когда выполнение программы достигает одной из точек соединения, описанных в точке среза, выполняется фрагмент кода, связанный с точкой среза (называемый советом). Это позволяет программисту определить, где и когда должен быть выполнен дополнительный код, помимо уже заданного поведения. Точка среза позволяет добавлять аспекты к существующему программному обеспечению, а также разрабатывать программное обеспечение с чётким разделением ответственности, при котором программист интегрирует (объединяет) различные аспекты в полноценное приложение.

Пример

Предположим, есть приложение, позволяющее изменять записи в базе данных. Каждый раз, когда пользователи вносят изменения в базу данных, нам нужен журнал информации о том, кто эти изменения вносит. Традиционный способ ведения журнала – вызов метода логирования непосредственно перед изменением базы данных. С помощью аспектно-ориентированного программирования мы можем применить точечный вырез (pointcut) к методу изменения базы данных и определить совет (advice), который будет вызываться для записи необходимой информации.

Критика

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