Внедрение аспектов в PHP с помощью библиотеки GO! AOP
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 2,442 views

Презентация к докладу на SymfonyCampUA-2012. ...

Презентация к докладу на SymfonyCampUA-2012.

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

Statistics

Views

Total Views
2,442
Views on SlideShare
2,250
Embed Views
192

Actions

Likes
3
Downloads
11
Comments
0

4 Embeds 192

http://2012.symfonycamp.org.ua 158
http://makedev.org 21
https://twitter.com 10
http://ams.activemailservice.com 3

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • Избавляемся от дублирования кода:внедрение аспектов в PHP с помощью библиотеки Go! AOP Alexander Lisachenko lisachenko.it@gmail.com
    • О докладчике Лисаченко Александр• Архитектор веб-приложений в 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 Throwing After
    • Место для АОП в 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 библиотеку