34
Alexander Lisachenko [email protected] : Избавляемся от дублирования кода внедрение аспектов в PHP с помощью библиотеки Go! AOP

Внедрение аспектов в PHP с помощью библиотеки GO! AOP

Embed Size (px)

DESCRIPTION

Презентация к докладу на SymfonyCampUA-2012. В докладе рассмотрены основные вопросы работы с АОП в PHP, даны определения аспектов, срезов, советов, а также рассмотрено реальное использование библиотеки GO! для внедрения аспектно-ориентированной парадигмы в любое приложение.

Citation preview

Page 1: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

Alexander [email protected]

: Избавляемся от дублирования кода внедрение аспектов в PHP с помощью библиотеки

Go! AOP

Page 2: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

О докладчике

Лисаченко Александр• - Архитектор веб приложений в Alpari

• Идеолог Symfony2: почти десяток внутренних сервисов на Symfony2, . . в т ч и основной сайт alpari.ru

(CDN, Varnish+ESI, Twig, Assetic, ~60 , сабмодулей ~20 ) бандлов

Page 3: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

• ;Машинное программирование

• ;Структурированное программирование

• ;Процедурное программирование

• ;Модульное программирование

• - ;Объектно ориентированное программирование

• < новая высокоуровневая парадигма >

Эволюция программирования

Page 4: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

: , .Ключевые элементы классы объекты

: , , Принципы абстрагирование инкапсуляция, .наследование полиморфизм

, …Старое доброе ООП

Page 5: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

Принцип единственной ответственности

Page 6: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

Принцип единственной ответственности

Page 7: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

Принцип единственной ответственности

Page 8: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

...Авторизация

Page 9: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

...Журналирование

Page 10: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

...Обработка ошибок

Page 11: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

, Всему виной сквозная функциональность , .пронизывающая весь код подобно шампуру

Этот код не может быть вынесен в отдельные :классы и лежит везде

• ;кэширование

• ;журналирование

• ;обработка исключений

• ;проверка доступа

• .транзакционность

?Почему же это так

Page 12: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

: Клинический диагноз типичного приложения<censored>- :код

• ;непригодный к повторному использованию

• трудно понять исходное предназначение, , класса запутанная логика большая

;цикломатическая сложность

• , больше вероятность допустить ошибку забыв « » ;вписать шаблонный код

• , копирование кода обработки нарушение принципа DRY.

?Что у нас в итоге

Page 13: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

!АОП нам в помощь

Page 14: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

!АОП нам в помощь

- Аспектно ориентированное программирование( )АОП

• - АОП методика программирования в рамках , классовой парадигмы основанная на понятии

— , аспекта блока кода инкапсулирующего .сквозное поведение в составе классов

Page 15: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

История возникновения АОП

•1974 – принцип разделения ответственности

•1990 – е исследования АОП

• Composition Filters

• - Субъектно ориентированноепрограммирование

• Адаптивное программирование

• 1997 - - Аспектно ориентированное ( программирование доклад на европейской

)конференции по ООП

• 2001 – AspectJразработка АОП фреймворка

Page 16: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

Основные понятия АОП

• ( . aspect) — , Аспект англ модуль или класс . реализующий сквозную функциональность

, Аспект изменяет поведение остального кода , применяя совет в точках соединения

.определённых некоторым срезом

• ( . advice) — Совет англ средство оформления, кода который должен быть вызван из точки

. , соединения Совет может быть выполнен до .после или вместо точки соединения

Page 17: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

Основные понятия АОП

• ( . join point) — Точка соединения англ точка в , выполняемой программе где следует

. применить совет

• ( . pointcut) — Срез англ набор точек. , соединения Срез определяет подходит ли

. данная точка соединения к данному совету

• ( . introduction, ) — Внедрение англ введение / изменение структуры класса и или изменение

иерархии наследования для добавления . функциональности аспекта в инородный код

Page 18: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

Основные понятия АОП

Page 19: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

(Advice)Базовые типы советов

• Before - совет выполняется до вызываемого . метода или свойства

• After - совет выполняется после вызываемого. метода

• Around - совет выполняется вместо . вызываемого метода Внутри обработчика есть возможность ручной передачи управления в , . вызываемый метод если это необходимо

Page 20: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

(Advice)Базовые типы советов

Before

Before

After

After Throwing

Page 21: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

Место для АОП в PHP

АОП органично дополняет существующие :технологии в единое целое

• (IoC, DIC)Внедрение зависимостей• (yaml, xml, php)Абстракция сервисов• - Аспектно ориентированное программирование

Page 22: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

Место для АОП в PHP

• Внедрение зависимостей• Абстракция сервисов• - Аспектно ориентированное программирование

Page 23: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

PHPТекущие реализации АОП в

:Перспективные решения

• AOP-PHP

• JMSAopBundle

• TYPO3 Flow AOP component

:Кладбище реализаций

• PHPAspect

• Aspect-Oriented PHP

• AspectPHP

Page 24: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

Go!Библиотека

— Базовая идея не нова заменяем класс - .аналогичной реализацией декоратором

:Ключевые моменты

• Статический анализ классов перед их (php-token-reflection, загрузкой в память ядро

ApiGen)

• « »Изменяем иерархию классов на лету

• Модификация исходного кода класса в , момент загрузки класса кэшируем готовые

классы

Page 25: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

Go!Библиотека

• PHP- , Не использует расширений целиком PHP;написана на самом

• DI- Не требует контейнера для подмены - ;сервисов прокси объектами

• Может перехватывать методы в финальных, , классах финальные методы а также

;статические методы

• Может перехватывать обращения к ;публичным и защищенным полям

• , Чистый генерируемый код удобно проводить XDebugотладку классов и аспектов с помощью

Page 26: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

Исходный код класса

Page 27: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

Класс аспекта

Page 28: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

Результат выполнения

Page 29: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

Обработанный код класса

Page 30: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

...Ловись рыбка большая

Page 31: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

...Ловись рыбка большая

Page 32: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

Пример кэширования с аспектом

Page 33: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

?Что ожидается еще

• pointcut- ( FLOW3)Парсер ов смотрим на

• Introduction — навешиваем трейты и интерфейсы на классы

• shared- Кэширование массива советов в памяти— не нужно проверять в рантайме вообще

( , Closure)ничего привет сериализация

• init — Поддержка точек отлаливаем все new конструкции и выполняем свой код

• :)Максимальная производительность

Page 34: Внедрение аспектов в PHP с помощью библиотеки GO! AOP

! Благодарю за внимание?Вопросы

Профиль нашей hh.ruкомпании на

Ссылка набиблиотеку