refactor, the third commandment
TRANSCRIPT
REFACTOR THE THIRD COMANDEMENTby Nicola Pietroluongo
@niklongstone
Nicola Pietroluongo @niklongstone
Nicola Pietroluongo @niklongstone
TDD CYCLE
Its a process of restructuring an existing code, altering its internal structure without changing its external behavior.
Nicola Pietroluongo @niklongstone
DEFINITION OF REFACTORING
Code will look cleanEasy to understandEasy to editEasy to mantain
Nicola Pietroluongo @niklongstone
WHY REFACTORING?
Nicola Pietroluongo @niklongstone
WHAT TO DO BEFORE
Announce the refactoring
Build a sandbox environment
Use a version control system (Git)
Remember coding standards
Remember OO design principle SOLID
Write or improve the test
Nicola Pietroluongo @niklongstone
COMMON REFACTORINGS
Change Signature
Extract (Method, Variable, ...)
Pull Members up
Push Members down
Rename
Safe Delete
UNDERSTAND THE BEHAVIOUR
Nicola Pietroluongo @niklongstone
HOW TO START A REFACTORING
USE AN IDE
Nicola Pietroluongo @niklongstone
HOW TO START A REFACTORING
START TO INSPECT
Nicola Pietroluongo @niklongstone
HOW TO START A REFACTORING
Nicola Pietroluongo @niklongstone
LEVEL OF REFACTOR
FUNCTIONS/
METHODS
CLASSES/OBJECTS
APPLICATION/DESIGN
AT FUNCTION / METHOD LEVEL
Nicola Pietroluongo @niklongstone
REFACTORING
Nicola Pietroluongo @niklongstone
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
WHAT'S WRONG...?
LONG MEHTODCODE DUPLICATIONNO STANDARDS..
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
NAMING
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
NAMING
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
COMPLICATE CONDITIONALS
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
COMPLICATE CONDITIONALS
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
SWITCH
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
SWITCH
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
ERROR CODES
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
ERROR CODES
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
PARAMETERS
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
PARAMETERS
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
GHOST PARAMETERS
WHY THIS IS BAD?
Nicola Pietroluongo @niklongstone
GHOST PARAMETERS
AT CLASSES / OBJECTS LEVEL
Nicola Pietroluongo @niklongstone
REFACTORING
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
DIVERGENT CHANGE
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
DIVERGENT CHANGE
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
CONSTRUCTORS
WHY THIS IS BAD?
Nicola Pietroluongo @niklongstone
CONSTRUCTORS
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
PRIMITIVE OBSESSION
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
PRIMITIVE OBSESSION
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
MESSAGE CHAIN
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
MESSAGE CHAIN
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
INAPPROPRIATE INTIMACY
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
INAPPROPRIATE INTIMACY
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
REFUSED BEDQUEST
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
REFUSED BEDQUEST
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
TRAITS FREAKTRICK OR TRAIT
WHAT'S WRONG...?
Nicola Pietroluongo @niklongstone
TRAITS FREAKTRICK OR TRAIT
AT APPLICATION / DESIGN LEVEL
Nicola Pietroluongo @niklongstone
REFACTORING
LAZY CLASS
Nicola Pietroluongo @niklongstone
A CLASS DOESN'T DO ENOUGH COULD BE REMOVED
SHOTGUN SURGERY
Nicola Pietroluongo @niklongstone
DATA ABSTRACTION
Nicola Pietroluongo @niklongstone
DATA ACCESS LAYERDBBUSINESS LOGIC LAYERPRESENTATION LAYER
PARALLEL INHERITANCE HIERARCHIES
Nicola Pietroluongo @niklongstone
MoverDriver+openWindows()Vehicle+getOperator(Mover)CarMotorbike
Rider+moveHandGrip()
PARALLEL INHERITANCE HIERARCHIES
Nicola Pietroluongo @niklongstone
MoverDriver+openWindows()Vehicle+getOperator(Mover)CarMotorbike
Rider+moveHandGrip()
Pilot+moveFlaps()Plane
PARALLEL INHERITANCE HIERARCHIES
Nicola Pietroluongo @niklongstone
Mover+accelerate()+brake()Vehicle+setFuel()CarTrip__construct(Driver)+accelerate()+openWindow()...MotorbikeTrip__construct(Rider)+accelerate()+brake()...
RESPONSIBILITY
Nicola Pietroluongo @niklongstone
Check constructors, extends and implements
Composition over inheritance
Check namespacing and folder structure
SOME TOOL
Nicola Pietroluongo @niklongstone
REFACTORING
$ sed -i 's/UglyClass/PrettyClass/g' /folder/myfile.php
$ find /folder/src -type f -exec \ sed -i 's/UglyClass/PrettyClass/g' {} \;
Nicola Pietroluongo @niklongstone
SED
Nicola Pietroluongo @niklongstone
PHPCS (and phpcbf)
Nicola Pietroluongo @niklongstone
PHPUNIT + XDEBUG (Change Risk Analyzer and Predictor)
Nicola Pietroluongo @niklongstone
XHPROF
$ phpmd src/ text design,codesize
$ /src/File.php:26 The class File has 12 methods. Consider refactoring File to keep number of methods under 10.
Nicola Pietroluongo @niklongstone
PHPMD
Nicola Pietroluongo @niklongstone
PhpMetrics
Scisr (http://iangreenleaf.github.io/Scisr/)
Rephactor (http://rephactor.sourceforge.net/user-guide.php)
phpdepend.org
phpqatools.org
https://github.com/ziadoz/awesome-php#code-analysis
Nicola Pietroluongo @niklongstone
OTHER RESOURCES
Nicola Pietroluongo @niklongstone
THANKS
IMPROVE THE CODE, IMPROVE YOURSELF
Twitter: @niklongstoneGithub: github.com/niklongstoneWebsite: www.nicolapietroluongo.com
Code: github.com/niklongstone/php-refactoring
Nicola Pietroluongo @niklongstone
THANKS