SlideShare a Scribd company logo
1 of 46
Refactoring 101
By:
Adam Culp
Twitter: @adamculp
https://joind.in/14927
2
Refactoring 101
●
About me
– PHP 5.3 Certified
– Consultant at Zend Technologies
– Organizer SoFloPHP (South Florida)
– Organized SunshinePHP (Miami)
– Long distance (ultra) runner
– Judo Black Belt Instructor
3
Refactoring 101
●
Fan of iteration
– Pretty much everything requires iteration to do well:
●
Long distance running
●
Judo
●
Development
●
Evading project managers
●
Refactoring!
4
Refactoring 101
● About talk
– Based on “Refactoring; Improving The Design of Existing Code” book, by
Martin Fowler.
– https://github.com/adamculp/refactoring101 – for PHP code samples
6
Refactoring 101
● What is “refactoring”?
– “...process of changing a computer program's source code without
modifying its external functional behavior...” en.wikipedia.org/wiki/Refactoring
– Should not add functionality
– Simplify code
– Improve code readability
7
Refactoring 101
● Two hats
– Adding Functionality Hat
– Refactoring Hat
– We add functionality, then refactor, then add more functionality ...
8
Refactoring 101
● Then optimize
– Do not optimize while refactoring
– Separate step
– Refactoring is NOT optimizing
9
Refactoring 101
● Why refactor?
– Prevent decay
– Preserve or fix design
– Reduce duplication
– Improve maintainability
– Helps us code faster
– Locate bugs
– Code smells
10
Refactoring 101
●
Code “smells”
– What are “smells”?
●
Indications of spoiled code nearby
●
Not conclusive
●
The “smell” is not bad
11
Refactoring 101
● Code “smells”
– “Smells” hinting a refactor may be needed:
●
Duplicate Code (rule of 3)
●
Long Methods
●
Large Class
●
Long Parameter (argument) List
● Divergent Change – cascade change to accommodate another
●
Shotgun Surgery – change ripples as bugs
●
Feature Envy – method uses parts from other class
●
Switch Statements – sacrifice polymorphism
12
Refactoring 101
● Code “smells”
– Cont'd:
●
Lazy Class – class not doing much
●
Speculative Generality – something built for possible future
●
Temporary Field/Variable
●
Message Chains – object asking object asking object
● Middle Man – directors in place but serve no real purpose
●
Inappropriate Intimacy – classes share private parts
●
Data Class – getters and setters, but nothing else
●
Comments – where comments cover bad code
14
Refactoring 101
● Tools to highlight smells
– PHPqatools.org
●
PHPUnit
●
PHPLoc
●
PHP_Codesniffer
●
PHP_Depend
● PHP Copy/Paste Detector
●
PHP Mess Detector
●
PHP Dead Code Detector
15
Refactoring 101
● Realtime profiling
– Zend Z-Ray
16
Refactoring 101
● Rewrite vs Refactor
– Rewrite = perceived easy road
– Refactor = best teacher
– Business arguments
● Budget
●
Time
●
Retain business logic
17
Refactoring 101
● When to rewrite
– Want a new app
● Not just better coded current app
– Business logic change
– Target market change
– Framework integration or change
18
Refactoring 101
● When to refactor?
– No “special” time
– Short bursts
– Refactor to gain something
– Prior to adding functionality
– When fixing a bug
– During code review
19
Refactoring 101
● What do I tell my manager? (justification)
– Tech savvy manager = not be hard to explain the benefits.
– Quality centric manager = stress quality aspects.
●
Introduce as a review process.
●
Many resources on Google.
– Schedule driven manager = Don't tell (controversial?).
●
Find a way to work it in.
●
Overall it saves time, but some will never “see” it.
20
Refactoring 101
● First steps
– Use source control (Git, SVN, etc.)
●
Records steps, provides rollback
● Auditable
– GET IT WORKING
●
Do NOT refactor broken
– Create consistent data
– Create tests
21
Refactoring 101
● Tests and refactoring
– Basic refactor steps
●
Ensure tests pass
●
Plan refactor
●
Implement
●
Ensure tests still pass
– Updating tests if needed
– Add more tests to cover newly discovered items
●
Repeat!
22
Refactoring 101
Let's look at the code!
● Example
– Lets look at a code example.
– Tips and descriptions during steps.
– Our Task:
● Video Rental Company has asked for an HTML representation of their
customer statement to be created.
23
Refactoring 101
24
Refactoring 101
25
Refactoring 101
26
Refactoring 101
27
Refactoring 101
28
Refactoring 101
29
Refactoring 101
●
Code summary: What did we see?
– Method statement()→
●
Too long
●
Not reusable for HTML version
●
Switch sacrificing polymorphism
●
Determining class/type
●
Calculating rental price, frequent renter points, grant total
30
Refactoring 101
●
Additional notes
– Cannot change how movies are classified.
– Customers always changes, not easy in current state.
●
Movie classification
●
Frequent renter points
●
Rental days per type
●
Price calculation
31
Refactoring 101
●
Objective:
– Clean up statement().
●
Shorten
– Extract code to encapsulate functionality
– Extract business logic to keep DRY
32
Refactoring 101
● TEST ! ! !
33
Refactoring 101
● Extract method
– Moves a functionality to it's own method.
●
Encapsulate calculation of each rental.
●
Shorten statement() method.
34
Refactoring 101
● Extract method cont'd.
– We now have a new method amountFor().
35
Refactoring 101
● Rename variables
– Renaming $each to $rental
– Improves readability.
– Relate intent.
36
Refactoring 101
● Renaming variables, cont'd.
– Renamed $each to $rental, and also changed $thisAmount to become
$result for clarity.
37
Refactoring 101
● Rename method
– Rename amountFor() to getCharge().
– Self documenting.
38
Refactoring 101
● Move method
– Move getCharge() from Customer to Rental.
●
Relies on Rental data.
– Already have Rental object, no need to pass $rental.
39
Refactoring 101
● Move method cont'd
– Now calls getDaysRented() directly.
– Returns charge of Rental, as it should.
●
Building rental charge in customer was misplaced.
40
Refactoring 101
● Replace temp with query
– Remove temporary variable and call Rental->getCharge() direct.
●
Less future maintenance.
●
Makes code clearer.
41
Refactoring 101
● Extract method
– $frequentRenterPoints calculation extracted to
getFrequentRenterPoints(), and move it in the Rental class.
42
Refactoring 101
● Replace temp with query
– Encapsulate logic and generation of grand total.
– Promotes DRY.
– Remove $totalAmount temporary variable.
43
Refactoring 101
●
Replace temp with query
– Encapsulate logic and generation of frequent renter points.
– Promotes DRY.
– Remove $frequentRentalPoints temporary variable.
44
Refactoring 101
● Create HTML statement
– Create HTML version.
– Rename original as text version.
45
Refactoring 101
● Execution
– Can call either Text or HTML versions.
46
Refactoring 101
● Recap
– Most refactoring reduces code
●
More self-documenting
●
More flexibility
● More testable
– 3 loops (getFrequentRenterPoints, getTotalCharge, and statement)
●
Isolates calculations
●
Enabled multiple statements (text/html)
– Optimizing and refactoring = different
●
Refactor, then optimize
– Future = separation of concerns
59
Refactoring 101
●
Conclusion
– Do not refactor a broken application
– Always have tests in place prior to refactor
●
Unit tests or
●
Functional tests or
●
Manual tests
– Leave code cleaner than you got it
– Try NOT to rewrite
– Learn to “smell” problems
– Love iteration!
● Thank you!
– Code: https://github.com/adamculp/refactoring101
– Please rate at: https://joind.in/14927
Adam Culp
http://www.geekyboy.com
http://RunGeekRadio.com
Twitter @adamculp

