Аспектная
by Грегор Кичалес
Происхождение
Основателем аспектно-ориентированного программирования считается Грегор Кичалес. В 1990-х годах он вместе с командой разработал концепцию аспектов и создал язык AspectJ, который расширил возможности объектно-ориентированного программирования для лучшей модульности кода.
Исторический контекст
АОП возникло как реакция на трудности в организации кода, связанные с сквозной функциональностью — поведением, которое затрагивает многие модули программы, например, логирование, управление безопасностью и обработку ошибок. В объектно-ориентированном программировании такие функции часто сложно изолировать в одном месте. Кичалес и его коллеги предложили выделять такие аспекты в отдельные модули (аспекты), которые затем “переплетаются” с основной логикой программы.
Аспектно-ориентированная парадигма программирования (АОП) предоставляет инструменты для выделения сквозной функциональности в отдельные модули, называемые аспектами, которые могут пересекать и дополнять базовый код программы.
Все языки АОП предоставляют средства для выделения сквозной функциональности в отдельную сущность. Так как AspectJ является родоначальником этого направления, используемые в этом расширении концепции распространились на большинство языков АОП
АОП предлагает решения для работы со сквозной функциональностью, такой как логирование, управление транзакциями или безопасность, которая обычно затрагивает многие модули программы. AspectJ, как один из первых и наиболее распространённых инструментов, реализует эти концепции для языка Java.
Аспект (aspect) — модуль или класс, реализующий сквозную функциональность. Аспект изменяет поведение остального кода, применяя совет в точках соединения, определённых некоторым срезом
Аспект является основным элементом в АОП, который позволяет внедрять сквозную функциональность в программу, не изменяя её исходный код. Аспекты могут влиять на выполнение программы в определённых точках, обеспечивая гибкость и модульность.
Совет (advice) — средство оформления кода, которое должно быть вызвано из точки соединения. Совет может быть выполнен до, после или вместо точки соединения
Совет определяет, какой код должен выполняться в точке соединения. Он может быть выполнен перед, после или вместо выполнения основного кода, что позволяет добавлять функциональность без изменения исходного кода.
Точка соединения (joint point) — точка в выполняемой программе, где следует применить совет. Многие реализации АОП позволяют использовать вызовы методов и обращения к полям объекта в качестве точек соединения
Точки соединения — это места в коде, где можно применять аспекты. Это может быть вызов метода, доступ к полю или даже определённое исключение. Это позволяет гибко и точно контролировать, где и как будет применяться дополнительная функциональность.
Срез (pointcut) — набор точек соединения. Срез определяет, подходит ли данная точка соединения к данному совету. Самые удобные реализации АОП используют для определения срезов синтаксис основного языка (например, в AspectJ применяются Java-сигнатуры) и допускают их повторное использование с помощью переименования и комбинирования
Срезы группируют точки соединения и определяют, когда и где должен выполняться аспект. Это мощный инструмент для управления аспектами, позволяющий создавать универсальные и многократно используемые решения.
Внедрение (introduction) — изменение структуры класса и/или изменение иерархии наследования для добавления функциональности аспекта в инородный код. Обычно реализуется с помощью некоторого метаобъектного протокола
Внедрение позволяет аспектам изменять структуру классов, добавляя новые методы или поля, что расширяет возможности программы, сохраняя при этом основной код неизменным.
Примеры языков
- AspectJ
- PostSharp (для C#)
- Spring AOP
аспектная парадигма