SlideShare a Scribd company logo
1 of 23
Download to read offline
Refactoring 2 TheMaxRefactoring 2 TheMax
Diego Guidi & Alfredo MorresiDiego Guidi & Alfredo Morresi
staff@dotnetmarche.orgstaff@dotnetmarche.org
Shit happensShit happens
Anything that can go wrong will goAnything that can go wrong will go
wrong.wrong.
(Arthur Bloch)(Arthur Bloch)
UnderengineeringUnderengineering
AKA "fast, slow, slower.... never :("AKA "fast, slow, slower.... never :("
 quickly deliver 1.0 release that works well for ourquickly deliver 1.0 release that works well for our
customers but with junky codecustomers but with junky code
 working on 2.0 release, junky code slows you down,working on 2.0 release, junky code slows you down,
and new features are harder to implementand new features are harder to implement
 as junky code multiplies, people lose faith into theas junky code multiplies, people lose faith into the
system and the programmerssystem and the programmers
 planning next release, you realize you can't win, andplanning next release, you realize you can't win, and
start thinking about a total rewritestart thinking about a total rewrite
OverengineeringOverengineering
AKA "the 'HelloWorld' pattern"AKA "the 'HelloWorld' pattern"
 code more sophisticated that it possible futurecode more sophisticated that it possible future
requirementsrequirements
 code hard to understand for new onescode hard to understand for new ones
 time wasted understanding and maintaining complextime wasted understanding and maintaining complex
code so you need to write documentationcode so you need to write documentation
Code smellsCode smells
 copy/paste (duplicate) codecopy/paste (duplicate) code
 large method/classlarge method/class
 method-like propertiesmethod-like properties
 contrived complexity (patterns everywhere!)contrived complexity (patterns everywhere!)
 inappropriate intimacyinappropriate intimacy
 unused codeunused code
 dangerous if (if - else if - else if - else...)dangerous if (if - else if - else if - else...)
Cunningham's metaphorCunningham's metaphor
The technical language doesn't communicateThe technical language doesn't communicate
effectively with the vast majority of management.effectively with the vast majority of management.
Instead, Ward Cunningham's financial metaphor ofInstead, Ward Cunningham's financial metaphor of
design debt works infinitely better.design debt works infinitely better.
Design debt occurs when you don't consistently doDesign debt occurs when you don't consistently do
three things.three things.
1. Remove duplication.1. Remove duplication.
2. Simplify your code.2. Simplify your code.
3. Clarify you code's intent.3. Clarify you code's intent.
Cunningham's metaphorCunningham's metaphor
Few systems remain completely free of design debt.Few systems remain completely free of design debt.
Wired as we are, humans just don't write perfect codeWired as we are, humans just don't write perfect code
the first time around. We naturally accumulate designthe first time around. We naturally accumulate design
debt. So the question becomes:debt. So the question becomes:
"When do you pay it down?""When do you pay it down?"
And so, refactoring!And so, refactoring!
Refactoring is the process of changing a softwareRefactoring is the process of changing a software
system in such a way that it does not alter the externalsystem in such a way that it does not alter the external
behavior of the code yet improves its internalbehavior of the code yet improves its internal
structure.structure.
A refactoring is a "behavior-preserving transformation"A refactoring is a "behavior-preserving transformation"
or, as Martin Fowler defines it, "a change made to theor, as Martin Fowler defines it, "a change made to the
internal structure of software to make it easier tointernal structure of software to make it easier to
understand and cheaper to modify without changing itsunderstand and cheaper to modify without changing its
observable behavior"observable behavior"
Why refactoring?Why refactoring?
 Code i wrote yesterday is worse that code i'm writingCode i wrote yesterday is worse that code i'm writing
todaytoday
 Make it easier to add new codeMake it easier to add new code
 Improve the design of existing codeImprove the design of existing code
 Gain a better understanding of codeGain a better understanding of code
 Make coding less annoyingMake coding less annoying
 Readability / Testability / EstensibilityReadability / Testability / Estensibility
 bugs correctionbugs correction
 ......
When refactoring?When refactoring?
 Keeping code clean is a lot like keeping a roomKeeping code clean is a lot like keeping a room
