Аспектно Ориентированное Программирование в PHP Щеваев Павел pachanga (pacha.shevaev@gmail.com) BIT, г.Пенза, Разработчик Limb PHP Framework.

Презентация:



Advertisements
Похожие презентации
Аспектно-ориентированное программирование. Сквозная функциональность Ведение журналовАвторизация Модуль оформления заказов Модуль принятия товаров.
Advertisements

Аспектно-ориентированное программирование Copyright © Мигинский Д.С.,
Что нового в PHP 5.3Что нового в PHP 5.3Почему PHP 5.3? PHP 5.2 существует уже 1.5 года. В нем найдено несколько серьезных ошибок, которые не могут быть.
Расширение функциональности с использованием метаданных и аспектно-ориентированного программирования Александр Межов ОАО ЧЭМК
Аспектно-ориентированный подход на службе веб- приложений Цытович Павел Леонидович Fuse8, Южно-Уральский государственный университет
Что нового в PHP 5.3 Дмитрий Стогов.
Обзор возможностей Инверсия управления Аспектно-ориентированное программирование.
Автоматическая генерация кода программ с явным выделением состояний Канжелев С.Ю. магистрант СПбГУ ИТМО Шалыто А.А. доктор технических наук профессор СПбГУ.
Объектно – ориентированное программирование (ООП) Артишевская Юлия, 222 группа Артишевская Юлия, 222 группа.
Software engineering Дмитриев Андрей Владиславович ©
Обзор возможностей Инверсия управления Аспектно-ориентированное программирование.
Программа повышения квалификации «Системное программирование» Приоритетное направление модернизации и технологического развития экономики России - Стратегические.
1.Введение 2.Немного теории a.Концептуальная диаграмма b.Суть фреймворка c.Как это работает 3.Пример: IT Developers v1 4.Actionscript 3 [Multicore version]
Triggers для mysql. Что есть триггер? Триггер - это хранимая процедура особого типа, исполнение которой обусловлено наступлением определенного события.
Объектно- ориентированный подход к моделированию систем.
Полиморфизм Полиморфизм (polymorphism) - последний из трех "китов", на которых держится объектно-ориентированное программирование Слово это можно перевести.
©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
1 Java 6. ИНТЕРФЕЙСЫ И ВНУТРЕННИЕ КЛАССЫ. 2 Интерфейсы Не являются классами Ни один из объявленных методов не может быть реализован внутри интерфейса.
Архитектура, возможности и методы использования платформы облачных вычислений Microsoft Windows Azure Лекция 3 Основные концепции и архитектура Microsoft.
Подготовка компьютера к практической работе на языке Java Первый этап: установка платформы языка Второй этап: установка редактора.
Транксрипт:

Аспектно Ориентированное Программирование в PHP Щеваев Павел pachanga BIT, г.Пенза, Разработчик Limb PHP Framework

Как жаль, что мы не живем в идеальном мире!

+ = Любовь и гармония…

Бесплатное пиво…

Поддержка namespace в PHP…

…и closures

