Refactoring to Design Patterns (phpDay 2009)Presentation Transcript
Refactoring to Design Pa0erns
Simone Carle5
phpDay 2009 – May 15‐16, 2009 – Verona, Italy
h0p://grusp.it ‐ h0p://phpday.it ‐ h0p://joind.in/event/view/34
About Me
• Technical Manager in Altura Labs
• Addicted to Agile Development
• Fallen in love with Development Best Prac=ces
• Passionate about Object Oriented
Programming
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Designing object oriented soKware is hard, and
designing reusable object‐oriented soKware is
even harder.
Design Pa*erns (GoF)
phpDay 2009 – 15 e 16 Maggio Verona, Italy
EvoluRon
Maintainability
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Maintainability
Long project lifecycle
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Maintainability
Long project lifecycle
Scalability
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Maintainability
Long project lifecycle
Scalability
Flexibility
phpDay 2009 – 15 e 16 Maggio Verona, Italy
… and we need it for yesterday!
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Design for Changes
The key to maximizing reuse lies in an=cipa=ng
new requirements and changes to exis=ng
requirements, and design your system so that
they can evolve accordingly.
Design Pa*erns (GoF)
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Bad Smell
hVp://www.codinghorror.com/blog/
archives/000589.html
D.R.Y.
Don’t repeat yourself
K.I.S.S.
Keep it Simple, Stupid
Y.A.G.N.I.
You Ain't Gonna Need It
Over‐Engineering
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Under‐Engineering
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Refactoring
phpDay 2009 – 15 e 16 Maggio Verona, Italy
What is Refactoring?
Refactoring is a disciplined technique for
restructuring an exis=ng body of code, altering
its internal structure without changing its
external behavior.
Mar2n Fowler
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Why?
• Improve readability
• Improve maintainability
• Gain a beVer understanding of code
phpDay 2009 – 15 e 16 Maggio Verona, Italy
How?
• Small steps
• Con=nuous
• Don’t add features
• … or bugs
• Have a good knowledge of the code
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Design Pa0erns
Design PaVerns describe simple and elegant
solu=ons to specific problems in object
oriented soKware design.
phpDay 2009 – 15 e 16 Maggio Verona, Italy
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Each paVerns describes a problem which occurs
over and over again in our environment, and
then describes the core of the solu=on to that
problem, in such a way that you can use this
solu=on a million =mes over.
Christopher Alexander
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Context
Problem
Solu=on
phpDay 2009 – 15 e 16 Maggio Verona, Italy
A word of warning
Ideally when the appropriate problem comes
along, you should trigger the design paVern
and your problem is solved.
Russ Olsen, Design Pa*erns in Ruby
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Design Pa0erns by Purpose
• Crea=onal PaVerns
• Structural PaVerns
• Behavioral PaVerns
• Concurrency PaVerns
• Architectural PaVerns
phpDay 2009 – 15 e 16 Maggio Verona, Italy
There is a natural rela=on
between paVerns and refactorings.
PaVerns are where you want to be,
refactorings are ways to get there
from somewhere else.
Mar2n Fowler
phpDay 2009 – 15 e 16 Maggio Verona, Italy
TesRng
phpDay 2009 – 15 e 16 Maggio Verona, Italy
TesRng
performance
integra=on
func=onal
unit
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Test Driven Development
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Design
Tes=ng
PaVerns
Refactoring
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Refactoring to Design Pa0erns
Observer
Observer
The Observer paVern defines dependency
between objects so that when one object
change state, all its dependents are no=fied
and updated automa=cally
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Observer
Post
CacheSweeper EmailNo=fier Logger
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Observer
$post‐>=tle = “foo”;
Post
$post‐>save();
CacheSweeper EmailNo=fier Logger
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Observer
$post‐>=tle = “foo”;
Post
$post‐>save();
CacheSweeper EmailNo=fier Logger
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Observer
$post‐>=tle = “foo”;
Post
$post‐>save();
CacheSweeper EmailNo=fier Logger
aKer_save() aKer_save() aKer_save()
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Observer
$post‐>delete(); Post
CacheSweeper EmailNo=fier Logger
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Observer
$post‐>delete(); Post
CacheSweeper EmailNo=fier Logger
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Observer
$post‐>delete(); Post
CacheSweeper EmailNo=fier Logger
aKer_delete() aKer_delete()
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Code Time
Strategy
Strategy
function doSomething($even, $odd)
{
if ($even == quot;secretquot;) {
if ($odd == quot;other secretquot;) {
return 1;
} else if (quot;pizzaquot; == quot;goodquot;) {
return quot;Yes it is!quot;;
}
} else if ($odd != $even) {
return quot;yeah, they arequot;;
} else {
return quot;I'm getting crazyquot;;
}
}
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Strategy
method($params)
{
// complex logic
// conditional strategy
}
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Strategy
method($params)
{
$s = new Strategy();
$s->method($params);
}
$s = new Strategy()
Strategy 1 Strategy 2 Strategy 3
$s->method($params);
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Code Time
QuesRons?
phpDay 2009 – 15 e 16 Maggio Verona, Italy
License
This presenta=on is published under the AVribu=on‐Share Alike Unported
Crea=ve Commons License.
You are free:
• to Share — to copy, distribute and transmit the work
• to Remix — to adapt the work
Under the following condi=ons:
• A0ribuRon — You must aVribute the work in the manner specified by the author or licensor
(but not in any way that suggests that they endorse you or your use of the work).
• Share Alike — If you alter, transform, or build upon this work, you may distribute the
resul=ng work only under the same, similar or a compa=ble license.
Visit hVp://crea=vecommons.org/licenses/by‐sa/3.0/ for more details.
phpDay 2009 – 15 e 16 Maggio Verona, Italy
Thank you!
Slides will be available at
www.simonecarleq.com
www.slideshare.net/weppos
Rate this talk at
hVp://joind.in/talk/view/417