Alexander [email protected]
: Избавляемся от дублирования кода внедрение аспектов в PHP с помощью библиотеки
Go! AOP
О докладчике
Лисаченко Александр• - Архитектор веб приложений в Alpari
• Идеолог Symfony2: почти десяток внутренних сервисов на Symfony2, . . в т ч и основной сайт alpari.ru
(CDN, Varnish+ESI, Twig, Assetic, ~60 , сабмодулей ~20 ) бандлов
• ;Машинное программирование
• ;Структурированное программирование
• ;Процедурное программирование
• ;Модульное программирование
• - ;Объектно ориентированное программирование
• < новая высокоуровневая парадигма >
Эволюция программирования
: , .Ключевые элементы классы объекты
: , , Принципы абстрагирование инкапсуляция, .наследование полиморфизм
, …Старое доброе ООП
Принцип единственной ответственности
Принцип единственной ответственности
Принцип единственной ответственности
...Авторизация
...Журналирование
...Обработка ошибок
, Всему виной сквозная функциональность , .пронизывающая весь код подобно шампуру
Этот код не может быть вынесен в отдельные :классы и лежит везде
• ;кэширование
• ;журналирование
• ;обработка исключений
• ;проверка доступа
• .транзакционность
?Почему же это так
: Клинический диагноз типичного приложения<censored>- :код
• ;непригодный к повторному использованию
• трудно понять исходное предназначение, , класса запутанная логика большая
;цикломатическая сложность
• , больше вероятность допустить ошибку забыв « » ;вписать шаблонный код
• , копирование кода обработки нарушение принципа DRY.
?Что у нас в итоге
!АОП нам в помощь
!АОП нам в помощь
- Аспектно ориентированное программирование( )АОП
• - АОП методика программирования в рамках , классовой парадигмы основанная на понятии
— , аспекта блока кода инкапсулирующего .сквозное поведение в составе классов
История возникновения АОП
•1974 – принцип разделения ответственности
•1990 – е исследования АОП
• Composition Filters
• - Субъектно ориентированноепрограммирование
• Адаптивное программирование
• 1997 - - Аспектно ориентированное ( программирование доклад на европейской
)конференции по ООП
• 2001 – AspectJразработка АОП фреймворка
Основные понятия АОП
• ( . aspect) — , Аспект англ модуль или класс . реализующий сквозную функциональность
, Аспект изменяет поведение остального кода , применяя совет в точках соединения
.определённых некоторым срезом
• ( . advice) — Совет англ средство оформления, кода который должен быть вызван из точки
. , соединения Совет может быть выполнен до .после или вместо точки соединения
Основные понятия АОП
• ( . join point) — Точка соединения англ точка в , выполняемой программе где следует
. применить совет
• ( . pointcut) — Срез англ набор точек. , соединения Срез определяет подходит ли
. данная точка соединения к данному совету
• ( . introduction, ) — Внедрение англ введение / изменение структуры класса и или изменение
иерархии наследования для добавления . функциональности аспекта в инородный код
Основные понятия АОП
(Advice)Базовые типы советов
• Before - совет выполняется до вызываемого . метода или свойства
• After - совет выполняется после вызываемого. метода
• Around - совет выполняется вместо . вызываемого метода Внутри обработчика есть возможность ручной передачи управления в , . вызываемый метод если это необходимо
(Advice)Базовые типы советов
Before
Before
After
After Throwing
Место для АОП в PHP
АОП органично дополняет существующие :технологии в единое целое
• (IoC, DIC)Внедрение зависимостей• (yaml, xml, php)Абстракция сервисов• - Аспектно ориентированное программирование
Место для АОП в PHP
• Внедрение зависимостей• Абстракция сервисов• - Аспектно ориентированное программирование
PHPТекущие реализации АОП в
:Перспективные решения
• AOP-PHP
• JMSAopBundle
• TYPO3 Flow AOP component
:Кладбище реализаций
• PHPAspect
• Aspect-Oriented PHP
• AspectPHP
Go!Библиотека
— Базовая идея не нова заменяем класс - .аналогичной реализацией декоратором
:Ключевые моменты
• Статический анализ классов перед их (php-token-reflection, загрузкой в память ядро
ApiGen)
• « »Изменяем иерархию классов на лету
• Модификация исходного кода класса в , момент загрузки класса кэшируем готовые
классы
Go!Библиотека
• PHP- , Не использует расширений целиком PHP;написана на самом
• DI- Не требует контейнера для подмены - ;сервисов прокси объектами
• Может перехватывать методы в финальных, , классах финальные методы а также
;статические методы
• Может перехватывать обращения к ;публичным и защищенным полям
• , Чистый генерируемый код удобно проводить XDebugотладку классов и аспектов с помощью
Исходный код класса
Класс аспекта
Результат выполнения
Обработанный код класса
...Ловись рыбка большая
...Ловись рыбка большая
Пример кэширования с аспектом
?Что ожидается еще
• pointcut- ( FLOW3)Парсер ов смотрим на
• Introduction — навешиваем трейты и интерфейсы на классы
• shared- Кэширование массива советов в памяти— не нужно проверять в рантайме вообще
( , Closure)ничего привет сериализация
• init — Поддержка точек отлаливаем все new конструкции и выполняем свой код
• :)Максимальная производительность
! Благодарю за внимание?Вопросы
Профиль нашей hh.ruкомпании на
Ссылка набиблиотеку