SlideShare una empresa de Scribd logo
1 de 34
Избавляемся от дублирования кода:
внедрение аспектов в 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              библиотеку

Más contenido relacionado

La actualidad más candente

Архитектура автоматизированных тестов
Архитектура автоматизированных тестовАрхитектура автоматизированных тестов
Архитектура автоматизированных тестовSQALab
 
Grail - CodeFest'2015
Grail - CodeFest'2015Grail - CodeFest'2015
Grail - CodeFest'2015Igor Khrol
 
Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Nikita Lipsky
 
Автоматическое тестирование. Моя система
Автоматическое тестирование. Моя системаАвтоматическое тестирование. Моя система
Автоматическое тестирование. Моя системаIgor Lyubin
 
Java 8 Support at the JVM Level
Java 8 Support at the JVM LevelJava 8 Support at the JVM Level
Java 8 Support at the JVM LevelNikita Lipsky
 
Клиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на JavaКлиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на JavaNikita Lipsky
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Hack Days
 
Feature toggles в процессе подбора, Алексей Ульенков СберТех
Feature toggles в процессе подбора, Алексей Ульенков СберТехFeature toggles в процессе подбора, Алексей Ульенков СберТех
Feature toggles в процессе подбора, Алексей Ульенков СберТехСбертех | SberTech
 
Тимур Шевляков
Тимур ШевляковТимур Шевляков
Тимур ШевляковCodeFest
 
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Nikita Lipsky
 
Refactorings with RubyMine
Refactorings with RubyMineRefactorings with RubyMine
Refactorings with RubyMineavokin
 
What to expect from Java 9
What to expect from Java 9What to expect from Java 9
What to expect from Java 9JavaDayUA
 
Web driver история одной миграции
Web driver   история одной миграцииWeb driver   история одной миграции
Web driver история одной миграцииIgor Khrol
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilationNikita Lipsky
 
Как автоматизировать комплексные системы
Как автоматизировать комплексные системыКак автоматизировать комплексные системы
Как автоматизировать комплексные системыSQALab
 
UICov - инструмент анализа покрытия UI-тестами
UICov - инструмент анализа покрытия UI-тестамиUICov - инструмент анализа покрытия UI-тестами
UICov - инструмент анализа покрытия UI-тестамиSQALab
 
Java 9 Модули. Почему не OSGi?
Java 9 Модули. Почему не OSGi?Java 9 Модули. Почему не OSGi?
Java 9 Модули. Почему не OSGi?Nikita Lipsky
 
Лев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про ErlangЛев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про ErlangYury Yurevich
 
Автоматическое тестирование Web api
Автоматическое тестирование Web apiАвтоматическое тестирование Web api
Автоматическое тестирование Web apiIgor Lyubin
 

La actualidad más candente (20)

Архитектура автоматизированных тестов
Архитектура автоматизированных тестовАрхитектура автоматизированных тестов
Архитектура автоматизированных тестов
 
Grail - CodeFest'2015
Grail - CodeFest'2015Grail - CodeFest'2015
Grail - CodeFest'2015
 
Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET
 
Автоматическое тестирование. Моя система
Автоматическое тестирование. Моя системаАвтоматическое тестирование. Моя система
Автоматическое тестирование. Моя система
 
Java 8 Support at the JVM Level
Java 8 Support at the JVM LevelJava 8 Support at the JVM Level
Java 8 Support at the JVM Level
 
Клиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на JavaКлиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на Java
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Feature toggles в процессе подбора, Алексей Ульенков СберТех
Feature toggles в процессе подбора, Алексей Ульенков СберТехFeature toggles в процессе подбора, Алексей Ульенков СберТех
Feature toggles в процессе подбора, Алексей Ульенков СберТех
 
Тимур Шевляков
Тимур ШевляковТимур Шевляков
Тимур Шевляков
 
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
 
Refactorings with RubyMine
Refactorings with RubyMineRefactorings with RubyMine
Refactorings with RubyMine
 
What to expect from Java 9
What to expect from Java 9What to expect from Java 9
What to expect from Java 9
 
Web driver история одной миграции
Web driver   история одной миграцииWeb driver   история одной миграции
Web driver история одной миграции
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilation
 