clean. Once your room becomes a mess, it becomesclean. Once your room becomes a mess, it becomes
harder to clean. The worse the mess becomes, theharder to clean. The worse the mess becomes, the
less you want to clean it.less you want to clean it.
 It's best to refactor continuously, rather than inIt's best to refactor continuously, rather than in
phases. When you see code that needsphases. When you see code that needs
improvement, improve it.improvement, improve it.
 On the other hand, if your manager needs you toOn the other hand, if your manager needs you to
finish a feature before a demo that just gotfinish a feature before a demo that just got
scheduled for tomorrow, finish the feature andscheduled for tomorrow, finish the feature and
refactor later!refactor later!
When NOT refactoring?When NOT refactoring?
 If it's working, don't changeIf it's working, don't change
 if you have a poorly factored programif you have a poorly factored program
 if your code isn't tested, that does what theif your code isn't tested, that does what the
customer wants and has no serious bugs, leave itcustomer wants and has no serious bugs, leave it
alone!alone!
 performance matters...performance matters...
How refactoringHow refactoring
Refactoring recipesRefactoring recipes
 extract superclass/interfaceextract superclass/interface
 rename method/property/variablerename method/property/variable
 replace conditional with polymorphismreplace conditional with polymorphism
 replace constructor with factory methodreplace constructor with factory method
 inline methodinline method
 even more:even more: http://www.refactoring.com/cataloghttp://www.refactoring.com/catalog
How refactoringHow refactoring
Only refactor when refactoring -- do not add featureOnly refactor when refactoring -- do not add feature
during refactoring.during refactoring.
Refactoring, or improving the design of existing code,Refactoring, or improving the design of existing code,
requires that you know what code needs improvement.requires that you know what code needs improvement.
How refactoringHow refactoring
Each transformation (called a "Refactoring") does little,Each transformation (called a "Refactoring") does little,
but a sequence of transformations can produce abut a sequence of transformations can produce a
significant restructuring.significant restructuring.
The system is also kept fully working after each smallThe system is also kept fully working after each small
refactoring, reducing the chances that a system canrefactoring, reducing the chances that a system can
get seriously broken during the restructuring process.get seriously broken during the restructuring process.
How refactoringHow refactoring
If you want to refactor, the essentialIf you want to refactor, the essential
precondition is having solid testprecondition is having solid test
(Martin Fowler)(Martin Fowler)
Test-Driven DevelopmentTest-Driven Development
Test-driven development (TDD) and continuousTest-driven development (TDD) and continuous
refactoring enable the efficient evolution of workingrefactoring enable the efficient evolution of working
code by turning programming into a dialogue.code by turning programming into a dialogue.
Test-Driven DevelopmentTest-Driven Development
AskAsk: You ask a question of a system by writing a test.: You ask a question of a system by writing a test.
RespondRespond: You respond to the question by writing: You respond to the question by writing
code to pass the test.code to pass the test.
RefineRefine: You refine your response by consolidating: You refine your response by consolidating
ideas, weeding out inessentials, and clarifyingideas, weeding out inessentials, and clarifying
ambiguities.ambiguities.
RepeatRepeat: You keep the dialogue going by asking the: You keep the dialogue going by asking the
next question.next question.
Refactoring and patternRefactoring and pattern
There is a natural relation betweenThere is a natural relation between
patterns and refactorings. Patternspatterns and refactorings. Patterns
are where you want to be;are where you want to be;
refactorings are ways to get thererefactorings are ways to get there
from somewhere else.from somewhere else.
(Fowler Martin)(Fowler Martin)
Refactoring and patternRefactoring and pattern
 Each pattern is a three-part rule, which expresses aEach pattern is a three-part rule, which expresses a
relation between a certain context, a problem, and arelation between a certain context, a problem, and a
solution.solution.
 There are many ways to implement a pattern. If youThere are many ways to implement a pattern. If you
don't know patterns, you're less likely to evolve greatdon't know patterns, you're less likely to evolve great
designs. Patterns capture wisdom. Reusing thatdesigns. Patterns capture wisdom. Reusing that
wisdom is extremely useful, also when refactoring.wisdom is extremely useful, also when refactoring.
ReadingsReadings
 Refactoring: Improving the Design of Existing CodeRefactoring: Improving the Design of Existing Code
