Creating Clean Code with AOP

33
/** * 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

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 of Creating Clean Code with AOP

Page 1: Creating Clean Code with AOP

/** * 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

Page 2: Creating Clean Code with AOP

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

Page 3: Creating Clean Code with AOP

= PHP 5.3 Full Stack Application Framework

Mittwoch, 13. Oktober 2010

Page 4: Creating Clean Code with AOP

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

Page 5: Creating Clean Code with AOP

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

Page 6: Creating Clean Code with AOP

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

Page 7: Creating Clean Code with AOP

Create Clean Code with AOP International PHP Conference, Mainz 2010

AOPMittwoch, 13. Oktober 2010

Page 8: Creating Clean Code with AOP

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

Page 9: Creating Clean Code with AOP

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

Page 10: Creating Clean Code with AOP

Create Clean Code with AOP International PHP Conference, Mainz 2010

Concerns?

Mittwoch, 13. Oktober 2010

Page 11: Creating Clean Code with AOP

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

Page 12: Creating Clean Code with AOP

Create Clean Code with AOP International PHP Conference, Mainz 2010

Cross-Cutting ConcernsLogging

Security

Persistence

Global Business Logic

Dirty Hacks

Mittwoch, 13. Oktober 2010

Page 13: Creating Clean Code with AOP

Create Clean Code with AOP International PHP Conference, Mainz 2010

We don't want infrastructure codein our models.

Mittwoch, 13. Oktober 2010

Page 14: Creating Clean Code with AOP

Create Clean Code with AOP International PHP Conference, Mainz 2010

We want to unit-test even cross-cutting concerns

Mittwoch, 13. Oktober 2010

Page 15: Creating Clean Code with AOP

Create Clean Code with AOP International PHP Conference, Mainz 2010

We want to centralize security-related code

Mittwoch, 13. Oktober 2010

Page 16: Creating Clean Code with AOP

Create Clean Code with AOP International PHP Conference, Mainz 2010

AOP Lingo

Mittwoch, 13. Oktober 2010

Page 17: Creating Clean Code with AOP

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

Page 18: Creating Clean Code with AOP

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

Page 19: Creating Clean Code with AOP

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

Page 20: Creating Clean Code with AOP

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

Page 21: Creating Clean Code with AOP

Inspiring people toshareHitchhiker's Guide to FLOW3

DEMO

Mittwoch, 13. Oktober 2010

Page 22: Creating Clean Code with AOP

Inspiring people toshareHitchhiker's Guide to FLOW3

Kinds of AdviceAdvice types supported by FLOW3:

@before@afterreturning@afterthrowing@after@around

Mittwoch, 13. Oktober 2010

Page 23: Creating Clean Code with AOP

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

Page 24: Creating Clean Code with AOP

Inspiring people toshareHitchhiker's Guide to FLOW3

Runtime Evaluationsevaluate(coffee.kind == "Arabica")

Mittwoch, 13. Oktober 2010

Page 25: Creating Clean Code with AOP

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

Page 26: Creating Clean Code with AOP

Inspiring people toshareHitchhiker's Guide to FLOW3

DEMO

Mittwoch, 13. Oktober 2010

Page 27: Creating Clean Code with AOP

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

Page 28: Creating Clean Code with AOP

Inspiring people toshareHitchhiker's Guide to FLOW3

Mittwoch, 13. Oktober 2010

Page 29: Creating Clean Code with AOP

Inspiring people toshareHitchhiker's Guide to FLOW3

Mittwoch, 13. Oktober 2010

Page 30: Creating Clean Code with AOP

Create Clean Code with AOP International PHP Conference, Mainz 2010

Progress

FLOW3 1.0.0

Mittwoch, 13. Oktober 2010

Page 31: Creating Clean Code with AOP

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

Page 32: Creating Clean Code with AOP

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

Page 33: Creating Clean Code with AOP

Mittwoch, 13. Oktober 2010