Как автоматизировать комплексные системы
Как автоматизировать комплексные системыКак автоматизировать комплексные системы
Как автоматизировать комплексные системы
 
UICov - инструмент анализа покрытия UI-тестами
UICov - инструмент анализа покрытия UI-тестамиUICov - инструмент анализа покрытия UI-тестами
UICov - инструмент анализа покрытия UI-тестами
 
Java 9 Модули. Почему не OSGi?
Java 9 Модули. Почему не OSGi?Java 9 Модули. Почему не OSGi?
Java 9 Модули. Почему не OSGi?
 
Лев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про ErlangЛев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про Erlang
 
Автоматическое тестирование Web api
Автоматическое тестирование Web apiАвтоматическое тестирование Web api
Автоматическое тестирование Web api
 
Roslyn Code Analysis
Roslyn Code AnalysisRoslyn Code Analysis
Roslyn Code Analysis
 

Destacado

Weaving aspects in PHP with the help of Go! AOP library
Weaving aspects in PHP with the help of Go! AOP libraryWeaving aspects in PHP with the help of Go! AOP library
Weaving aspects in PHP with the help of Go! AOP libraryAlexander Lisachenko
 
Practical cheminformatics workflows with mobile apps
Practical cheminformatics workflows with mobile appsPractical cheminformatics workflows with mobile apps
Practical cheminformatics workflows with mobile appsAlex Clark
 
Digital Solutions With MultiSoft
Digital Solutions With MultiSoftDigital Solutions With MultiSoft
Digital Solutions With MultiSoftRobert Proctor
 
Private Detective in Jalandhar
Private Detective in Jalandhar Private Detective in Jalandhar
Private Detective in Jalandhar Punjab Detective
 
Untitled Presentation
Untitled PresentationUntitled Presentation
Untitled PresentationBITCOIN INDIA
 
How to Teach Like an Award-winning Instructor
How to Teach Like an Award-winning InstructorHow to Teach Like an Award-winning Instructor
How to Teach Like an Award-winning InstructorJoel Gardner
 
How to Get Started as a Web Entrepreneur
How to Get Started as a Web EntrepreneurHow to Get Started as a Web Entrepreneur
How to Get Started as a Web EntrepreneurEnvato
 
How JESS3 Saved Christmas!
How JESS3 Saved Christmas!How JESS3 Saved Christmas!
How JESS3 Saved Christmas!JESS3
 
Modern Architectural Masterpieces - design masterpieces
Modern Architectural Masterpieces -  design  masterpiecesModern Architectural Masterpieces -  design  masterpieces
Modern Architectural Masterpieces - design masterpiecesMakala D.
 
Embracing Iterative Design
Embracing Iterative DesignEmbracing Iterative Design
Embracing Iterative DesignMike Rohde
 
Supply Chain Insights' Financial Benchmarking Examples - 27 AUG 2013
Supply Chain Insights' Financial Benchmarking Examples - 27 AUG 2013Supply Chain Insights' Financial Benchmarking Examples - 27 AUG 2013
Supply Chain Insights' Financial Benchmarking Examples - 27 AUG 2013Lora Cecere
 
F inland and the helsinki spring 090811
F inland and the helsinki spring 090811F inland and the helsinki spring 090811
F inland and the helsinki spring 090811Stanford University
 
Programas de Google DevRel LatAm South Region
Programas de Google DevRel LatAm South RegionProgramas de Google DevRel LatAm South Region
Programas de Google DevRel LatAm South RegionJuan José Rodriguez MsC.
 
Prosper.com Microfinance - SVMN.net mtg 2007-09-10
Prosper.com Microfinance - SVMN.net mtg 2007-09-10Prosper.com Microfinance - SVMN.net mtg 2007-09-10
Prosper.com Microfinance - SVMN.net mtg 2007-09-10Dave McClure
 
Day 2 Recap from #CannesLions #OgilvyCannes
Day 2 Recap from #CannesLions #OgilvyCannes Day 2 Recap from #CannesLions #OgilvyCannes
Day 2 Recap from #CannesLions #OgilvyCannes Ogilvy
 