More Related Content

What's hot

Clean Code summary
Clean Code summaryClean Code summary
Clean Code summaryJan de Vries
 
Git and Github slides.pdf
Git and Github slides.pdfGit and Github slides.pdf
Git and Github slides.pdfTilton2
 
Clean pragmatic architecture @ devflix
Clean pragmatic architecture @ devflixClean pragmatic architecture @ devflix
Clean pragmatic architecture @ devflixVictor Rentea
 
SOLID Design Principles
SOLID Design PrinciplesSOLID Design Principles
SOLID Design PrinciplesAndreas Enbohm
 
Introduction to React JS for beginners
Introduction to React JS for beginners Introduction to React JS for beginners
Introduction to React JS for beginners Varun Raj
 
Introduction to SOLID Principles
Introduction to SOLID PrinciplesIntroduction to SOLID Principles
Introduction to SOLID PrinciplesGanesh Samarthyam
 
Code review guidelines
Code review guidelinesCode review guidelines
Code review guidelinesLalit Kale
 
Hexagonal architecture with Spring Boot
Hexagonal architecture with Spring BootHexagonal architecture with Spring Boot
Hexagonal architecture with Spring BootMikalai Alimenkou
 
Introduction to react_js
Introduction to react_jsIntroduction to react_js
Introduction to react_jsMicroPyramid .
 
