Upload
alexander-lisachenko
View
1.626
Download
0
Embed Size (px)
Citation preview
Solving Cross-Cutting Concerns in PHPAlexander Lisachenko
‣ Head of Software Architecture at Alpari (RU) Forex Broker
About me:
2
lisachenkolisachenko
‣ Head of Software Architecture at Alpari (RU) Forex Broker
‣ Have worked with computers since 7 years old
About me:
2
lisachenkolisachenko
‣ Head of Software Architecture at Alpari (RU) Forex Broker
‣ Have worked with computers since 7 years old
‣ Clean code advocate, guru in enterprise architecture
About me:
2
lisachenkolisachenko
‣ Head of Software Architecture at Alpari (RU) Forex Broker
‣ Have worked with computers since 7 years old
‣ Clean code advocate, guru in enterprise architecture
‣ Author of the aspect-oriented framework Go! AOP http://go.aopphp.com
About me:
2
lisachenkolisachenko
Agenda
3
Agenda‣ Advantages of Object-Oriented Paradigm
3
Agenda‣ Advantages of Object-Oriented Paradigm‣ Limitations of OOP and how they affect our
application
3
Agenda‣ Advantages of Object-Oriented Paradigm‣ Limitations of OOP and how they affect our
application‣ Existing object-oriented ways of solving
cross-cutting concerns
3
Agenda‣ Advantages of Object-Oriented Paradigm‣ Limitations of OOP and how they affect our
application‣ Existing object-oriented ways of solving
cross-cutting concerns‣ Pros and cons: the aspect-oriented
approach of solving cross-cutting concerns
3
Agenda‣ Advantages of Object-Oriented Paradigm‣ Limitations of OOP and how they affect our
application‣ Existing object-oriented ways of solving
cross-cutting concerns‣ Pros and cons: the aspect-oriented
approach of solving cross-cutting concerns‣ Examples of using aspects in real life
applications3
Текст
Object-Oriented ParadigmSolution to the complexity
5
ModularityWe connect classes, components, bundles, and frameworks.
6
ReusabilityWe use existing code to create new code on the top.
7
EncapsulationWe hide implementation details from the outside world.
8
Is it a silver bullet?Object-Oriented Paradigm
8
Is it a silver bullet?Object-Oriented Paradigm
8
Is it a silver bullet?Object-Oriented Paradigm
Edsger W. Dijkstra
“Object-oriented programming is an exceptionally bad idea which could only have originated in California.”
9
Joe Armstrong
“…You wanted a banana but what you got [with OOP] was a gorilla holding the banana
and the entire jungle”
10
What are the problems?
11
What are the problems?‣ Limitation of object-oriented
representation of real life processes
11
What are the problems?‣ Limitation of object-oriented
representation of real life processes‣ Essential complexity results in strong
coupling between components
11
What are the problems?‣ Limitation of object-oriented
representation of real life processes‣ Essential complexity results in strong
coupling between components‣ Essential complexity results in scattered
implementation of our concerns
11
Текст
Cross-cutting concernsWhat they are and why we should think about them
13
Cross-cutting concerns are aspects of a program that affect
other concerns.
Cross-cutting concerns - why they affect our code?
14
Task: Implement an audit system that checks access permission for each public method over
all classes in our system and then logs this information into the security journal.
Clean model
15
Authorization control…
16
Authorization control…
16
Logging and audit…
17
Logging and audit…
17
Logging and audit…
17
Error handling…
18
Error handling…
18
Code tangling
19
Code scattering
20
Текст
OOP waysWhat do we have in OOP to fight cross-cutting concerns?
DecoratorDesign pattern that allows behavior to be added to an individual object, either statically or dynamically, without affecting the behavior of other objects from the same class.
22
23
23
23
23
Decorator+ Respects LSP - We can pass an instance of a
decorator everywhere the original object is expected. + Keeps SRP for the original class because it doesn’t
contain secondary concerns now
- Too many decorator classes for each combination of concern+concrete interface
- Secondary concerns (authorization, caching, etc.) are scattered across all decorators
- Additional overhead for calling original methods
24
MediatorDefines an object that incapsulates all logic of interactions between objects, giving them the ability to work without explicit references to each other
25
26
26
26
27
27
27
Mediator+ All secondary concerns can be moved to separate
classes without duplication (SRP for secondary concerns)
+ Keeps SRP for the original class, because it doesn’t contain secondary concerns now
+ The most flexible way of extending a system- Requires specific changes in the original class to
perform notification of mediator - Hard to debug code with complex logic of interaction
because there are no explicit links between objects
28
Текст
Take control of everythingWhat if we combine all the best features of the decorator and mediator into the one pattern?
Aspect-Oriented ParadigmA programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns
30
Go! AOP Framework
31
Go! AOP Framework
31
‣ Inspired by famous AspectJ and Spring frameworks
Go! AOP Framework
31
‣ Inspired by famous AspectJ and Spring frameworks
‣ Over 800 stargazers on Github - thank you!
Go! AOP Framework
31
‣ Inspired by famous AspectJ and Spring frameworks
‣ Over 800 stargazers on Github - thank you!‣ Over 200k installations on Packagist
Go! AOP Framework
31
‣ Inspired by famous AspectJ and Spring frameworks
‣ Over 800 stargazers on Github - thank you!‣ Over 200k installations on Packagist‣ PHP5.6, PHP7.0 and Opcache compatible
Go! AOP Framework
31
‣ Inspired by famous AspectJ and Spring frameworks
‣ Over 800 stargazers on Github - thank you!‣ Over 200k installations on Packagist‣ PHP5.6, PHP7.0 and Opcache compatible‣ There are bridges for SF2, ZF2, Laravel…
Let’s take our clean code…
32
Let’s take our clean code…
32
Let’s take our clean code…
Method execution is an event
32
…and subscribe to our event
33
…and subscribe to our event
33
…and subscribe to our event
Pointcut - describes list of interesting events
33
…and subscribe to our event
Pointcut - describes list of interesting events
33
…and subscribe to our event
Pointcut - describes list of interesting events
Joinpoint - defines an event object
33
…and subscribe to our event
Pointcut - describes list of interesting events
Joinpoint - defines an event object
33
…and subscribe to our event
Pointcut - describes list of interesting events
Joinpoint - defines an event object
Advice - event handler
33
How it works
34
All aspects (or advisors) are registered in the aspect kernel
How it works
35
The special php://filter stream filter is registered via stream_filter_register()
How it works
36
The composer class loader is replaced with a weaving proxy
How it works
37
Lexical analysis and parsing of AST is performed (nikic/PHP-Parser)
How it works
38
Static reflection is created from the AST (goaop/parser-reflection)
How it works
39
The original class is renamed and replaced with a new class with additional behavior; stored in the
cache
How it works
39
The original class is renamed and replaced with a new class with additional behavior; stored in the
cache
How it works
39
The original class is renamed and replaced with a new class with additional behavior; stored in the
cacheSimple inheritance
How it works
39
The original class is renamed and replaced with a new class with additional behavior; stored in the
cacheSimple inheritance
How it works
39
The original class is renamed and replaced with a new class with additional behavior; stored in the
cacheSimple inheritance
Overridden method
Текст
Go! AOP joinpointsWhat can be intercepted?
Method interceptors:
41
Method interceptors:
41
Can be a final class or a trait!
Property interceptors:
42
Logic interceptors:
43
AOP+ Keeps SRP for the original class because it doesn’t
contain secondary concerns now + All secondary concerns are stored in separate classes
without duplication (SRP for secondary concerns) + Very flexible way of extending our system (like mediator
does) + Does not require changes in original classes
- No tools to debug AOP code; no help from IDE - Overhead for AOP initialization and execution
44
Go! AOP: Debugging with XDebug
45
Go! AOP: Debugging with XDebug
45
Go! AOP: Plugin for the PhpStorm
46
Pointcut syntax highlighting, completion and analysis
47
Pointcut syntax highlighting, completion and analysis
47
Navigate to advice/advised elements
48
Navigate to advice/advised elements
48
Текст
Circuit breaker Prevents one failure from reoccurring continuously
Logic of CircuitBreaker
50
Logic of CircuitBreaker
50
‣ For each public method execution we count the number of failures in APC/Memcache.
Logic of CircuitBreaker
50
‣ For each public method execution we count the number of failures in APC/Memcache.
‣ If the number of failures is too high, then we break the circuit to prevent subsequent failures.
Logic of CircuitBreaker
50
‣ For each public method execution we count the number of failures in APC/Memcache.
‣ If the number of failures is too high, then we break the circuit to prevent subsequent failures.
‣ If the circuit is broken, then the original method body should not be executed for the configured amount of time.
Logic of CircuitBreaker
50
‣ For each public method execution we count the number of failures in APC/Memcache.
‣ If the number of failures is too high, then we break the circuit to prevent subsequent failures.
‣ If the circuit is broken, then the original method body should not be executed for the configured amount of time.
‣ https://github.com/ejsmont-artur/php-circuit-breaker can be used.
Step 1. Define an annotation
51
Step 2. Define an aspect
52
Step 2. Define an aspect
53
Step 2. Define an aspect
53
All methods with «Fuse» annotation
Step 2. Define an aspect
53
All methods with «Fuse» annotation
Step 2. Define an aspect
53
All methods with «Fuse» annotation
Step 2. Define an aspect
53
All methods with «Fuse» annotation
Step 3. Use it in your code
54
Step 3. Use it in your code
54
More examples for AOP
55
More examples for AOP
55
‣ Profiling methods with pinba extension and Intaro Pinboard
More examples for AOP
55
‣ Profiling methods with pinba extension and Intaro Pinboard
‣ Feature toggle pattern
More examples for AOP
55
‣ Profiling methods with pinba extension and Intaro Pinboard
‣ Feature toggle pattern‣ Authorization control
More examples for AOP
55
‣ Profiling methods with pinba extension and Intaro Pinboard
‣ Feature toggle pattern‣ Authorization control‣ Traditional caching, logging, transaction
control, security audit
More examples for AOP
55
‣ Profiling methods with pinba extension and Intaro Pinboard
‣ Feature toggle pattern‣ Authorization control‣ Traditional caching, logging, transaction
control, security audit‣ Design by contract programming (Php-Deal
library)
More examples for AOP
55
‣ Profiling methods with pinba extension and Intaro Pinboard
‣ Feature toggle pattern‣ Authorization control‣ Traditional caching, logging, transaction
control, security audit‣ Design by contract programming (Php-Deal
library)‣ Aspect-oriented testing (AspectMock)
Conclusion
56
Conclusion
56
‣ OOP is a nice tool for solving accidental complexity but not for essential complexity.
Conclusion
56
‣ OOP is a nice tool for solving accidental complexity but not for essential complexity.
‣ Pay attention to code scattering and code tangling.
Conclusion
56
‣ OOP is a nice tool for solving accidental complexity but not for essential complexity.
‣ Pay attention to code scattering and code tangling.
‣ Try to extract secondary concerns into separate classes via OOP decomposition for small applications.
Conclusion
56
‣ OOP is a nice tool for solving accidental complexity but not for essential complexity.
‣ Pay attention to code scattering and code tangling.
‣ Try to extract secondary concerns into separate classes via OOP decomposition for small applications.
‣ Try to use AOP for complex enterprise applications.
Thank you for the attention!
https://github.com/goaop https://github.com/lisachenko https://twitter.com/lisachenko