creating clean code with aop (t3con10)
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.TRANSCRIPT
![Page 1: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/1.jpg)
/** * Security Aspect
* @aspect */class SecurityAspect {
protected $policies;
T3CON10 Frankfurt
Robert Lemke
Create Clean Code with Aspect-Oriented Programming
Samstag, 2. Oktober 2010
![Page 2: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/2.jpg)
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
Samstag, 2. Oktober 2010
![Page 3: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/3.jpg)
= PHP 5.3 Full Stack Application Framework
Samstag, 2. Oktober 2010
![Page 4: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/4.jpg)
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
Samstag, 2. Oktober 2010
![Page 5: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/5.jpg)
Create Clean Code with AOP T3CON10 Frankfurt
/** * 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');}
Samstag, 2. Oktober 2010
![Page 6: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/6.jpg)
Create Clean Code with AOP T3CON10 Frankfurt
/** * 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');}
Samstag, 2. Oktober 2010
![Page 7: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/7.jpg)
Create Clean Code with AOP T3CON10 Frankfurt
AOPSamstag, 2. Oktober 2010
![Page 8: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/8.jpg)
Create Clean Code with AOP T3CON10 Frankfurt
Aspect-Oriented Programmingprogramming paradigm
separates concerns to improve modularization
OOP modularizes concerns into objects
AOP modularizes cross-cutting concerns into aspects
Samstag, 2. Oktober 2010
![Page 9: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/9.jpg)
Create Clean Code with AOP T3CON10 Frankfurt
/** * 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');}
Samstag, 2. Oktober 2010
![Page 10: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/10.jpg)
Create Clean Code with AOP T3CON10 Frankfurt
Concerns?
Samstag, 2. Oktober 2010
![Page 11: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/11.jpg)
Create Clean Code with AOP T3CON10 Frankfurt
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
Samstag, 2. Oktober 2010
![Page 12: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/12.jpg)
Create Clean Code with AOP T3CON10 Frankfurt
Cross-Cutting ConcernsLogging
Security
Persistence
Global Business Logic
Dirty Hacks
Samstag, 2. Oktober 2010
![Page 13: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/13.jpg)
Create Clean Code with AOP T3CON10 Frankfurt
We don't want infrastructure codein our models.
Samstag, 2. Oktober 2010
![Page 14: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/14.jpg)
Create Clean Code with AOP T3CON10 Frankfurt
We want to unit-test even cross-cutting concerns
Samstag, 2. Oktober 2010
![Page 15: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/15.jpg)
Create Clean Code with AOP T3CON10 Frankfurt
We want to centralize security-related code
Samstag, 2. Oktober 2010
![Page 16: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/16.jpg)
Create Clean Code with AOP T3CON10 Frankfurt
AOP Lingo
Samstag, 2. Oktober 2010
![Page 17: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/17.jpg)
Create Clean Code with AOP T3CON10 Frankfurt
AspectPart of the application where cross-cutting concerns are implemented
In FLOW3 aspects are classes annotated with @aspect
Samstag, 2. Oktober 2010
![Page 18: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/18.jpg)
Create Clean Code with AOP T3CON10 Frankfurt
Join PointIs a single point in the call graph
Method Execution
Exception
Represents an event, not a location
Samstag, 2. Oktober 2010
![Page 19: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/19.jpg)
Create Clean Code with AOP T3CON10 Frankfurt
PointcutA set of join points where advices could be executed
can be composed
can be named
Samstag, 2. Oktober 2010
![Page 20: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/20.jpg)
Create Clean Code with AOP T3CON10 Frankfurt
AdviceAction to take at a join points defined by the point cut
Samstag, 2. Oktober 2010
![Page 21: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/21.jpg)
Inspiring people toshareHitchhiker's Guide to FLOW3
DEMO
Samstag, 2. Oktober 2010
![Page 22: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/22.jpg)
Inspiring people toshareHitchhiker's Guide to FLOW3
Kinds of AdviceAdvice types supported by FLOW3:
@before@afterreturning@afterthrowing@after@around
Samstag, 2. Oktober 2010
![Page 23: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/23.jpg)
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)
Samstag, 2. Oktober 2010
![Page 24: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/24.jpg)
Inspiring people toshareHitchhiker's Guide to FLOW3
Runtime Evaluationsevaluate(coffee.kind == "Arabica")
Samstag, 2. Oktober 2010
![Page 25: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/25.jpg)
Inspiring people toshareHitchhiker's Guide to FLOW3
Compound Pointcuts
! /**! * @around method(.*Controller->(new|create|edit|update|delete)Action()) && ⏎ !methodTaggedWith(anybodyMayAccessThis)! */! public function interceptMethodCalls($joinPoint) {
...}
Samstag, 2. Oktober 2010
![Page 26: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/26.jpg)
Inspiring people toshareHitchhiker's Guide to FLOW3
DEMO
Samstag, 2. Oktober 2010
![Page 27: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/27.jpg)
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)
Samstag, 2. Oktober 2010
![Page 28: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/28.jpg)
Inspiring people toshareHitchhiker's Guide to FLOW3
Samstag, 2. Oktober 2010
![Page 29: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/29.jpg)
Inspiring people toshareHitchhiker's Guide to FLOW3
Samstag, 2. Oktober 2010
![Page 30: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/30.jpg)
Create Clean Code with AOP T3CON10 Frankfurt
Progress
FLOW3 1.0.0
Samstag, 2. Oktober 2010
![Page 31: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/31.jpg)
Create Clean Code with AOP T3CON10 Frankfurt
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
Samstag, 2. Oktober 2010
![Page 32: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/32.jpg)
Create Clean Code with AOP T3CON10 Frankfurt
Questions
Email: [email protected]: http://robertlemke.de/blogTwitter: @t3rob
Slides: http://slideshare.net/rlmp
Samstag, 2. Oktober 2010
![Page 33: Creating Clean Code with AOP (T3CON10)](https://reader034.vdocuments.us/reader034/viewer/2022042601/555a8d80d8b42abb628b5341/html5/thumbnails/33.jpg)
Samstag, 2. Oktober 2010