Docker Commands With Examples | Docker Tutorial | DevOps Tutorial | Docker Tr...
Docker Commands With Examples | Docker Tutorial | DevOps Tutorial | Docker Tr...Docker Commands With Examples | Docker Tutorial | DevOps Tutorial | Docker Tr...
Docker Commands With Examples | Docker Tutorial | DevOps Tutorial | Docker Tr...Edureka!
 
Single Responsibility Principle @ Clean Code Alliance Meetup
Single Responsibility Principle @ Clean Code Alliance MeetupSingle Responsibility Principle @ Clean Code Alliance Meetup
Single Responsibility Principle @ Clean Code Alliance MeetupEyal Golan
 
Refactoring for Domain Driven Design
Refactoring for Domain Driven DesignRefactoring for Domain Driven Design
Refactoring for Domain Driven DesignDavid Berliner
 

What's hot (20)

Tech talks#6: Code Refactoring
Tech talks#6: Code RefactoringTech talks#6: Code Refactoring
Tech talks#6: Code Refactoring
 
Git
GitGit
Git
 
Clean Code summary
Clean Code summaryClean Code summary
Clean Code summary
 
Git and Github slides.pdf
Git and Github slides.pdfGit and Github slides.pdf
Git and Github slides.pdf
 
Clean pragmatic architecture @ devflix
Clean pragmatic architecture @ devflixClean pragmatic architecture @ devflix
Clean pragmatic architecture @ devflix
 
SOLID Design Principles
SOLID Design PrinciplesSOLID Design Principles
SOLID Design Principles
 
Solid principles
Solid principlesSolid principles
Solid principles
 
Clean code slide
Clean code slideClean code slide
Clean code slide
 
Introduction to React JS for beginners
Introduction to React JS for beginners Introduction to React JS for beginners
Introduction to React JS for beginners
 
Introduction to SOLID Principles
Introduction to SOLID PrinciplesIntroduction to SOLID Principles
Introduction to SOLID Principles
 
Code review guidelines
Code review guidelinesCode review guidelines
Code review guidelines
 
Hexagonal architecture with Spring Boot
Hexagonal architecture with Spring BootHexagonal architecture with Spring Boot
Hexagonal architecture with Spring Boot
 
Intro to React
Intro to ReactIntro to React
Intro to React
 
Introduction To Git
Introduction To GitIntroduction To Git
Introduction To Git
 
Introduction to react_js
Introduction to react_jsIntroduction to react_js
Introduction to react_js
 
Angular Data Binding
Angular Data BindingAngular Data Binding
Angular Data Binding
 
Docker Commands With Examples | Docker Tutorial | DevOps Tutorial | Docker Tr...
Docker Commands With Examples | Docker Tutorial | DevOps Tutorial | Docker Tr...Docker Commands With Examples | Docker Tutorial | DevOps Tutorial | Docker Tr...
Docker Commands With Examples | Docker Tutorial | DevOps Tutorial | Docker Tr...
 
Reactjs
ReactjsReactjs
Reactjs
 
Single Responsibility Principle @ Clean Code Alliance Meetup
Single Responsibility Principle @ Clean Code Alliance MeetupSingle Responsibility Principle @ Clean Code Alliance Meetup
Single Responsibility Principle @ Clean Code Alliance Meetup
 
Refactoring for Domain Driven Design
Refactoring for Domain Driven DesignRefactoring for Domain Driven Design
Refactoring for Domain Driven Design
 

Viewers also liked

Introduction to Design Pattern
Introduction to Design  PatternIntroduction to Design  Pattern
Introduction to Design PatternSanae BEKKAR
 