Continuous Product Improvement
Continuous Product ImprovementContinuous Product Improvement
Continuous Product ImprovementMelissa Perri
 
“Spikey Workloads” Emergency Management in the Cloud
“Spikey Workloads” Emergency Management in the Cloud“Spikey Workloads” Emergency Management in the Cloud
“Spikey Workloads” Emergency Management in the CloudAmazon Web Services
 

Destacado (19)

Weaving aspects in PHP with the help of Go! AOP library
Weaving aspects in PHP with the help of Go! AOP libraryWeaving aspects in PHP with the help of Go! AOP library
Weaving aspects in PHP with the help of Go! AOP library
 
Practical cheminformatics workflows with mobile apps
Practical cheminformatics workflows with mobile appsPractical cheminformatics workflows with mobile apps
Practical cheminformatics workflows with mobile apps
 
Digital Solutions With MultiSoft
Digital Solutions With MultiSoftDigital Solutions With MultiSoft
Digital Solutions With MultiSoft
 
Aнглийский сленг (P-T)
Aнглийский сленг (P-T)Aнглийский сленг (P-T)
Aнглийский сленг (P-T)
 
Private Detective in Jalandhar
Private Detective in Jalandhar Private Detective in Jalandhar
Private Detective in Jalandhar
 
Untitled Presentation
Untitled PresentationUntitled Presentation
Untitled Presentation
 
How to Teach Like an Award-winning Instructor
How to Teach Like an Award-winning InstructorHow to Teach Like an Award-winning Instructor
How to Teach Like an Award-winning Instructor
 
How to Get Started as a Web Entrepreneur
How to Get Started as a Web EntrepreneurHow to Get Started as a Web Entrepreneur
How to Get Started as a Web Entrepreneur
 
How JESS3 Saved Christmas!
How JESS3 Saved Christmas!How JESS3 Saved Christmas!
How JESS3 Saved Christmas!
 
Modern Architectural Masterpieces - design masterpieces
Modern Architectural Masterpieces -  design  masterpiecesModern Architectural Masterpieces -  design  masterpieces
Modern Architectural Masterpieces - design masterpieces
 
Embracing Iterative Design
Embracing Iterative DesignEmbracing Iterative Design
Embracing Iterative Design
 
Supply Chain Insights' Financial Benchmarking Examples - 27 AUG 2013
Supply Chain Insights' Financial Benchmarking Examples - 27 AUG 2013Supply Chain Insights' Financial Benchmarking Examples - 27 AUG 2013
Supply Chain Insights' Financial Benchmarking Examples - 27 AUG 2013
 
F inland and the helsinki spring 090811
F inland and the helsinki spring 090811F inland and the helsinki spring 090811
F inland and the helsinki spring 090811
 
Programas de Google DevRel LatAm South Region
Programas de Google DevRel LatAm South RegionProgramas de Google DevRel LatAm South Region
Programas de Google DevRel LatAm South Region
 
Prosper.com Microfinance - SVMN.net mtg 2007-09-10
Prosper.com Microfinance - SVMN.net mtg 2007-09-10Prosper.com Microfinance - SVMN.net mtg 2007-09-10
Prosper.com Microfinance - SVMN.net mtg 2007-09-10
 
Day 2 Recap from #CannesLions #OgilvyCannes
Day 2 Recap from #CannesLions #OgilvyCannes Day 2 Recap from #CannesLions #OgilvyCannes
Day 2 Recap from #CannesLions #OgilvyCannes
 
Continuous Product Improvement
Continuous Product ImprovementContinuous Product Improvement
Continuous Product Improvement
 
“Spikey Workloads” Emergency Management in the Cloud
“Spikey Workloads” Emergency Management in the Cloud“Spikey Workloads” Emergency Management in the Cloud
“Spikey Workloads” Emergency Management in the Cloud
 
Meet Henry
Meet HenryMeet Henry
Meet Henry
 

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

2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий
2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий
2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел КрынецкийJSC “Arcadia Inc”
 
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...DevDay
 
Дизайн больших приложений в ФП
Дизайн больших приложений в ФПДизайн больших приложений в ФП
Дизайн больших приложений в ФПAlexander Granin
 
Масштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаМасштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаRoman Dvornov
 
