47
Аспектно-ориентированное программирование в PHP Лисаченко Александр, архитектор web-приложений Alpari- RU

Aspect-Oriented Programming in PHP

Embed Size (px)

DESCRIPTION

Presentation about aspect-oriented programming in PHP with Go! framework on DevConf-2013 conference.

Citation preview

Page 1: Aspect-Oriented Programming in PHP

Аспектно-ориентированное программирование в PHP

Лисаченко Александр, архитектор web-приложений Alpari-RU

Page 2: Aspect-Oriented Programming in PHP

О докладчике

Лисаченко Александр

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

направлениях PHP-разработки (highload, бизнес-приложения, веб-сервисы, соц. сети)

• Идеолог Symfony2: почти десяток внутренних сервисов на Symfony2, в т.ч. и основной сайт alpari.ru (CDN, Varnish+ESI, Twig, Assetic, ~60 сабмодулей, ~20 бандлов)Twitter: @lisachenko

Github: https://github.com/lisachenko

Page 3: Aspect-Oriented Programming in PHP

Эволюция технологий

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

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

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

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

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

???

Page 4: Aspect-Oriented Programming in PHP

Логические единицы кода

• Функции• Процедуры

Процедурное

• Модули

Модульное

• Классы• Методы• Свойства

ООП

Page 5: Aspect-Oriented Programming in PHP

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

Page 6: Aspect-Oriented Programming in PHP

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

Page 7: Aspect-Oriented Programming in PHP

Сквозная функциональность

Page 8: Aspect-Oriented Programming in PHP

Сквозная функциональность

Сквозная функцио- нальност

ь

Авторизация

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

Кэширование

Ведение логов

Page 9: Aspect-Oriented Programming in PHP

Управление авторизацией

Page 10: Aspect-Oriented Programming in PHP

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

Page 11: Aspect-Oriented Programming in PHP

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

Page 12: Aspect-Oriented Programming in PHP

Матрешка функциональности

Авто-ризаци

я

Логиро-ваниеОбра-ботка ошибо

к

Основ-ной код

Page 13: Aspect-Oriented Programming in PHP

Почему это плохо?

Плюсы:• Видна вся логика

метода

Минусы:• Код нельзя

использовать повторно

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

• запутанная логика• больше вероятность

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

• нарушение принципа DRY

Page 14: Aspect-Oriented Programming in PHP

Аспектное программирование

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

ООП

АОП

Page 15: Aspect-Oriented Programming in PHP

Аспектно-ориентированное программирование

АОП - методика программирования в рамках классовой парадигмы, основанная на понятии аспекта — блока кода, инкапсулирующего сквозное поведение в составе классов.

Page 16: Aspect-Oriented Programming in PHP

Аспектно-ориентированное программирование

Методология АОП была предложена группой инженеров исследовательского центра Xerox PARC под руководством Грегора Кичалеса (Gregor Kiczales).Ими же было разработано аспектно-ориентированное расширение для языка Java, получившее название AspectJ — (2001 год).

Page 17: Aspect-Oriented Programming in PHP

Аспектно-ориентированное программирование

АОП дает возможность вызвать дополнительный код (хук) в определенный момент работы программы: до выполнения метода, после выполнения метода, при обращении к свойству и другим без изменения исходного кода программы!

Page 18: Aspect-Oriented Programming in PHP

Ключевые понятия и термины

Аspect-Oriented Program-

ming

Joinpoint

Pointcut

Advice

Aspect

Introduction

Page 19: Aspect-Oriented Programming in PHP

Ключевые понятия и термины

Aspect

• Модуль или класс, реализующий сквозную функциональность.

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

Advice (совет)

• Дополнительная логика, которая должна быть вызвана из точки соединения

Page 20: Aspect-Oriented Programming in PHP

Ключевые понятия и термины

Joinpoint

• Точка в выполняемой программе, где следует применить совет

• Выполнение метода, обращение к свойствам объекта и др.

Pointcut (срез)

• Набор точек соединения. • Срез определяет, подходит

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

Page 21: Aspect-Oriented Programming in PHP

Пример: паттерн FluentInterface

Method execution joinpoint

Property access joinpoint

Page 22: Aspect-Oriented Programming in PHP

Пример: паттерн FluentInterface

Advice

Pointcut definition

Aspect class

Page 23: Aspect-Oriented Programming in PHP

Процесс вплетения кода

Перехват include/requir

e

Stream wrapper