Refactoring - An Introduction
Refactoring - An IntroductionRefactoring - An Introduction
Refactoring - An IntroductionGiorgio Vespucci
 
The Decorator Pattern
The Decorator PatternThe Decorator Pattern
The Decorator PatternAkshat Vig
 
Design Patterns這樣學就會了:入門班 Day1 教材
Design Patterns這樣學就會了:入門班 Day1 教材Design Patterns這樣學就會了:入門班 Day1 教材
Design Patterns這樣學就會了:入門班 Day1 教材teddysoft
 
Design Patterns Illustrated
Design Patterns IllustratedDesign Patterns Illustrated
Design Patterns IllustratedHerman Peeren
 
Design Patterns - 01 Introduction and Decorator Pattern
Design Patterns - 01 Introduction and Decorator PatternDesign Patterns - 01 Introduction and Decorator Pattern
Design Patterns - 01 Introduction and Decorator Patterneprafulla
 
Design Patterns
Design PatternsDesign Patterns
Design Patternssoms_1
 

Viewers also liked (10)

Code Refactoring
Code RefactoringCode Refactoring
Code Refactoring
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Refactoring
RefactoringRefactoring
Refactoring
 
Introduction to Design Pattern
Introduction to Design  PatternIntroduction to Design  Pattern
Introduction to Design Pattern
 
Refactoring - An Introduction
Refactoring - An IntroductionRefactoring - An Introduction
Refactoring - An Introduction
 
The Decorator Pattern
The Decorator PatternThe Decorator Pattern
The Decorator Pattern
 
Design Patterns這樣學就會了:入門班 Day1 教材
Design Patterns這樣學就會了:入門班 Day1 教材Design Patterns這樣學就會了:入門班 Day1 教材
Design Patterns這樣學就會了:入門班 Day1 教材
 
Design Patterns Illustrated
Design Patterns IllustratedDesign Patterns Illustrated
Design Patterns Illustrated
 
Design Patterns - 01 Introduction and Decorator Pattern
Design Patterns - 01 Introduction and Decorator PatternDesign Patterns - 01 Introduction and Decorator Pattern
Design Patterns - 01 Introduction and Decorator Pattern
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
 

Similar to Refactoring 101

Refactoring Legacy Code
Refactoring Legacy CodeRefactoring Legacy Code
Refactoring Legacy CodeAdam Culp
 
Prashant technical practices-tdd for xebia event
Prashant   technical practices-tdd for xebia eventPrashant   technical practices-tdd for xebia event
Prashant technical practices-tdd for xebia eventXebia India
 
Code refactoring
Code refactoringCode refactoring
Code refactoringLalit Kale
 
Workshop: Refactoring Legacy PHP: The Complete Guide
Workshop: Refactoring Legacy PHP: The Complete Guide Workshop: Refactoring Legacy PHP: The Complete Guide
Workshop: Refactoring Legacy PHP: The Complete Guide Junade Ali
 
Converting Your Legacy Data to S1000D
Converting Your Legacy Data to S1000DConverting Your Legacy Data to S1000D
Converting Your Legacy Data to S1000Ddclsocialmedia
 
Peephole optimization techniques in compiler design
Peephole optimization techniques in compiler designPeephole optimization techniques in compiler design
Peephole optimization techniques in compiler designAnul Chaudhary
 
The Power Of Refactoring (php|tek 09)
The Power Of Refactoring (php|tek 09)The Power Of Refactoring (php|tek 09)
The Power Of Refactoring (php|tek 09)Stefan Koopmanschap
 
Refactoring: Improving the design of existing code
Refactoring: Improving the design of existing codeRefactoring: Improving the design of existing code
Refactoring: Improving the design of existing codeKnoldus Inc.
 
They why behind php frameworks
They why behind php frameworksThey why behind php frameworks
They why behind php frameworksKirk Madera
 
Zend expressive workshop
Zend expressive workshopZend expressive workshop
Zend expressive workshopAdam Culp
 
2014 11 20 Drupal 7 -> 8 test migratie
2014 11 20 Drupal 7 -> 8 test migratie2014 11 20 Drupal 7 -> 8 test migratie
2014 11 20 Drupal 7 -> 8 test migratiehcderaad
 
Refactoring PHP
Refactoring PHPRefactoring PHP
Refactoring PHPAdam Culp
 