(Martin Fowler)(Martin Fowler)
 Refactoring to patternsRefactoring to patterns
(Joshua Kerievsky)(Joshua Kerievsky)
 Design Patterns: Elements of Reusable Object-Design Patterns: Elements of Reusable Object-
Oriented SoftwareOriented Software
(Gang of Four)(Gang of Four)
 The Pragmatic ProgrammerThe Pragmatic Programmer
(Andrew Hunt and David Thomas)(Andrew Hunt and David Thomas)
The sage final sentenceThe sage final sentence
Any fool can write codeAny fool can write code
that a computer canthat a computer can
understand. Goodunderstand. Good
programmers write codeprogrammers write code
that humans canthat humans can
understand.understand.
(M. F.)(M. F.)
Questions?Questions?
The Must-Have Productivity Tool for .NET DevelopersThe Must-Have Productivity Tool for .NET Developers
PROsPROs
 intellisenseintellisense
 code searchcode search
 test runnertest runner
 code generationcode generation
 background analysisbackground analysis
CONsCONs
 commercial licensecommercial license
 needs a lot of ram!needs a lot of ram!
 a little bit buggya little bit buggy

More Related Content

Similar to Refactoring 2TheMax (con ReSharper)

2018 01-29 - brewbox - refactoring. sempre, senza pietà
2018 01-29 - brewbox - refactoring. sempre, senza pietà2018 01-29 - brewbox - refactoring. sempre, senza pietà
2018 01-29 - brewbox - refactoring. sempre, senza pietàRoberto Albertini
 
Taming Big Balls of Mud with Diligence, Agile Practices, and Hard Work
Taming Big Balls of Mud with Diligence, Agile Practices, and Hard WorkTaming Big Balls of Mud with Diligence, Agile Practices, and Hard Work
Taming Big Balls of Mud with Diligence, Agile Practices, and Hard WorkJoseph Yoder
 
Planning JavaScript and Ajax for larger teams
Planning JavaScript and Ajax for larger teamsPlanning JavaScript and Ajax for larger teams
Planning JavaScript and Ajax for larger teamsChristian Heilmann
 
Clean Code - The Next Chapter
Clean Code - The Next ChapterClean Code - The Next Chapter
Clean Code - The Next ChapterVictor Rentea
 
Paris Web - Javascript as a programming language
Paris Web - Javascript as a programming languageParis Web - Javascript as a programming language
Paris Web - Javascript as a programming languageMarco Cedaro
 
Building frameworks: from concept to completion
Building frameworks: from concept to completionBuilding frameworks: from concept to completion
Building frameworks: from concept to completionRuben Goncalves
 
Managing and evolving JavaScript Code
Managing and evolving JavaScript CodeManaging and evolving JavaScript Code
Managing and evolving JavaScript CodeJean Carlo Emer
 
WordCamp Nashville: Clean Code for WordPress
WordCamp Nashville: Clean Code for WordPressWordCamp Nashville: Clean Code for WordPress
WordCamp Nashville: Clean Code for WordPressmtoppa
 
Clean Code Software Engineering
Clean Code Software Engineering Clean Code Software Engineering
Clean Code Software Engineering Inocentshuja Ahmad
 
The Ember.js Framework - Everything You Need To Know
The Ember.js Framework - Everything You Need To KnowThe Ember.js Framework - Everything You Need To Know
The Ember.js Framework - Everything You Need To KnowAll Things Open
 
Everything you Wanted to Know About Refactoring
Everything you Wanted to Know About RefactoringEverything you Wanted to Know About Refactoring
Everything you Wanted to Know About RefactoringGary Short
 
A sweet taste of clean code and software design
A sweet taste of clean code and software designA sweet taste of clean code and software design
A sweet taste of clean code and software designKfir Bloch
 
Code Quality Makes Your Job Easier
Code Quality Makes Your Job EasierCode Quality Makes Your Job Easier
Code Quality Makes Your Job EasierTonya Mork
 