class NewsController extends Controller { function create(){ $news = new News(); $news->setDate($this->request->get('date')); $news->setContent($this->request->get('content')); $news->save(); } Простая и понятная бизнес логика

Что является помехой? (Сквозной функционал)(Сквозной функционал) C ro s s c ut t ing C o n c e r n s

class NewsController extends Controller { function create(){ $ctx = AppContext :: instance(); if($ctx->isUserAuthorized()) { $news = new News(); $news->setDate($this->request->get('date')); $news->setContent($this->request->get('content')); $ctx->startTransaction(); try { $news->save(); $ctx->commitTransaction(); $ctx->log("News created successfully"); } catch(ValidationException $e) { $ctx->rollbackTransaction(); $ctx->log("News validation error"); throw $e; } else { throw new AuthException(); $ctx->log("Operation is not permitted"); }

Лоскутное одеяло сквозного функционала

АОП спешит на помощь

class NewsController extends Controller { function create(){ $news = new News(); $news->setDate($this->request->get('date')); $news->setContent($this->request->get('content')); $news->save(); } Простая и понятная бизнес логика - 2.0

aspect Authentication{ pointcut controllerCreate:exec(public *Controller::create()); around(): controllerCreate{ $ctx = AppContext :: instance(); if($ctx->isUserAuthorized())) { proceed(); } else { $ctx->log("Operation is not permitted"); throw new AuthException(); } Аспект авторизации

aspect Transaction{ pointcut save:call(public News->save()); around(): save{ $ctx = AppContext :: instance(); $ctx->startTransaction(); try { proceed(); } catch (ValidationException $e) { $ctx->rollbackTransaction(); $ctx->log("News validation error"); throw $e; } Аспект транзакции

aspect Logging{ pointcut save:call(public News->save()); after(): save{ $ctx = AppContext :: instance(); $ctx->log("News created successfully"); } Аспект журналирования

Диаграмма последовательности 1 2 3

Непонятно? Немного теории (совсем чуть-чуть, честно!)

Введение в АОП AspectJ( – lingua franca в мире АОП Gregor Kiczales + команда XEROX PARC + желание облегчить нам жизнь = AspectJ

Базовые понятия JoinPoint PointCut Advice Introduction Aspect Weaving

JointPoint JoinPoint - фундаментальное понятие АОП, под которым понимают любую четко идентифицируемую точку исполнения программы JoinPoint точки являются кандидатами возможной инъекции сквозного функционала

JoinPoint Возможные JointPoint точки в примере: –выполнение метода credit() –доступ к атрибуту balance class Account { function credit($amount) { $this->balance += $amount; } 1 2

PointCut PointCut – набор(срез) JoinPoint точек, удовлетворяющих определенному условию. PointCut бывают именованные и анонимные. PointCut – это некое подобие SQL запроса для JointPoint точек –Пример анонимного среза, захватывающего исполнение метода Account :: credit() exec(Account::credit(*))

Advice Advice - код, выполняемый для каждой JoinPoint точки, входящей в определённый PointCut. Advice может выполняться до (before), после (after) или вместо (around) JoinPoint точки. Advice схож с традиционным ООП методом

Advice Пример Advice метода для анонимного PointCut среза before(): exec(Account::credit(*)) { echo("Сейчас будет выполнен метод credit"); } Пример Advice метода для именованного PointCut среза poincut credit : exec(Account::credit(*)) before(): credit { echo("Сейчас будет выполнен метод credit"); }

Introduction Introduction – инструкция для изменения статической структуры классов, интерфейсов и аспектов. –Попробуем добавить метод setLog() во все классы, которые начинаются со строкиFoo public function Foo*::setLog(Log $log){ $log->setLevel(Log::ALL); $this->log = $log; }

Aspect Aspect - модуль в терминах АОП, некоторый аналог класса, который инкапсулирует в себе правила применения сквозного функционала. Aspect - конечный контейнер для всех АОП элементов: PointCut, Advice и Introduction. Aspect схож с ООП классом (также позволяет объявлять и использовать обычные методы и атрибуты)

Aspect Пример аспекта(объединяем все вместе) aspect ExampleAspect { before(): exec(Account::credit(*)) { echo("Сейчас будет выполнен метод credit"); }

Weaving Weaving – процесс «вплетения» аспектов в логику приложения. Weaving процесс может происходить на уровне исходных кодов или же на уровне виртуальной машины (в случае PHP, это уровень исполнения opcode инструкций).

АОП - вид сверху (или сбоку?) Процесс разбиения функциональных требований на аспекты с их последующим сплетением в конечный код приложения

Фух...с теорией покончено

Средства АОП для PHP phpAspect – юная, но наиболее перспективная реализация АОП для PHP –Интересная попытка клонировать AspectJ –Аспекты вплетаются статически в код –Автор Willliam Candillon aoPHP – некое подобие АОП –Аспекты вплетаются «на лету» –Замороченный способ использования: Apache -> mod_rewrite -> aoPHP C++ интерпретатор -> PHP …бр-р-р) aspectPHP – форк aoPHP –Не обновлялась с 2005 г –Работает только с PHP AOP Library for PHP – спорная эмуляция АОП средствами PHP, –Автор некто Dmitry Sheiko runkit – PECL модуль, предоставляющий AOP Introduction возможности –Переопределение констант, функций, методов, классов, интерфейсов –Эх, жаль, что не в core –Автор Sara Golemon

# pecl install -f Parse_Tree # pear install PHP_Beautifier # pear install Console_GetOpt Установка:

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

$ php phpaspect.php $ php phpaspect.php –d src src bin Базовое использование:

АОП поддержка: –PointCut –Advice –Introduction –Aspect см. раздаточный материал за подробностями

HelloWorld (ну куда же без него) $ php hello.php Hello! src/hello.php

Пример аспекта src/trace.aspect.php

В действии $ php phpaspect.php src src bin $ php bin/hello.php After a construction of HelloWorld Before a saying of HelloWorld Around a saying of HelloWorld Hello! end around After a saying of HelloWorld Вплетение аспектов Выполнение переплетенного кода

« За кулисами» …

$phpaspect_56 = &$hello; $phpaspect_56 = $phpaspect_70; $phpaspect_87 = &$hello; if (isCallType($phpaspect_87, '*', 'say', 'say')) { $thisJoinPoint = new CallJoinPoint('', __LINE__, __FILE__, array(), $phpaspect_87, 'say'); function __phpaspectff f7e637a085e06b4bef62($thisJoinPoint) { echo "Before a saying of ". get_class($thisJoinPoint->getTarget()). "\n"; unset($thisJoinPoint); } __phpaspectff f7e637a085e06b4bef62($thisJoinPoint); } if (isCallType($phpaspect_87, '*', 'say', 'say')) { $thisJoinPoint = new CallJoinPoint('', __LINE__, __FILE__, array(), $phpaspect_87, 'say'); echo "Around a saying of ". get_class($thisJoinPoint->getTarget()). "\n"; $res = $phpaspect_87->say(); echo "\nend around\n"; $__return_result = $res; unset($thisJoinPoint); } else { $phpaspect_104 = &$phpaspect_87->say(); $__return_result = $phpaspect_104; }

Yikes! $phpaspect_104 = $__return_result; if (isCallType($phpaspect_87, '*', 'say', 'say')) { $thisJoinPoint = new CallJoinPoint('', __LINE__, __FILE__, array(), $phpaspect_87, 'say'); function __phpaspecte2600e1d66b7ca11ec71f56332b62ade($thisJoinPoint) { echo "After a saying of ". get_class($thisJoinPoint->getTarget()). "\n"; unset($thisJoinPoint); } __phpaspecte2600e1d66b7ca11ec71f56332b62ade($thisJoinPoint); } $phpaspect_104; ?>

Достоинства –Это сделали для PHP! –Наиболее схожая с AspectJ функциональность

Недостатки –На данный момент не подходит для production – некоторые аспекты вплетаются с ошибками (хотя чего мы хотим от версии 0.1.1?) –Функционально неполная реализация АОП (работа с аннотациями, расстановка приоритетов применения аспектов, наследование аспектов и проч.) –Генерируемый код накладывает негативный отпечаток на скорость работы

АОП – еще одна «серебряная пуля»? Конечно же нет, такой «пули не существует» Естественно есть ярые фанаты и отчаянные противники АОП –АОП, в самом деле, позволяет посмотреть на проблему сквозного функционала на качественно ином уровне –В то же время АОП местами нетривиальная и непрозрачная методология Как всегда, истина где-то посередине

АОП - достоинства Эффективно адресует проблему сквозного функционала Облегчает повторное использование кода - слабо связанные между собой аспекты легко взаимозаменять Позволяет отложить принятие спорного решения, касающегося работы всего приложения, на «потом»

АОП - недостатки Неочевидность происходящего (слишком много магии). Аспекты сложно (невозможно?) протестировать отдельно от сплетенного кода. Требуются отличные от ООП паттерны проектирования аспектов

«А оно вообще надо?» - решать исключительно вам :-)

Ссылки по теме AspectJ – phpAspect – aoPHP - aspectPHP - AOP Library for PHP - :// PECL runkit –

Вопросы?