Standard Coding, OOP Techniques and Code Reuse
Standard Coding, OOP Techniques and Code ReuseStandard Coding, OOP Techniques and Code Reuse
Standard Coding, OOP Techniques and Code ReuseRayhan Chowdhury
 
An Introduction to Scrum: presented at PyTexas 2012
An Introduction to Scrum: presented at PyTexas 2012An Introduction to Scrum: presented at PyTexas 2012
An Introduction to Scrum: presented at PyTexas 2012Tomo Popovic
 
Kylin Engineering Principles
Kylin Engineering PrinciplesKylin Engineering Principles
Kylin Engineering PrinciplesXu Jiang
 
Keeping code clean
Keeping code cleanKeeping code clean
Keeping code cleanBrett Child
 
Angular Ivy- An Overview
Angular Ivy- An OverviewAngular Ivy- An Overview
Angular Ivy- An OverviewJalpesh Vadgama
 
Behat Workshop at WeLovePHP
Behat Workshop at WeLovePHPBehat Workshop at WeLovePHP
Behat Workshop at WeLovePHPMarcos Quesada
 
04 Functional Programming in Python
04 Functional Programming in Python04 Functional Programming in Python
04 Functional Programming in PythonEbad ullah Qureshi
 

Similar to Refactoring 101 (20)

Refactoring Legacy Code
Refactoring Legacy CodeRefactoring Legacy Code
Refactoring Legacy Code
 
Prashant technical practices-tdd for xebia event
Prashant   technical practices-tdd for xebia eventPrashant   technical practices-tdd for xebia event
Prashant technical practices-tdd for xebia event
 
Code refactoring
Code refactoringCode refactoring
Code refactoring
 
Workshop: Refactoring Legacy PHP: The Complete Guide
Workshop: Refactoring Legacy PHP: The Complete Guide Workshop: Refactoring Legacy PHP: The Complete Guide
Workshop: Refactoring Legacy PHP: The Complete Guide
 
Converting Your Legacy Data to S1000D
Converting Your Legacy Data to S1000DConverting Your Legacy Data to S1000D
Converting Your Legacy Data to S1000D
 
Peephole optimization techniques in compiler design
Peephole optimization techniques in compiler designPeephole optimization techniques in compiler design
Peephole optimization techniques in compiler design
 
The Power Of Refactoring (php|tek 09)
The Power Of Refactoring (php|tek 09)The Power Of Refactoring (php|tek 09)
The Power Of Refactoring (php|tek 09)
 
Refactoring: Improving the design of existing code
Refactoring: Improving the design of existing codeRefactoring: Improving the design of existing code
Refactoring: Improving the design of existing code
 
They why behind php frameworks
They why behind php frameworksThey why behind php frameworks
They why behind php frameworks
 
Zend expressive workshop
Zend expressive workshopZend expressive workshop
Zend expressive workshop
 
2014 11 20 Drupal 7 -> 8 test migratie
2014 11 20 Drupal 7 -> 8 test migratie2014 11 20 Drupal 7 -> 8 test migratie
2014 11 20 Drupal 7 -> 8 test migratie
 
Refactoring PHP
Refactoring PHPRefactoring PHP
Refactoring PHP
 
Standard Coding, OOP Techniques and Code Reuse
Standard Coding, OOP Techniques and Code ReuseStandard Coding, OOP Techniques and Code Reuse
Standard Coding, OOP Techniques and Code Reuse
 
An Introduction to Scrum: presented at PyTexas 2012
An Introduction to Scrum: presented at PyTexas 2012An Introduction to Scrum: presented at PyTexas 2012
An Introduction to Scrum: presented at PyTexas 2012
 
Kylin Engineering Principles
Kylin Engineering PrinciplesKylin Engineering Principles
Kylin Engineering Principles
 
Keeping code clean
Keeping code cleanKeeping code clean
Keeping code clean
 
Angular Ivy- An Overview
Angular Ivy- An OverviewAngular Ivy- An Overview
Angular Ivy- An Overview
 
Behat Workshop at WeLovePHP
Behat Workshop at WeLovePHPBehat Workshop at WeLovePHP
Behat Workshop at WeLovePHP
 
04 Functional Programming in Python
04 Functional Programming in Python04 Functional Programming in Python
04 Functional Programming in Python
 