Rule jenkins with configuration as code
Rule jenkins with configuration as codeRule jenkins with configuration as code
Rule jenkins with configuration as codeChristian Rasp
 
Refactoring - An Introduction
Refactoring - An IntroductionRefactoring - An Introduction
Refactoring - An IntroductionGiorgio Vespucci
 
What's new in CQ 5.3? Top 10 features.
What's new in CQ 5.3? Top 10 features.What's new in CQ 5.3? Top 10 features.
What's new in CQ 5.3? Top 10 features.David Nuescheler
 
Mob Programming for Continuous Learning
Mob Programming for Continuous LearningMob Programming for Continuous Learning
Mob Programming for Continuous LearningMike Clement
 
Code Excellence for the Average Programmer
Code Excellence for the Average ProgrammerCode Excellence for the Average Programmer
Code Excellence for the Average ProgrammerLlewellyn Falco
 
Loosely Coupled Complexity - Unleash the power of your Domain Model with Comm...
Loosely Coupled Complexity - Unleash the power of your Domain Model with Comm...Loosely Coupled Complexity - Unleash the power of your Domain Model with Comm...
Loosely Coupled Complexity - Unleash the power of your Domain Model with Comm...Alberto Brandolini
 

Similar to Refactoring 2TheMax (con ReSharper) (20)

2018 01-29 - brewbox - refactoring. sempre, senza pietà
2018 01-29 - brewbox - refactoring. sempre, senza pietà2018 01-29 - brewbox - refactoring. sempre, senza pietà
2018 01-29 - brewbox - refactoring. sempre, senza pietà
 
Taming Big Balls of Mud with Diligence, Agile Practices, and Hard Work
Taming Big Balls of Mud with Diligence, Agile Practices, and Hard WorkTaming Big Balls of Mud with Diligence, Agile Practices, and Hard Work
Taming Big Balls of Mud with Diligence, Agile Practices, and Hard Work
 
Planning JavaScript and Ajax for larger teams
Planning JavaScript and Ajax for larger teamsPlanning JavaScript and Ajax for larger teams
Planning JavaScript and Ajax for larger teams
 
Clean Code - The Next Chapter
Clean Code - The Next ChapterClean Code - The Next Chapter
Clean Code - The Next Chapter
 
Paris Web - Javascript as a programming language
Paris Web - Javascript as a programming languageParis Web - Javascript as a programming language
Paris Web - Javascript as a programming language
 
Building frameworks: from concept to completion
Building frameworks: from concept to completionBuilding frameworks: from concept to completion
Building frameworks: from concept to completion
 
Managing and evolving JavaScript Code
Managing and evolving JavaScript CodeManaging and evolving JavaScript Code
Managing and evolving JavaScript Code
 
WordCamp Nashville: Clean Code for WordPress
WordCamp Nashville: Clean Code for WordPressWordCamp Nashville: Clean Code for WordPress
WordCamp Nashville: Clean Code for WordPress
 
10 Ways To Improve Your Code
10 Ways To Improve Your Code10 Ways To Improve Your Code
10 Ways To Improve Your Code
 
Clean Code Software Engineering
Clean Code Software Engineering Clean Code Software Engineering
Clean Code Software Engineering
 
The Ember.js Framework - Everything You Need To Know
The Ember.js Framework - Everything You Need To KnowThe Ember.js Framework - Everything You Need To Know
The Ember.js Framework - Everything You Need To Know
 
Everything you Wanted to Know About Refactoring
Everything you Wanted to Know About RefactoringEverything you Wanted to Know About Refactoring
Everything you Wanted to Know About Refactoring
 
A sweet taste of clean code and software design
A sweet taste of clean code and software designA sweet taste of clean code and software design
A sweet taste of clean code and software design
 
Code Quality Makes Your Job Easier
Code Quality Makes Your Job EasierCode Quality Makes Your Job Easier
Code Quality Makes Your Job Easier
 
Rule jenkins with configuration as code
Rule jenkins with configuration as codeRule jenkins with configuration as code
Rule jenkins with configuration as code
 
