Slide 1

Slide 1 text

PROGRAMOWANIE ASPEKTOWE PHP W MARIUSZ GIL PHPCON POLAND 2012

Slide 2

Slide 2 text

O MNIE architekt, tech-lead developer, speaker

Slide 3

Slide 3 text

dlaczeg ? ASPEKTY

Slide 4

Slide 4 text

celem tej prezentacji jest...

Slide 5

Slide 5 text

INCEPCJA

Slide 6

Slide 6 text

PROGRAMOWANIE czy lubicie ?

Slide 7

Slide 7 text

JEZYK PHP czy lubicie ? ,

Slide 8

Slide 8 text

SPAGHETTI a lubicie ?

Slide 9

Slide 9 text

class UserService { //... public function delete($user) { $this->logger->push(„Operation started at: ” . time()); if ($this->user->isAuthenticated()) { if ($this->user->isAllowedTo(self::DELETE) { $payments = PaymentPeer::retrieveByUser($user); foreach ($payments as $payment) { $payment->deleteFromCache(); $payment->delete(); } $user->deleteFromCache(); $user->delete(); } else { throw new UnauthorizedAccessException(); } } else { throw new UnauthorizedAccessException(); } $this->logger->push(„Operation finished at: ” . time()); } }

Slide 10

Slide 10 text

1

Slide 11

Slide 11 text

2

Slide 12

Slide 12 text

3

Slide 13

Slide 13 text

TEORIA science motherf*cker, do you speak it?

Slide 14

Slide 14 text

60 ` OOP

Slide 15

Slide 15 text

t unde tand the present unde tand the past „

Slide 16

Slide 16 text

wiele problemó ` wiele rozwiazan `

Slide 17

Slide 17 text

wiele problemó WZORCE PROJEKTOWE WZORCE GRASP DESIGN BY CONTRACTS ZASADY SOLID ZASADA DRY ZASADA KISS ZASADA YAGNI ` wiele rozwiazan `

Slide 18

Slide 18 text

SEPARACJA ZAGADNIEN `

Slide 19

Slide 19 text

Logowanie Persystencja Caching Funkcjonalnosc 1 Autentykacja Funkcjonalnosc 2 Funkcjonalnosc 3 ` ` ` ` ` `

Slide 20

Slide 20 text

Programowanie aspektowe (aspect-oriented programming, AOP) paradygmat tworzenia programów komputerowych wspomagajacy separacje zagadnien i rozdzielenie programu na czesci w jak najwiekszym stopniu niezwiazane funkcjonalnie ` , , , , , `

Slide 21

Slide 21 text

OOP kod programu cache danych logowanie autentykacja OOP+AOP +

Slide 22

Slide 22 text

class UserService { //... public function delete($user) { $this->logger->push(„Operation started at: ” . time()); if ($this->user->isAuthenticated()) { if ($this->user->isAllowedTo(self::DELETE) { $payments = PaymentPeer::retrieveByUser($user); foreach ($payments as $payment) { $payment->deleteFromCache(); $payment->delete(); } $user->deleteFromCache(); $user->delete(); } else { throw new UnauthorizedAccessException(); } } else { throw new UnauthorizedAccessException(); } $this->logger->push(„Operation finished at: ” . time()); } }

Slide 23

Slide 23 text

4PODSTAWOWE ELEMENTY ASPEKTÓW

Slide 24

Slide 24 text

PUNKT ZLACZENIA dowolny identyfikowalny punkt programu, moze nim byc wywolanie lub wykonanie metody/konstruktora, odwolanie do pola w klasie obsluga wyjatku, etc. 1 ` . - - - - `

Slide 25

Slide 25 text

PUNKT CIECIA zdefiniowana za pomoca okreslonej deklaracji kolekcja punktów zlaczen 2 - ` ` ` ` `

Slide 26

Slide 26 text

PORADA fragment kodu programu wykonywanego przed, po lub zamiast osiagniecia przez program punktu ciecia 3 ` ` `

Slide 27

Slide 27 text

ASPEKT glówna jednostka modularyzacji programu, wyspecjalizowana klasa, która potrafi przecinac implementacje 4 - ` `

Slide 28

Slide 28 text

KORZYSCI? `

Slide 29

Slide 29 text

KORZYSCI? ` + modularyzacja kodu + wieksza czytelnosc + separacja zagadnien + aktywacja i zmiana flo całej aplikacji ` ` ` `

Slide 30

Slide 30 text

PRAKTYKA programming motherf*cker, do you speak it?

Slide 31

Slide 31 text

http://aop-php.github.com/ AOP-PHP jedna z dostepnych implementacji ,

Slide 32

Slide 32 text

http://aop-php.github.com/ AOP-PHP jedna z dostepnych implementacji , 0.1.0-dev

Slide 33

Slide 33 text

/** * Simple book bean class. * * @package demo * @version 1.0 */ class Book { /** * */ public $author; public $title; public $description; }

Slide 34

Slide 34 text

/** * Simple storage bean class. * * @package demo * @version 1.0 */ class Storage { /** * */ public function store($model, $field, $value) { echo sprintf( "*** Store method executed: model \"%s\", field \"%s\", value \"%s\"\n", $model, $field, $value ); } /** * */ public function load($model, $field) { echo sprintf( "*** Load method executed: model \"%s\", field \"%s\"\n", $model, $field ); } }

Slide 35

Slide 35 text

/** * Simple aspects. * * @package demo * @version 1.0 */ $storage = new Storage(); $storageAdvice = function (AopTriggeredJoinPoint $joinpoint) use ($storage) { switch ($joinpoint->getKindOfAdvice()) { case AOP_KIND_BEFORE_READ_PROPERTY: $storage->load( $joinpoint->getTriggeringClassName(), $joinpoint->getTriggeringPropertyName() ); break; case AOP_KIND_AFTER_READ_PROPERTY: break; case AOP_KIND_BEFORE_WRITE_PROPERTY: break; case AOP_KIND_AFTER_WRITE_PROPERTY: $storage->store( $joinpoint->getTriggeringClassName(), $joinpoint->getTriggeringPropertyName(), $joinpoint->getAssignedValue() ); break; } };

Slide 36

Slide 36 text

/** * Simple aspects. * * @package demo * @version 1.0 */ $storage = new Storage(); $storageAdvice = function (AopTriggeredJoinPoint $joinpoint) use ($storage) { switch ($joinpoint->getKindOfAdvice()) { case AOP_KIND_BEFORE: case AOP_KIND_BEFORE_METHOD: case AOP_KIND_BEFORE_FUNCTION: case AOP_KIND_BEFORE_PROPERTY: case AOP_KIND_BEFORE_READ_PROPERTY: case AOP_KIND_BEFORE_WRITE_PROPERTY: case AOP_KIND_AROUND: case AOP_KIND_AROUND_METHOD: case AOP_KIND_AROUND_FUNCTION: case AOP_KIND_AROUND_PROPERTY: case AOP_KIND_AROUND_READ_PROPERTY: case AOP_KIND_AROUND_WRITE_PROPERTY: case AOP_KIND_AFTER: case AOP_KIND_AFTER_METHOD: case AOP_KIND_AFTER_FUNCTION: case AOP_KIND_AFTER_PROPERTY: case AOP_KIND_AFTER_READ_PROPERTY: case AOP_KIND_AFTER_WRITE_PROPERTY: break; } };

Slide 37

Slide 37 text

/** * Simple aspect demo script. * * @param package demo * @version 1.0 */ require 'classes.php'; require 'aspects.php'; aop_add_before('Book->*', $storageAdvice); aop_add_after('Book->*', $storageAdvice); $book = new Book(); $book->title = 'Lorem ipsum'; $book->description = 'Lorem ipsum'; var_dump($book->title);

Slide 38

Slide 38 text

/** * Simple aspect demo script. * * @param package demo * @version 1.0 */ require 'classes.php'; require 'aspects.php'; aop_add_after('MyClass->myMethod()', $sampleAdvice); aop_add_after('MyClass->my*()', $sampleAdvice); aop_add_after('MyClass->*()', $sampleAdvice); aop_add_after('*::myMethod()', $sampleAdvice); aop_add_after('**\*()', $sampleAdvice); aop_add_after('\namespace\MyClass->property', $sampleAdvice); aop_add_after('public MyClass->property', $sampleAdvice); aop_add_after('!public MyClass->*', $sampleAdvice); aop_add_after('public|private MyClass->*', $sampleAdvice); aop_add_after('read MyClass->*', $sampleAdvice);

Slide 39

Slide 39 text

LIVE DEMO

Slide 40

Slide 40 text

ph framework FLOW3 http://flow3.typo3.org/

Slide 41

Slide 41 text

namespace  Examples\Forum\Domain\Model; class  Forum  {    /**      *  @FLOW3\Inject      *  @var  \Examples\Forum\Logger\ApplicationLoggerInterface      */    protected  $applicationLogger;    /**      *  Delete  a  forum  post  and  log  operation      *      *  @param  \Examples\Forum\Domain\Model\Post  $post      *  @return  void      */      public  function  deletePost(Post  $post)  {          $this-­‐>applicationLogger-­‐>log('Removing  post  '  .  $post-­‐>getTitle(),  LOG_INFO);          $this-­‐>posts-­‐>remove($post);      } }

Slide 42

Slide 42 text

namespace Examples\Forum\Logging; /** * @FLOW3\Aspect */ class LoggingAspect { /** * @FLOW3\Inject * @var \Examples\Forum\Logger\ApplicationLoggerInterface */ protected $applicationLogger; /** * Log a message if a post is deleted * * @param \TYPO3\FLOW3\AOP\JoinPointInterface $joinPoint * @FLOW3\Before("method(Examples\Forum\Domain\Model\Forum->deletePost())") * @return void */ public function logDeletePost(\TYPO3\FLOW3\AOP\JoinPointInterface $joinPoint) { $post = $joinPoint->getMethodArgument('post'); $this->applicationLogger->log('Removing post ' . $post->getTitle(), LOG_INFO); } }

Slide 43

Slide 43 text

https://speakerdeck.com/u/mariuszgil speakerdeck joind.in https://joind.in/talk/view/7192 &

Slide 44

Slide 44 text

DZIEKUJE email: [email protected] twitter: mariuszgil , ,