Optimizing performance
Optimizing performanceOptimizing performance
Optimizing performance
 

More from Adam Culp

Putting legacy to REST with middleware
Putting legacy to REST with middlewarePutting legacy to REST with middleware
Putting legacy to REST with middlewareAdam Culp
 
Release your refactoring superpower
Release your refactoring superpowerRelease your refactoring superpower
Release your refactoring superpowerAdam Culp
 
Managing Technical Debt
Managing Technical DebtManaging Technical Debt
Managing Technical DebtAdam Culp
 
Developing PHP Applications Faster
Developing PHP Applications FasterDeveloping PHP Applications Faster
Developing PHP Applications FasterAdam Culp
 
Containing Quality
Containing QualityContaining Quality
Containing QualityAdam Culp
 
Debugging elephpants
Debugging elephpantsDebugging elephpants
Debugging elephpantsAdam Culp
 
Expressive Microservice Framework Blastoff
Expressive Microservice Framework BlastoffExpressive Microservice Framework Blastoff
Expressive Microservice Framework BlastoffAdam Culp
 
Foundations of Zend Framework
Foundations of Zend FrameworkFoundations of Zend Framework
Foundations of Zend FrameworkAdam Culp
 
Accidental professional
Accidental professionalAccidental professional
Accidental professionalAdam Culp
 
Build great products
Build great productsBuild great products
Build great productsAdam Culp
 
Does Your Code Measure Up?
Does Your Code Measure Up?Does Your Code Measure Up?
Does Your Code Measure Up?Adam Culp
 
Practical PHP Deployment with Jenkins
Practical PHP Deployment with JenkinsPractical PHP Deployment with Jenkins
Practical PHP Deployment with JenkinsAdam Culp
 
Virtualizing Development
Virtualizing DevelopmentVirtualizing Development
Virtualizing DevelopmentAdam Culp
 
Deprecated: Foundations of Zend Framework 2
Deprecated: Foundations of Zend Framework 2Deprecated: Foundations of Zend Framework 2
Deprecated: Foundations of Zend Framework 2Adam Culp
 
Clean application development tutorial
Clean application development tutorialClean application development tutorial
Clean application development tutorialAdam Culp
 
Essential git for developers
Essential git for developersEssential git for developers
Essential git for developersAdam Culp
 
Vagrant for Virtualized Development
Vagrant for Virtualized DevelopmentVagrant for Virtualized Development
Vagrant for Virtualized DevelopmentAdam Culp
 
Clean application development (talk)
Clean application development (talk)Clean application development (talk)
Clean application development (talk)Adam Culp
 

More from Adam Culp (20)

Hypermedia
HypermediaHypermedia
Hypermedia
 
Putting legacy to REST with middleware
Putting legacy to REST with middlewarePutting legacy to REST with middleware
Putting legacy to REST with middleware
 
php-1701-a
php-1701-aphp-1701-a
php-1701-a
 
Release your refactoring superpower
Release your refactoring superpowerRelease your refactoring superpower
Release your refactoring superpower
 
Managing Technical Debt
Managing Technical DebtManaging Technical Debt
Managing Technical Debt
 
Developing PHP Applications Faster
Developing PHP Applications FasterDeveloping PHP Applications Faster
Developing PHP Applications Faster
 
Containing Quality
Containing QualityContaining Quality
Containing Quality
 
Debugging elephpants
Debugging elephpantsDebugging elephpants
Debugging elephpants
 
Expressive Microservice Framework Blastoff
Expressive Microservice Framework BlastoffExpressive Microservice Framework Blastoff
Expressive Microservice Framework Blastoff
 
Foundations of Zend Framework
Foundations of Zend FrameworkFoundations of Zend Framework
Foundations of Zend Framework
 
Accidental professional
Accidental professionalAccidental professional
Accidental professional
 
Build great products
Build great productsBuild great products
Build great products
 
Does Your Code Measure Up?
Does Your Code Measure Up?Does Your Code Measure Up?
Does Your Code Measure Up?
 
Practical PHP Deployment with Jenkins
Practical PHP Deployment with JenkinsPractical PHP Deployment with Jenkins
Practical PHP Deployment with Jenkins
 
Virtualizing Development
Virtualizing DevelopmentVirtualizing Development
Virtualizing Development
 