Refactoring - An Introduction
Refactoring - An IntroductionRefactoring - An Introduction
Refactoring - An Introduction
 
What's new in CQ 5.3? Top 10 features.
What's new in CQ 5.3? Top 10 features.What's new in CQ 5.3? Top 10 features.
What's new in CQ 5.3? Top 10 features.
 
Mob Programming for Continuous Learning
Mob Programming for Continuous LearningMob Programming for Continuous Learning
Mob Programming for Continuous Learning
 
Code Excellence for the Average Programmer
Code Excellence for the Average ProgrammerCode Excellence for the Average Programmer
Code Excellence for the Average Programmer
 
Loosely Coupled Complexity - Unleash the power of your Domain Model with Comm...
Loosely Coupled Complexity - Unleash the power of your Domain Model with Comm...Loosely Coupled Complexity - Unleash the power of your Domain Model with Comm...
Loosely Coupled Complexity - Unleash the power of your Domain Model with Comm...
 

More from DotNetMarche

Creare una community dal basso ed arrivare ad un'azienda milionaria - Emanue...
Creare una community dal basso ed arrivare ad un'azienda milionaria  - Emanue...Creare una community dal basso ed arrivare ad un'azienda milionaria  - Emanue...
Creare una community dal basso ed arrivare ad un'azienda milionaria - Emanue...DotNetMarche
 
Metriche per Zombie Communities: come "iniettare vita" in tribù di morti vive...
Metriche per Zombie Communities: come "iniettare vita" in tribù di morti vive...Metriche per Zombie Communities: come "iniettare vita" in tribù di morti vive...
Metriche per Zombie Communities: come "iniettare vita" in tribù di morti vive...DotNetMarche
 
UI Composition - Prism
UI Composition - PrismUI Composition - Prism
UI Composition - PrismDotNetMarche
 
Model-View-ViewModel
Model-View-ViewModelModel-View-ViewModel
Model-View-ViewModelDotNetMarche
 
Refactoring ASP.NET and beyond
Refactoring ASP.NET and beyondRefactoring ASP.NET and beyond
Refactoring ASP.NET and beyondDotNetMarche
 
Silverlight in Action
Silverlight in ActionSilverlight in Action
Silverlight in ActionDotNetMarche
 
Silverlight in Action
Silverlight in ActionSilverlight in Action
Silverlight in ActionDotNetMarche
 
Soluzioni Microsoft per l'e-Learning
Soluzioni Microsoft per l'e-LearningSoluzioni Microsoft per l'e-Learning
Soluzioni Microsoft per l'e-LearningDotNetMarche
 
Installing and Administering MOSS
Installing and Administering MOSSInstalling and Administering MOSS
Installing and Administering MOSSDotNetMarche
 
Microsoft SharePoint Server 2007 Technical Overview
Microsoft SharePoint Server 2007 Technical OverviewMicrosoft SharePoint Server 2007 Technical Overview
Microsoft SharePoint Server 2007 Technical OverviewDotNetMarche
 
[Hands on] testing asp.net mvc
[Hands on] testing asp.net mvc[Hands on] testing asp.net mvc
[Hands on] testing asp.net mvcDotNetMarche
 
Asp.NET MVC Framework
Asp.NET MVC FrameworkAsp.NET MVC Framework
Asp.NET MVC FrameworkDotNetMarche
 
Introduzione al Testing
Introduzione al TestingIntroduzione al Testing
Introduzione al TestingDotNetMarche
 
Introduzione a CardSpace
Introduzione a CardSpaceIntroduzione a CardSpace
Introduzione a CardSpaceDotNetMarche
 
Introduzione a Workflow Foundation
Introduzione a Workflow FoundationIntroduzione a Workflow Foundation
Introduzione a Workflow FoundationDotNetMarche
 

More from DotNetMarche (20)

Creare una community dal basso ed arrivare ad un'azienda milionaria - Emanue...
Creare una community dal basso ed arrivare ad un'azienda milionaria  - Emanue...Creare una community dal basso ed arrivare ad un'azienda milionaria  - Emanue...
Creare una community dal basso ed arrivare ad un'azienda milionaria - Emanue...
 
