Опыт работы во всех основных направлениях PHP-разработки (highload, бизнес- приложения, веб-сервисы, соц. сети) • Идеолог Symfony2: почти десяток внутренних сервисов на Symfony2, в т.ч. и основной сайт alpari.ru (CDN, Varnish+ESI, Twig, Assetic, ~60 сабмодулей, ~20 бандлов) Twitter: @lisachenko Github: https://github.com/lisachenko
• Код нельзя использовать повторно • трудно понять исходное предназначение класса • запутанная логика • больше вероятность допустить ошибку, забыв вписать «шаблонный» код • нарушение принципа DRY
Xerox PARC под руководством Грегора Кичалеса (Gregor Kiczales). Ими же было разработано аспектно- ориентированное расширение для языка Java, получившее название AspectJ — (2001 год).
определенный момент работы программы: до выполнения метода, после выполнения метода, при обращении к свойству и другим без изменения исходного кода программы!
сквозную функциональность. • Аспект изменяет поведение остального кода, применяя совет в точках соединения, определённых некоторым срезом Advice (совет) • Дополнительная логика, которая должна быть вызвана из точки соединения
где следует применить совет • Выполнение метода, обращение к свойствам объекта и др. Pointcut (срез) • Набор точек соединения. • Срез определяет, подходит ли данная точка соединения к данному совету
на самом PHP; • Может быть использован с любым приложением на PHP; • Оптимизирован (ленивая загрузка ядра, кэширование классов, поддержка опкод-кэшеров) • Не требует DI-контейнера для подмены сервисов прокси- объектами; • Может перехватывать динамические и статические методы, методы в финальных классах, а также методы в трейтах; • Может перехватывать обращения к публичным и защищенным полям; • Чистый генерируемый код, удобно проводить отладку классов и аспектов с помощью XDebug
любом коде, даже стороннем •Легко описать нужный неймспейс •Быстрота внедрения •Не нужно менять исходный код вообще Против •Action at a distance – непредсказуемые эффекты в коде методов •Цепляет и нужное и ненужное •Может немного замедлить приложение из-за большого количества точек •Высока вероятность допустить ошибку
within(InterfaceName+) •Используются наглядные аннотации-маркеры перед методами и срез @annotation(ClassName) •Влияют только на указанный разработчиком код (ожидаемое поведение) Против •Необходимо вносить небольшие правки в исходный код •Ограниченная возможность работать с сторонним кодом
наверное поняли, основное достоинство настоящего АОП – это возможность дополнять логику методов или целого класса дополнительным функционалом без изменения исходного кода. 2. Но класс аспекта является внешним по отношению к классу перехватываемого объекта, а значит, мы можем пользоваться только публичными данными объекта, а что делать если нужно обратиться к приватным или защищенным полям или методам объекта?
разработки •Более прозрачный код логики •Уменьшение шаблонных ошибок •Уменьшение связанности классов •Повторное использование кода Против •Порог вхождения •Неявные эффекты •Ограниченная помощь IDE •Незначительное снижение скорости выполнения кода