(php://filter)

Статический анализ кода

(token_get_all)

TokenReflection

Анализ Pointcut-ов

Модификация исходного

кода

Page 24: Aspect-Oriented Programming in PHP

Пример: паттерн Fluent Interface

Around advice

Original methodOriginal method AOP

Page 25: Aspect-Oriented Programming in PHP

Фреймворк Go! AOP PHP• Не использует PHP-расширений, целиком написан на

самом PHP;• Может быть использован с любым приложением на

PHP;• Оптимизирован (ленивая загрузка ядра,

кэширование классов, поддержка опкод-кэшеров)• Не требует DI-контейнера для подмены сервисов

прокси-объектами;• Может перехватывать динамические и статические

методы, методы в финальных классах, а также методы в трейтах;

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

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

Page 26: Aspect-Oriented Programming in PHP

Срезы точек в Go! AOP PHP1. Выполнение методов

1. Динамических: execution(public Example->method(*))2. Статических: execution(public

**::*someStatic*Method*(*))3. Защищенных: execution(protected Ns\**\Example-

>protected*(*))4. С аннотацией: @annotation(First\Second\Annotation\

Class)2. Все методы в определенном классе

1. Конкретный класс: : within(Go\Aspects\Test)2. В указанном неймспейсе: within(Go\Aspects\*)3. Включая суб-неймспейсы: within(Go\Aspects\**)4. Потомки конкретного класса: within(DemoInterface+)

3. Обращение к свойствам1. Публичные: access(* Example\Aspect\*->property*)2. Защищенные: access(protected Test\Class*-

>protected*Property)4. Логические

1. ИЛИ : within(A) || within(B)2. И: within(A) && within(B)3. НЕ: !within(A)

Page 27: Aspect-Oriented Programming in PHP

Типажи (trait) в PHP – хорошо или плохо?

Хорошо Плохо

Проблема с тестированием

Нельзя динамически

изменить

Статическая зависимость

Множественное

наследование

Выносим общий код

Page 28: Aspect-Oriented Programming in PHP

Пример: trait + interface + AOP = Introduction

Introduction

• возможность динамически подключать интерфейсы и типажи к конкретному классу.

Page 29: Aspect-Oriented Programming in PHP

Пример: trait + interface + AOP = Introduction

Исходный класс•Обратите внимание, что мы не имплементриуем интерфейсов и не подключаем типажи в исходном классе.

Page 30: Aspect-Oriented Programming in PHP

Пример: trait + interface + AOP = Introduction

Класс после вплетения кода•К классу был добавлен динамически заданный интерфейс и типаж

Page 31: Aspect-Oriented Programming in PHP

Пример: логирование на уровне приложения

Page 32: Aspect-Oriented Programming in PHP
Page 33: Aspect-Oriented Programming in PHP

Пример: логирование на уровне приложения

Page 34: Aspect-Oriented Programming in PHP

За и против глобальных срезов

За•Позволяет сделать срез в любом коде, даже стороннем•Легко описать нужный неймспейс•Быстрота внедрения•Не нужно менять исходный код вообще

Против•Action at a distance – непредсказуемые эффекты в коде методов•Цепляет и нужное и ненужное•Может немного замедлить приложение из-за большого количества точек•Высока вероятность допустить ошибку

Page 35: Aspect-Oriented Programming in PHP
Page 36: Aspect-Oriented Programming in PHP
Page 37: Aspect-Oriented Programming in PHP

Пример: логирование на уровне приложения

Page 38: Aspect-Oriented Programming in PHP

Контроллируемые срезы

За•Используются стандартная технология интерфейсов-маркеров и срез within(InterfaceName+)•Используются наглядные аннотации-маркеры перед методами и срез @annotation(ClassName)•Влияют только на указанный разработчиком код (ожидаемое поведение)

Против•Необходимо вносить небольшие правки в исходный код•Ограниченная возможность работать с сторонним кодом

Page 39: Aspect-Oriented Programming in PHP

Проблема с доступом к состоянию объекта

1. Как вы уже наверное поняли, основное достоинство настоящего АОП – это возможность дополнять логику методов или целого класса дополнительным функционалом без изменения исходного кода.

2. Но класс аспекта является внешним по отношению к классу перехватываемого объекта, а значит, мы можем пользоваться только публичными данными объекта, а что делать если нужно обратиться к приватным или защищенным полям или методам объекта?

Page 40: Aspect-Oriented Programming in PHP

Привилегированные советы

Привилеги-

рованный совет

• Совет (метод) в классе аспекта, который выполняется в области видимости текущего объекта и имеет доступ к приватным и защищенным полям и методам класса

Page 41: Aspect-Oriented Programming in PHP

Попробуем считать поле $name в совете

Page 42: Aspect-Oriented Programming in PHP

Обычный совет работает согласно scope

Page 43: Aspect-Oriented Programming in PHP

Привилегированный совет

Page 44: Aspect-Oriented Programming in PHP

Привилегированный совет в scope объекта

Page 45: Aspect-Oriented Programming in PHP

АОП – следующий шаг в развитии PHP

ООП

Абстракция сервисов (yaml, xml,

php)

Внедрение зависи-мостей

(IoC, DIC)

Аспектно-ориентиро-

ванное программи-рование

Page 46: Aspect-Oriented Programming in PHP

AOP: за и против

За•Управление сквозной функциональностью•Снижение стоимости разработки•Более прозрачный код логики•Уменьшение шаблонных ошибок•Уменьшение связанности классов•Повторное использование кода

Против•Порог вхождения•Неявные эффекты•Ограниченная помощь IDE•Незначительное снижение скорости выполнения кода

Page 47: Aspect-Oriented Programming in PHP

Благодарю за внимание!Go! AOP PHP: https://github.com/lisachenko/go-aop-php

Official site: http://go.aopphp.com

ZendFramework2 demo: http://zf2.aopphp.com/?aspect