Metriche per Zombie Communities: come "iniettare vita" in tribù di morti vive...
Metriche per Zombie Communities: come "iniettare vita" in tribù di morti vive...Metriche per Zombie Communities: come "iniettare vita" in tribù di morti vive...
Metriche per Zombie Communities: come "iniettare vita" in tribù di morti vive...
 
WPF 4 fun
WPF 4 funWPF 4 fun
WPF 4 fun
 
UI Composition - Prism
UI Composition - PrismUI Composition - Prism
UI Composition - Prism
 
UI Composition
UI CompositionUI Composition
UI Composition
 
Model-View-ViewModel
Model-View-ViewModelModel-View-ViewModel
Model-View-ViewModel
 
WPF basics
WPF basicsWPF basics
WPF basics
 
Refactoring ASP.NET and beyond
Refactoring ASP.NET and beyondRefactoring ASP.NET and beyond
Refactoring ASP.NET and beyond
 
jQuery Loves You
jQuery Loves YoujQuery Loves You
jQuery Loves You
 
Silverlight in Action
Silverlight in ActionSilverlight in Action
Silverlight in Action
 
Silverlight in Action
Silverlight in ActionSilverlight in Action
Silverlight in Action
 
Open XML & MOSS
Open XML & MOSSOpen XML & MOSS
Open XML & MOSS
 
Soluzioni Microsoft per l'e-Learning
Soluzioni Microsoft per l'e-LearningSoluzioni Microsoft per l'e-Learning
Soluzioni Microsoft per l'e-Learning
 
Installing and Administering MOSS
Installing and Administering MOSSInstalling and Administering MOSS
Installing and Administering MOSS
 
Microsoft SharePoint Server 2007 Technical Overview
Microsoft SharePoint Server 2007 Technical OverviewMicrosoft SharePoint Server 2007 Technical Overview
Microsoft SharePoint Server 2007 Technical Overview
 
[Hands on] testing asp.net mvc
[Hands on] testing asp.net mvc[Hands on] testing asp.net mvc
[Hands on] testing asp.net mvc
 
Asp.NET MVC Framework
Asp.NET MVC FrameworkAsp.NET MVC Framework
Asp.NET MVC Framework
 
Introduzione al Testing
Introduzione al TestingIntroduzione al Testing
Introduzione al Testing
 
Introduzione a CardSpace
Introduzione a CardSpaceIntroduzione a CardSpace
Introduzione a CardSpace
 
Introduzione a Workflow Foundation
Introduzione a Workflow FoundationIntroduzione a Workflow Foundation
Introduzione a Workflow Foundation
 

Recently uploaded

Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWERMadyBayot
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Victor Rentea
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Bhuvaneswari Subramani
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxRemote DBA Services
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontologyjohnbeverley2021
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityWSO2
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfOrbitshub
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelDeepika Singh
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxRustici Software
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Zilliz
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Angeliki Cooney
 

Recently uploaded (20)

Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 