Deprecated: Foundations of Zend Framework 2
Deprecated: Foundations of Zend Framework 2Deprecated: Foundations of Zend Framework 2
Deprecated: Foundations of Zend Framework 2
 
Clean application development tutorial
Clean application development tutorialClean application development tutorial
Clean application development tutorial
 
Essential git for developers
Essential git for developersEssential git for developers
Essential git for developers
 
Vagrant for Virtualized Development
Vagrant for Virtualized DevelopmentVagrant for Virtualized Development
Vagrant for Virtualized Development
 
Clean application development (talk)
Clean application development (talk)Clean application development (talk)
Clean application development (talk)
 

Recently uploaded

Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rick Flair
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????blackmambaettijean
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 

Recently uploaded (20)

Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 

Refactoring 101

  • 1. Refactoring 101 By: Adam Culp Twitter: @adamculp https://joind.in/14927
  • 2. 2 Refactoring 101 ● About me – PHP 5.3 Certified – Consultant at Zend Technologies – Organizer SoFloPHP (South Florida) – Organized SunshinePHP (Miami) – Long distance (ultra) runner – Judo Black Belt Instructor
  • 3. 3 Refactoring 101 ● Fan of iteration – Pretty much everything requires iteration to do well: ● Long distance running ● Judo ● Development ● Evading project managers ● Refactoring!
  • 4. 4 Refactoring 101 ● About talk – Based on “Refactoring; Improving The Design of Existing Code” book, by Martin Fowler. – https://github.com/adamculp/refactoring101 – for PHP code samples
  • 5. 6 Refactoring 101 ● What is “refactoring”? – “...process of changing a computer program's source code without modifying its external functional behavior...” en.wikipedia.org/wiki/Refactoring – Should not add functionality – Simplify code – Improve code readability
  • 6. 7 Refactoring 101 ● Two hats – Adding Functionality Hat – Refactoring Hat – We add functionality, then refactor, then add more functionality ...
  • 7. 8 Refactoring 101 ● Then optimize – Do not optimize while refactoring – Separate step – Refactoring is NOT optimizing
  • 8. 9 Refactoring 101 ● Why refactor? – Prevent decay – Preserve or fix design – Reduce duplication – Improve maintainability – Helps us code faster – Locate bugs – Code smells
  • 9. 10 Refactoring 101 ● Code “smells” – What are “smells”? ● Indications of spoiled code nearby ● Not conclusive ● The “smell” is not bad
  • 10. 11 Refactoring 101 ● Code “smells” – “Smells” hinting a refactor may be needed: ● Duplicate Code (rule of 3) ● Long Methods ● Large Class ● Long Parameter (argument) List ● Divergent Change – cascade change to accommodate another ● Shotgun Surgery – change ripples as bugs ● Feature Envy – method uses parts from other class ● Switch Statements – sacrifice polymorphism
  • 11. 12 Refactoring 101 ● Code “smells” – Cont'd: ● Lazy Class – class not doing much ● Speculative Generality – something built for possible future ● Temporary Field/Variable ● Message Chains – object asking object asking object ● Middle Man – directors in place but serve no real purpose ● Inappropriate Intimacy – classes share private parts ● Data Class – getters and setters, but nothing else ● Comments – where comments cover bad code
  • 12. 14 Refactoring 101 ● Tools to highlight smells – PHPqatools.org ● PHPUnit ● PHPLoc ● PHP_Codesniffer ● PHP_Depend ● PHP Copy/Paste Detector ● PHP Mess Detector ● PHP Dead Code Detector
  • 13. 15 Refactoring 101 ● Realtime profiling – Zend Z-Ray
  • 14. 16 Refactoring 101 ● Rewrite vs Refactor – Rewrite = perceived easy road – Refactor = best teacher – Business arguments ● Budget ● Time ● Retain business logic
  • 15. 17 Refactoring 101 ● When to rewrite – Want a new app ● Not just better coded current app – Business logic change – Target market change – Framework integration or change
  • 16. 18 Refactoring 101 ● When to refactor? – No “special” time – Short bursts – Refactor to gain something – Prior to adding functionality – When fixing a bug – During code review
  • 17. 19 Refactoring 101 ● What do I tell my manager? (justification) – Tech savvy manager = not be hard to explain the benefits. – Quality centric manager = stress quality aspects. ● Introduce as a review process. ● Many resources on Google. – Schedule driven manager = Don't tell (controversial?). ● Find a way to work it in. ● Overall it saves time, but some will never “see” it.
  • 18. 20 Refactoring 101 ● First steps – Use source control (Git, SVN, etc.) ● Records steps, provides rollback ● Auditable – GET IT WORKING ● Do NOT refactor broken – Create consistent data – Create tests
  • 19. 21 Refactoring 101 ● Tests and refactoring – Basic refactor steps ● Ensure tests pass ● Plan refactor ● Implement ● Ensure tests still pass – Updating tests if needed – Add more tests to cover newly discovered items ● Repeat!
  • 20. 22 Refactoring 101 Let's look at the code! ● Example – Lets look at a code example. – Tips and descriptions during steps. – Our Task: ● Video Rental Company has asked for an HTML representation of their customer statement to be created.
  • 27. 29 Refactoring 101 ● Code summary: What did we see? – Method statement()→ ● Too long ● Not reusable for HTML version ● Switch sacrificing polymorphism ● Determining class/type ● Calculating rental price, frequent renter points, grant total
  • 28. 30 Refactoring 101 ● Additional notes – Cannot change how movies are classified. – Customers always changes, not easy in current state. ● Movie classification ● Frequent renter points ● Rental days per type ● Price calculation
  • 29. 31 Refactoring 101 ● Objective: – Clean up statement(). ● Shorten – Extract code to encapsulate functionality – Extract business logic to keep DRY
  • 31. 33 Refactoring 101 ● Extract method – Moves a functionality to it's own method. ● Encapsulate calculation of each rental. ● Shorten statement() method.
  • 32. 34 Refactoring 101 ● Extract method cont'd. – We now have a new method amountFor().
  • 33. 35 Refactoring 101 ● Rename variables – Renaming $each to $rental – Improves readability. – Relate intent.
  • 34. 36 Refactoring 101 ● Renaming variables, cont'd. – Renamed $each to $rental, and also changed $thisAmount to become $result for clarity.
  • 35. 37 Refactoring 101 ● Rename method – Rename amountFor() to getCharge(). – Self documenting.
  • 36. 38 Refactoring 101 ● Move method – Move getCharge() from Customer to Rental. ● Relies on Rental data. – Already have Rental object, no need to pass $rental.
  • 37. 39 Refactoring 101 ● Move method cont'd – Now calls getDaysRented() directly. – Returns charge of Rental, as it should. ● Building rental charge in customer was misplaced.
  • 38. 40 Refactoring 101 ● Replace temp with query – Remove temporary variable and call Rental->getCharge() direct. ● Less future maintenance. ● Makes code clearer.
  • 39. 41 Refactoring 101 ● Extract method – $frequentRenterPoints calculation extracted to getFrequentRenterPoints(), and move it in the Rental class.
  • 40. 42 Refactoring 101 ● Replace temp with query – Encapsulate logic and generation of grand total. – Promotes DRY. – Remove $totalAmount temporary variable.
  • 41. 43 Refactoring 101 ● Replace temp with query – Encapsulate logic and generation of frequent renter points. – Promotes DRY. – Remove $frequentRentalPoints temporary variable.
  • 42. 44 Refactoring 101 ● Create HTML statement – Create HTML version. – Rename original as text version.
  • 43. 45 Refactoring 101 ● Execution – Can call either Text or HTML versions.
  • 44. 46 Refactoring 101 ● Recap – Most refactoring reduces code ● More self-documenting ● More flexibility ● More testable – 3 loops (getFrequentRenterPoints, getTotalCharge, and statement) ● Isolates calculations ● Enabled multiple statements (text/html) – Optimizing and refactoring = different ● Refactor, then optimize – Future = separation of concerns
  • 45. 59 Refactoring 101 ● Conclusion – Do not refactor a broken application – Always have tests in place prior to refactor ● Unit tests or ● Functional tests or ● Manual tests – Leave code cleaner than you got it – Try NOT to rewrite – Learn to “smell” problems – Love iteration!
  • 46. ● Thank you! – Code: https://github.com/adamculp/refactoring101 – Please rate at: https://joind.in/14927 Adam Culp http://www.geekyboy.com http://RunGeekRadio.com Twitter @adamculp