Платформа .NET Core глазами PHP-разработчика
Платформа .NET Core глазами PHP-разработчикаПлатформа .NET Core глазами PHP-разработчика
Платформа .NET Core глазами PHP-разработчикаГеоргий Драк
 
История одной трансформации: как Magento 1 разработчику быстро переориентиров...
История одной трансформации: как Magento 1 разработчику быстро переориентиров...История одной трансформации: как Magento 1 разработчику быстро переориентиров...
История одной трансформации: как Magento 1 разработчику быстро переориентиров...Magecom UK Limited
 
Компьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingКомпьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingTatiana Volkova
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и DjangoTaras Lyapun
 
Caché Native Access. InterSystems Meetup 2014
Caché Native Access. InterSystems  Meetup 2014Caché Native Access. InterSystems  Meetup 2014
Caché Native Access. InterSystems Meetup 2014InterSystems
 
Yaremchuk - Drupal CodeLobster
Yaremchuk - Drupal CodeLobsterYaremchuk - Drupal CodeLobster
Yaremchuk - Drupal CodeLobsterAndrii Podanenko
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)Alexander Gornik
 
Command Line PLugin for IntelliJ IDEA
Command Line PLugin for IntelliJ IDEACommand Line PLugin for IntelliJ IDEA
Command Line PLugin for IntelliJ IDEASergey Karashevich
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language RuntimeGetDev.NET
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)Pavel Tsukanov
 
The basic design of the PHP language
 The basic design of the PHP language The basic design of the PHP language
The basic design of the PHP languageVladimir Burdaev
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
Лучшие практики на практике
Лучшие практики на практикеЛучшие практики на практике
Лучшие практики на практикеDenis Tuchin
 
Сущность библиотеки анализа кода VivaCore
Сущность библиотеки анализа кода VivaCoreСущность библиотеки анализа кода VivaCore
Сущность библиотеки анализа кода VivaCoreTatyanazaxarova
 

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

2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий
2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий
2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий
 
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
 
Дизайн больших приложений в ФП
Дизайн больших приложений в ФПДизайн больших приложений в ФП
Дизайн больших приложений в ФП
 
Масштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаМасштабируемая архитектура фронтенда
Масштабируемая архитектура фронтенда
 
Платформа .NET Core глазами PHP-разработчика
Платформа .NET Core глазами PHP-разработчикаПлатформа .NET Core глазами PHP-разработчика
Платформа .NET Core глазами PHP-разработчика
 
История одной трансформации: как Magento 1 разработчику быстро переориентиров...
История одной трансформации: как Magento 1 разработчику быстро переориентиров...История одной трансформации: как Magento 1 разработчику быстро переориентиров...
История одной трансформации: как Magento 1 разработчику быстро переориентиров...
 
Java 2 - Java Intro
Java 2 - Java IntroJava 2 - Java Intro
Java 2 - Java Intro
 
Компьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingКомпьютерная графика. Введение в Processing
Компьютерная графика. Введение в Processing
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и Django
 
Caché Native Access. InterSystems Meetup 2014
Caché Native Access. InterSystems  Meetup 2014Caché Native Access. InterSystems  Meetup 2014
Caché Native Access. InterSystems Meetup 2014
 
Yaremchuk - Drupal CodeLobster
Yaremchuk - Drupal CodeLobsterYaremchuk - Drupal CodeLobster
Yaremchuk - Drupal CodeLobster
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)
 
Command Line PLugin for IntelliJ IDEA
Command Line PLugin for IntelliJ IDEACommand Line PLugin for IntelliJ IDEA
Command Line PLugin for IntelliJ IDEA
 
Sivko
SivkoSivko
Sivko
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language Runtime
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
 
The basic design of the PHP language
 The basic design of the PHP language The basic design of the PHP language
The basic design of the PHP language
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Лучшие практики на практике
Лучшие практики на практикеЛучшие практики на практике
Лучшие практики на практике
 
Сущность библиотеки анализа кода VivaCore
Сущность библиотеки анализа кода VivaCoreСущность библиотеки анализа кода VivaCore
Сущность библиотеки анализа кода VivaCore
 

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

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