Upload
robert-lemke
View
591
Download
0
Tags:
Embed Size (px)
DESCRIPTION
OOP helps us creating a clearly laid out and intuitive model of the reality by means of objects. However, concerns like security, logging or transactions need to be implemented virtually anywhere, resulting in scattered error-prone code. Aspect-Oriented Programming separates these cross-cutting concerns from the rest of the code and lets you handle them in a well-known, central location.
Citation preview
/** * Security Aspect
* @aspect */class SecurityAspect {
protected $policies;
International PHP Conference, Mainz 2010
Robert Lemke
Create Clean Code with Aspect-Oriented Programming
Mittwoch, 13. Oktober 2010
Robert Lemkechief architect of TYPO3 Phoenix and FLOW3
co-founder of the TYPO3 Association
34 years old
lives in Lübeck, Germany
1 wife, 1 daughter, 1 espresso machine
likes drumming
Mittwoch, 13. Oktober 2010
= PHP 5.3 Full Stack Application Framework
Mittwoch, 13. Oktober 2010
OOP Object-Oriented Programming
AOP Aspect-Oriented Programming
MVC Model View Controller
POPO Plain Old PHP Object
DI Dependency Injection DRY
YAGNI
CoC
TDD
YAA
Mittwoch, 13. Oktober 2010
Create Clean Code with AOP International PHP Conference, Mainz 2010
/** * Creates a new post * * @param \F3\Blog\Domain\Model\Post $newPost A fresh Post object which has not yet been * added to the repository * @return void */public function createAction(\F3\Blog\Domain\Model\Post $newPost) { if ($this->policyService->isGranted($this->currentUser, __CLASS__, __METHOD__) { $this->blog->addPost($newPost); $this->flashMessageContainer->add('Your new post was created.'); $this->systemLogger->log('A new post was created.', LOG_INFO); $this->notificationService->notify('A new post was created.', '[email protected]'); } else { $this->systemLogger->log('Someone tried to create a post.', LOG_WARNING); throw new \F3\FLOW3\Security\Exception\AccessDeniedException('Tried to create.'); } $this->redirect('index');}
Mittwoch, 13. Oktober 2010
Create Clean Code with AOP International PHP Conference, Mainz 2010
/** * Creates a new post * * @param \F3\Blog\Domain\Model\Post $newPost A fresh Post object which has not yet been * added to the repository * @return void */public function createAction(\F3\Blog\Domain\Model\Post $newPost) { if ($this->policyService->isGranted($this->currentUser, __CLASS__, __METHOD__) { $this->blog->addPost($newPost); $this->flashMessageContainer->add('Your new post was created.'); $this->systemLogger->log('A new post was created.', LOG_INFO); $this->notificationService->notify('A new post was created.', '[email protected]'); } else { $this->systemLogger->log('Someone tried to create a post.', LOG_WARNING); throw new \F3\FLOW3\Security\Exception\AccessDeniedException('Tried to create.'); } $this->redirect('index');}
Mittwoch, 13. Oktober 2010
Create Clean Code with AOP International PHP Conference, Mainz 2010
AOPMittwoch, 13. Oktober 2010
Create Clean Code with AOP International PHP Conference, Mainz 2010
Aspect-Oriented Programmingprogramming paradigm
separates concerns to improve modularization
OOP modularizes concerns into objects
AOP modularizes cross-cutting concerns into aspects
Mittwoch, 13. Oktober 2010
Create Clean Code with AOP International PHP Conference, Mainz 2010
/** * Creates a new post * * @param \F3\Blog\Domain\Model\Post $newPost A fresh Post object which has not yet been * added to the repository * @return void */public function createAction(\F3\Blog\Domain\Model\Post $newPost) { $this->blog->addPost($newPost); $this->flashMessageContainer->add('Your new post was created.'); $this->redirect('index');}
Mittwoch, 13. Oktober 2010
Create Clean Code with AOP International PHP Conference, Mainz 2010
Concerns?
Mittwoch, 13. Oktober 2010
Create Clean Code with AOP International PHP Conference, Mainz 2010
ConcernsSeparation of Concerns
group features and behavior into manageable parts
have a specific purpose and business to take care of
Cross-Cutting Concerns
are the party poopers who want to have a say in everything
Mittwoch, 13. Oktober 2010
Create Clean Code with AOP International PHP Conference, Mainz 2010
Cross-Cutting ConcernsLogging
Security
Persistence
Global Business Logic
Dirty Hacks
Mittwoch, 13. Oktober 2010
Create Clean Code with AOP International PHP Conference, Mainz 2010
We don't want infrastructure codein our models.
Mittwoch, 13. Oktober 2010
Create Clean Code with AOP International PHP Conference, Mainz 2010
We want to unit-test even cross-cutting concerns
Mittwoch, 13. Oktober 2010
Create Clean Code with AOP International PHP Conference, Mainz 2010
We want to centralize security-related code
Mittwoch, 13. Oktober 2010
Create Clean Code with AOP International PHP Conference, Mainz 2010
AOP Lingo
Mittwoch, 13. Oktober 2010
Create Clean Code with AOP International PHP Conference, Mainz 2010
AspectPart of the application where cross-cutting concerns are implemented
In FLOW3 aspects are classes annotated with @aspect
Mittwoch, 13. Oktober 2010
Create Clean Code with AOP International PHP Conference, Mainz 2010
Join PointIs a single point in the call graph
Method Execution
Exception
Represents an event, not a location
Mittwoch, 13. Oktober 2010
Create Clean Code with AOP International PHP Conference, Mainz 2010
PointcutA set of join points where advices could be executed
can be composed
can be named
Mittwoch, 13. Oktober 2010
Create Clean Code with AOP International PHP Conference, Mainz 2010
AdviceAction to take at a join points defined by the point cut
Mittwoch, 13. Oktober 2010
Inspiring people toshareHitchhiker's Guide to FLOW3
DEMO
Mittwoch, 13. Oktober 2010
Inspiring people toshareHitchhiker's Guide to FLOW3
Kinds of AdviceAdvice types supported by FLOW3:
@before@afterreturning@afterthrowing@after@around
Mittwoch, 13. Oktober 2010
Inspiring people toshareHitchhiker's Guide to FLOW3
Pointcut Designatorsmethod(F3\MyPackage\MyClass->myMethod())class(F3\MyPackage\MyClass)within(F3\MyPackage\MyInterface)classTaggedWith(someTag)methodTaggedWith(anotherTag)setting(Demo.Stuff.SomeSetting = "yeah, do it")ffiilter(F3\MyPackage\MyCustomFilterImplementation)
Mittwoch, 13. Oktober 2010
Inspiring people toshareHitchhiker's Guide to FLOW3
Runtime Evaluationsevaluate(coffee.kind == "Arabica")
Mittwoch, 13. Oktober 2010
Inspiring people toshareHitchhiker's Guide to FLOW3
Compound Pointcuts
! /**! * @around method(.*Controller->(new|create|edit|update|delete)Action()) && ⏎ !methodTaggedWith(anybodyMayAccessThis)! */! public function interceptMethodCalls($joinPoint) {
...}
Mittwoch, 13. Oktober 2010
Inspiring people toshareHitchhiker's Guide to FLOW3
DEMO
Mittwoch, 13. Oktober 2010
Inspiring people toshareHitchhiker's Guide to FLOW3
FLOW3's AOP implementationbased on proxy classes
unlike with most pre-processors line numbers stay the same
no scaffolding
0 Lines of generated code which need to be maintained by you
fast (on the second hit)
Mittwoch, 13. Oktober 2010
Inspiring people toshareHitchhiker's Guide to FLOW3
Mittwoch, 13. Oktober 2010
Inspiring people toshareHitchhiker's Guide to FLOW3
Mittwoch, 13. Oktober 2010
Create Clean Code with AOP International PHP Conference, Mainz 2010
Progress
FLOW3 1.0.0
Mittwoch, 13. Oktober 2010
Create Clean Code with AOP International PHP Conference, Mainz 2010
Further ReadingFLOW3 Websitehttp://flow3.typo3.org
FLOW3 Downloadhttp://flow3.typo3.org/downloadgit://git.typo3.org/FLOW3/Distributions/Base.git
TYPO3 Forgehttp://forge.typo3.org
Further Readinghttp://flow3.typo3.org/about/principles/further-reading
Mittwoch, 13. Oktober 2010
Create Clean Code with AOP International PHP Conference, Mainz 2010
Questions
Email: [email protected]: http://robertlemke.de/blogTwitter: @t3rob
Slides: http://slideshare.net/rlmp
Mittwoch, 13. Oktober 2010
Mittwoch, 13. Oktober 2010