Refactoring 2TheMax (con ReSharper)

  • 1. Refactoring 2 TheMaxRefactoring 2 TheMax Diego Guidi & Alfredo MorresiDiego Guidi & Alfredo Morresi staff@dotnetmarche.orgstaff@dotnetmarche.org
  • 2. Shit happensShit happens Anything that can go wrong will goAnything that can go wrong will go wrong.wrong. (Arthur Bloch)(Arthur Bloch)
  • 3. UnderengineeringUnderengineering AKA "fast, slow, slower.... never :("AKA "fast, slow, slower.... never :("  quickly deliver 1.0 release that works well for ourquickly deliver 1.0 release that works well for our customers but with junky codecustomers but with junky code  working on 2.0 release, junky code slows you down,working on 2.0 release, junky code slows you down, and new features are harder to implementand new features are harder to implement  as junky code multiplies, people lose faith into theas junky code multiplies, people lose faith into the system and the programmerssystem and the programmers  planning next release, you realize you can't win, andplanning next release, you realize you can't win, and start thinking about a total rewritestart thinking about a total rewrite
  • 4. OverengineeringOverengineering AKA "the 'HelloWorld' pattern"AKA "the 'HelloWorld' pattern"  code more sophisticated that it possible futurecode more sophisticated that it possible future requirementsrequirements  code hard to understand for new onescode hard to understand for new ones  time wasted understanding and maintaining complextime wasted understanding and maintaining complex code so you need to write documentationcode so you need to write documentation
  • 5. Code smellsCode smells  copy/paste (duplicate) codecopy/paste (duplicate) code  large method/classlarge method/class  method-like propertiesmethod-like properties  contrived complexity (patterns everywhere!)contrived complexity (patterns everywhere!)  inappropriate intimacyinappropriate intimacy  unused codeunused code  dangerous if (if - else if - else if - else...)dangerous if (if - else if - else if - else...)
  • 6. Cunningham's metaphorCunningham's metaphor The technical language doesn't communicateThe technical language doesn't communicate effectively with the vast majority of management.effectively with the vast majority of management. Instead, Ward Cunningham's financial metaphor ofInstead, Ward Cunningham's financial metaphor of design debt works infinitely better.design debt works infinitely better. Design debt occurs when you don't consistently doDesign debt occurs when you don't consistently do three things.three things. 1. Remove duplication.1. Remove duplication. 2. Simplify your code.2. Simplify your code. 3. Clarify you code's intent.3. Clarify you code's intent.
  • 7. Cunningham's metaphorCunningham's metaphor Few systems remain completely free of design debt.Few systems remain completely free of design debt. Wired as we are, humans just don't write perfect codeWired as we are, humans just don't write perfect code the first time around. We naturally accumulate designthe first time around. We naturally accumulate design debt. So the question becomes:debt. So the question becomes: "When do you pay it down?""When do you pay it down?"
  • 8. And so, refactoring!And so, refactoring! Refactoring is the process of changing a softwareRefactoring is the process of changing a software system in such a way that it does not alter the externalsystem in such a way that it does not alter the external behavior of the code yet improves its internalbehavior of the code yet improves its internal structure.structure. A refactoring is a "behavior-preserving transformation"A refactoring is a "behavior-preserving transformation" or, as Martin Fowler defines it, "a change made to theor, as Martin Fowler defines it, "a change made to the internal structure of software to make it easier tointernal structure of software to make it easier to understand and cheaper to modify without changing itsunderstand and cheaper to modify without changing its observable behavior"observable behavior"
  • 9. Why refactoring?Why refactoring?  Code i wrote yesterday is worse that code i'm writingCode i wrote yesterday is worse that code i'm writing todaytoday  Make it easier to add new codeMake it easier to add new code  Improve the design of existing codeImprove the design of existing code  Gain a better understanding of codeGain a better understanding of code  Make coding less annoyingMake coding less annoying  Readability / Testability / EstensibilityReadability / Testability / Estensibility  bugs correctionbugs correction  ......
  • 10. When refactoring?When refactoring?  Keeping code clean is a lot like keeping a roomKeeping code clean is a lot like keeping a room clean. Once your room becomes a mess, it becomesclean. Once your room becomes a mess, it becomes harder to clean. The worse the mess becomes, theharder to clean. The worse the mess becomes, the less you want to clean it.less you want to clean it.  It's best to refactor continuously, rather than inIt's best to refactor continuously, rather than in phases. When you see code that needsphases. When you see code that needs improvement, improve it.improvement, improve it.  On the other hand, if your manager needs you toOn the other hand, if your manager needs you to finish a feature before a demo that just gotfinish a feature before a demo that just got scheduled for tomorrow, finish the feature andscheduled for tomorrow, finish the feature and refactor later!refactor later!
  • 11. When NOT refactoring?When NOT refactoring?  If it's working, don't changeIf it's working, don't change  if you have a poorly factored programif you have a poorly factored program  if your code isn't tested, that does what theif your code isn't tested, that does what the customer wants and has no serious bugs, leave itcustomer wants and has no serious bugs, leave it alone!alone!  performance matters...performance matters...
  • 12. How refactoringHow refactoring Refactoring recipesRefactoring recipes  extract superclass/interfaceextract superclass/interface  rename method/property/variablerename method/property/variable  replace conditional with polymorphismreplace conditional with polymorphism  replace constructor with factory methodreplace constructor with factory method  inline methodinline method  even more:even more: http://www.refactoring.com/cataloghttp://www.refactoring.com/catalog
  • 13. How refactoringHow refactoring Only refactor when refactoring -- do not add featureOnly refactor when refactoring -- do not add feature during refactoring.during refactoring. Refactoring, or improving the design of existing code,Refactoring, or improving the design of existing code, requires that you know what code needs improvement.requires that you know what code needs improvement.
  • 14. How refactoringHow refactoring Each transformation (called a "Refactoring") does little,Each transformation (called a "Refactoring") does little, but a sequence of transformations can produce abut a sequence of transformations can produce a significant restructuring.significant restructuring. The system is also kept fully working after each smallThe system is also kept fully working after each small refactoring, reducing the chances that a system canrefactoring, reducing the chances that a system can get seriously broken during the restructuring process.get seriously broken during the restructuring process.
  • 15. How refactoringHow refactoring If you want to refactor, the essentialIf you want to refactor, the essential precondition is having solid testprecondition is having solid test (Martin Fowler)(Martin Fowler)
  • 16. Test-Driven DevelopmentTest-Driven Development Test-driven development (TDD) and continuousTest-driven development (TDD) and continuous refactoring enable the efficient evolution of workingrefactoring enable the efficient evolution of working code by turning programming into a dialogue.code by turning programming into a dialogue.
  • 17. Test-Driven DevelopmentTest-Driven Development AskAsk: You ask a question of a system by writing a test.: You ask a question of a system by writing a test. RespondRespond: You respond to the question by writing: You respond to the question by writing code to pass the test.code to pass the test. RefineRefine: You refine your response by consolidating: You refine your response by consolidating ideas, weeding out inessentials, and clarifyingideas, weeding out inessentials, and clarifying ambiguities.ambiguities. RepeatRepeat: You keep the dialogue going by asking the: You keep the dialogue going by asking the next question.next question.
  • 18. Refactoring and patternRefactoring and pattern There is a natural relation betweenThere is a natural relation between patterns and refactorings. Patternspatterns and refactorings. Patterns are where you want to be;are where you want to be; refactorings are ways to get thererefactorings are ways to get there from somewhere else.from somewhere else. (Fowler Martin)(Fowler Martin)
  • 19. Refactoring and patternRefactoring and pattern  Each pattern is a three-part rule, which expresses aEach pattern is a three-part rule, which expresses a relation between a certain context, a problem, and arelation between a certain context, a problem, and a solution.solution.  There are many ways to implement a pattern. If youThere are many ways to implement a pattern. If you don't know patterns, you're less likely to evolve greatdon't know patterns, you're less likely to evolve great designs. Patterns capture wisdom. Reusing thatdesigns. Patterns capture wisdom. Reusing that wisdom is extremely useful, also when refactoring.wisdom is extremely useful, also when refactoring.
  • 20. ReadingsReadings  Refactoring: Improving the Design of Existing CodeRefactoring: Improving the Design of Existing Code (Martin Fowler)(Martin Fowler)  Refactoring to patternsRefactoring to patterns (Joshua Kerievsky)(Joshua Kerievsky)  Design Patterns: Elements of Reusable Object-Design Patterns: Elements of Reusable Object- Oriented SoftwareOriented Software (Gang of Four)(Gang of Four)  The Pragmatic ProgrammerThe Pragmatic Programmer (Andrew Hunt and David Thomas)(Andrew Hunt and David Thomas)
  • 21. The sage final sentenceThe sage final sentence Any fool can write codeAny fool can write code that a computer canthat a computer can understand. Goodunderstand. Good programmers write codeprogrammers write code that humans canthat humans can understand.understand. (M. F.)(M. F.)
  • 23. The Must-Have Productivity Tool for .NET DevelopersThe Must-Have Productivity Tool for .NET Developers PROsPROs  intellisenseintellisense  code searchcode search  test runnertest runner  code generationcode generation  background analysisbackground analysis CONsCONs  commercial licensecommercial license  needs a lot of ram!needs a lot of ram!  a little bit buggya little bit buggy