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 (20)

Refactoring and code smells
Refactoring and code smellsRefactoring and code smells
Refactoring and code smells
 
Code Smells and Its type (With Example)
Code Smells and Its type (With Example)Code Smells and Its type (With Example)
Code Smells and Its type (With Example)
 
Clean code
Clean codeClean code
Clean code
 
Code Smells
Code SmellsCode Smells
Code Smells
 
Clean code - DSC DYPCOE
Clean code - DSC DYPCOEClean code - DSC DYPCOE
Clean code - DSC DYPCOE
 
Clean code
Clean codeClean code
Clean code
 
Refactoring
RefactoringRefactoring
Refactoring
 
Dependency Inversion Principle
Dependency Inversion PrincipleDependency Inversion Principle
Dependency Inversion Principle
 
Clean code
Clean codeClean code
Clean code
 
Clean code: SOLID
Clean code: SOLIDClean code: SOLID
Clean code: SOLID
 
Art of refactoring - Code Smells and Microservices Antipatterns
Art of refactoring - Code Smells and Microservices AntipatternsArt of refactoring - Code Smells and Microservices Antipatterns
Art of refactoring - Code Smells and Microservices Antipatterns
 
Introducing Clean Architecture
Introducing Clean ArchitectureIntroducing Clean Architecture
Introducing Clean Architecture
 
Bad Code Smells
Bad Code SmellsBad Code Smells
Bad Code Smells
 
Clean code
Clean codeClean code
Clean code
 
SOLID Design Principles
SOLID Design PrinciplesSOLID Design Principles
SOLID Design Principles
 
Onion architecture
Onion architectureOnion architecture
Onion architecture
 
Java OCA teoria 4
Java OCA teoria 4Java OCA teoria 4
Java OCA teoria 4
 
Clean architecture - Protecting the Domain
Clean architecture - Protecting the DomainClean architecture - Protecting the Domain
Clean architecture - Protecting the Domain
 
Angular
AngularAngular
Angular
 
Solid principles
Solid principlesSolid principles
Solid principles
 

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 (9)

Code Refactoring
Code RefactoringCode Refactoring
Code Refactoring
 
Design patterns
Design patternsDesign patterns
Design patterns
 
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
 
Code Refactoring
Code RefactoringCode Refactoring
Code Refactoringkim.mens
 

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
 
Code Refactoring
Code RefactoringCode Refactoring
Code Refactoring
 

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

Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESmohitsingh558521
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
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
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
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
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
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
 
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
 
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
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
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
 

Recently uploaded (20)

Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
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
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
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
 
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
 
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
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
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
 

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