SlideShare a Scribd company logo
Introduction to
Refactoring
Ganesh Samarthyam
ganesh.samarthyam@gmail.com
“Applying design principles is the key to creating
high-quality software!”
Architectural principles:
Axis, symmetry, rhythm, datum, hierarchy, transformation
For architects: design is the key!
Agenda
• Refactoring Foundations
• Refactoring - Principles
• Refactoring Bad Smells
• Refactoring Tools
Why care about refactoring?
As an evolving program is
continually changed, its
complexity, reflecting
deteriorating structure,
increases unless work is done
to maintain or reduce it
- Lehman's law of Increasing Complexity
What is refactoring?
Refactoring (noun): a change
made to the internal structure of
software to make it easier to
understand and cheaper to
modify without changing its
observable behavior
Refactor (verb): to restructure
software by applying a series
of refactorings without
changing its observable
behavior
Should this be “refactored”?
class	
  Base	
  {	
  
	
   public	
  Base()	
  {	
  
	
  	
  	
   	
   foo();	
  
	
   }	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
   public	
  void	
  foo()	
  {	
  
	
  	
   	
   System.out.println("In	
  Base's	
  foo	
  ");	
  
	
   }	
  
}	
  
class	
  Derived	
  extends	
  Base	
  {	
  
	
   public	
  Derived()	
  {	
  
	
  	
   	
   i	
  =	
  new	
  Integer(10);	
  
	
   }	
  
	
   public	
  void	
  foo()	
  {	
  
	
  	
   	
   System.out.println("In	
  Derived's	
  foo	
  "	
  +	
  i.toString()	
  );	
  
	
   }	
  
	
  	
   private	
  Integer	
  i;	
  	
  
}	
  
class	
  Test	
  {	
  	
  
	
   public	
  staHc	
  void	
  main(String	
  []	
  s)	
  {	
  
	
   	
   new	
  Derived();	
  
	
   }	
  
}
Crashes by throwing a
NullPointerException
It’s a bug! Fix it - its not called refactoring
Should this be “refactored”?
Calendar calendar = new Calendar.Builder()
.set(YEAR, 2003)
.set(MONTH, APRIL)
.set(DATE, 6)
.set(HOUR, 15)
.set(MINUTE, 45)
.set(SECOND, 22)
.setTimeZone(TimeZone.getDefault())
.build();
System.out.println(calendar);
Does this have “long
message chains” smell?
No - it’s a feature
(use of builder pattern)!
Should this be “refactored”?
Smells approach to refactoring
What are smells?
“Smells'are'certain'structures'
in'the'code'that'suggest'
(some4mes'they'scream'for)'
the'possibility'of'refactoring.”''
Granularity of smells
Architectural+
+
Cyclic&dependencies&between&modules&
Monolithic&modules&&
Layering&viola9ons&(back&layer&call,&skip&layer&call,&ver9cal&layering,&
etc)&
Design+
+
God&class&
Refused&bequest&&
Cyclic&dependencies&between&classes&
Code+(implementa6on)++
+
Internal&duplica9on&(clones&within&a&class)&&
Large&method&&
Temporary&field&&
Agenda
• Refactoring Foundations
• Refactoring - Principles
• Refactoring Bad Smells
• Refactoring Tools
3 principles behind patterns
Program to an interface, not to an
implementation
Favor object composition over inheritance
Encapsulate what varies
SOLID principles
•  There&should&never&be&more&than&one&reason&for&a&class&to&
change&&
Single'Responsibility'
Principle'(SRP)'
•  So6ware&en88es&(classes,&modules,&func8ons,&etc.)&should&
be&open&for&extension,&but&closed&for&modifica8on&
Open'Closed'Principle'
(OCP)'
•  Pointers&or&references&to&base&classes&must&be&able&to&use&
objects&of&derived&classes&without&knowing&it&
Liskov’s'Subs<tu<on'
Principle'(LSP)'
•  Depend&on&abstrac8ons,&not&on&concre8ons&
Dependency'Inversion'
Principle'(DIP)'
•  Many&clientGspecific&interfaces&are&beHer&than&one&
generalGpurpose&interface&
Interface'Segrega<on'
Principle'(ISP)'
“When you find you have to add a feature to a
program, and the program's code is not structured
in a convenient way to add the feature, first
refactor the program to make it easy to add the
feature, then add the feature.”
Source: Refactoring, Martin Fowler, Addison Wesley, 2003
“Refactoring changes the programs in small steps.
If you make a mistake, it is easy to find the bug.”
Source: Refactoring, Martin Fowler, Addison Wesley, 2003
“Don't publish interfaces prematurely. Modify
your code ownership policies to smooth
refactoring.”
Source: Refactoring, Martin Fowler, Addison Wesley, 2003
“When you get a bug report, start by writing a unit
test that exposes the bug.”
Source: Refactoring, Martin Fowler, Addison Wesley, 2003
“Before you start refactoring, check that you have a
solid suite of tests.”
“Make sure all tests are fully automatic and that
they check their own results.”
Source: Refactoring, Martin Fowler, Addison Wesley, 2003
“It is better to write and run incomplete tests than
not to run complete tests.”
Source: Refactoring, Martin Fowler, Addison Wesley, 2003
IMPaCT Process Model
Refactoring: Practical concerns
“Fear of breaking
working code”
Is management buy-in necessary for refactoring?
How to refactor code in legacy projects (no automated
tests, difficulty in understanding, lack of motivation, …)?
Where do I have time
for refactoring?
Agenda
• Refactoring Foundations
• Refactoring - Principles
• Refactoring Bad Smells
• Refactoring Tools
Fowler’s bad smells
Alternative Classes
with Different Interfaces
Comments
Data Class
Data Clumps
Divergent Change
Duplicated Code
Feature Envy
Inappropriate Intimacy
Incomplete Library Class
Large Class
Lazy Class
Long Method
Long Parameter List
Message Chains
Middle Man
Parallel Inheritance Hierarchies
Primitive Obsession
Refused Bequest
Shotgun Surgery
Speculative Generality
Switch Statements
Temporary Field
What’s that smell?
“Large class”
smell
Refactoring with “extract class”
What’s that smell?
“Refused
bequest” smell
Refused bequest smell
A"class"that"overrides"a"method"of"a"base"class"in"
such"a"way"that"the"contract"of"the"base"class"is"not"
honored"by"the"derived"class"
What’s that smell?
class%GraphicsDevice%
%public%void%setFullScreenWindow(Window%w)%{%
%%%%%%%%if%(w%!=%null)%{%
%%%%%%%%%%%%if%(w.getShape()%!=%null)%{%w.setShape(null);%}%
%%%%%%%%%%%%if%(w.getOpacity()%<%1.0f)%{%w.setOpacity(1.0f);%}%
%%%%%%%%%%%%if%(!w.isOpaque())%{%
%%%%%%%%%%%%%%%%Color%bgColor%=%w.getBackground();%
%%%%%%%%%%%%%%%%bgColor%=%new%Color(bgColor.getRed(),% %
%% %bgColor.getGreen(), %
%%%% %bgColor.getBlue(),%255);%
%%%%%%%%%%%%%%%%w.setBackground(bgColor);%
%%%%%%%%%%%%}%
%%%%%%%%}%
…%
}%
This%code%in%
GraphicsDevice%uses%
more%methods%of%
Window%than%calling%
its%own%methods!%
“Feature
envy” smell
Feature envy smell
Methods(that(are(more(interested(in(the(data(of(
other(classes(than(that(of(their(own(class(
What’s that smell?
public'class'Forma.ableFlags'{'
''''//'Explicit'instan7a7on'of'this'class'is'prohibited.'
''''private'Forma.ableFlags()'{}'
''''/**'LeBCjus7fies'the'output.''*/'
''''public'sta7c'final'int'LEFT_JUSTIFY'='1<<0;'//''C''
''''/**'Converts'the'output'to'upper'case'*/''
''''public'sta7c'final'int'UPPERCASE'='1<<1;''''//''S''
''''/**Requires'the'output'to'use'an'alternate'form.'*/'
''''public'sta7c'final'int'ALTERNATE'='1<<2;''''//''#''
}'
“Lazy class”
smell
What’s that smell?
Results in “Inappropriate
intimacy” smell
What’s that smell?
Results in “Inappropriate
intimacy” smell
What’s that smell?
Unused'abstract'
classes'in'an'
applica0on'
Refactoring “speculative generalization”
Duplicated Code
CTRL-C and CTRL-V
Types of Clones
• exactly(iden,cal(except'for'varia.ons'in'whitespace,'layout,'and'
comments'
Type'1'
• syntac,cally(iden,cal(except'for'varia.on'in'symbol'names,'whitespace,'
layout,'and'comments'
Type'2'
• iden.cal'except'some'statements(changed,(added,(or(removed(
Type'3'
• when'the'fragments'are'seman,cally(iden,cal(but'implemented'by'
syntac.c'variants'
Type'4'
How to deal with duplication?
What’s that smell?
Refactoring
Collapse
Hierarchy
Refactoring
/**#
#*#Pluggable#look#and#feel#interface#for#JBu6on.#
*/#
public#abstract#class#Bu6onUI#extends#ComponentUI#{#
}#
What’s that smell?
Refactoring
Extract
Superclass
What’s that smell?
How about this refactoring?
How about this refactoring?
Suggested refactoring
Practical considerations
What’s that smell?
Refactoring
What’s that smell?
Liskov’s Substitution Principle (LSP)
It#should#be#possible#to#replace#
objects#of#supertype#with#
objects#of#subtypes#without#
altering#the#desired#behavior#of#
the#program#
Barbara#Liskov#
Refactoring
Replace inheritance
with delegation
What’s that smell?
Refactoring for Date
Replace inheritance
with delegation
What’s that smell?
• execu&ng)objects)of)type)Ac&onEvent)at)
specified)intervals)javax.swing.Timer)
• scheduling)a)thread)to)execute)in)the)future)as)a)
background)thread)java.u&l.Timer)
• sending)out)an)alarm)to)wakeAup)the)listeners)
that)have)registered)to)get)&mer)no&fica&ons)
javax.management.&mer
.Timer)
What’s that smell?
!!!!!!!!!!!!/*!
!!!!!!!!!!!!!*!Note!on!casts!to!double!below.!!If!the!arithme8c!of!
!!!!!!!!!!!!!*!x+w!or!y+h!is!done!in!float,!then!some!bits!may!be!
!!!!!!!!!!!!!*!lost!if!the!binary!exponents!of!x/y!and!w/h!are!not!
!!!!!!!!!!!!!*!similar.!!By!conver8ng!to!double!before!the!addi8on!
!!!!!!!!!!!!!*!we!force!the!addi8on!to!be!carried!out!in!double!to!
!!!!!!!!!!!!!*!avoid!rounding!error!in!the!comparison.!
!!!!!!!!!!!!!*!
!!!!!!!!!!!!!*!See!bug!4320890!for!problems!that!this!inaccuracy!causes.!
!!!!!!!!!!!!!*/!
/*!
*!Note!on!casts!to!double!below.!!If!the!arithme8c!of!
*!x+w!or!y+h!is!done!in!int,!then!we!may!get!integer!
*!overflow.!By!conver8ng!to!double!before!the!addi8on!
*!we!force!the!addi8on!to!be!carried!out!in!double!to!
*!avoid!overflow!in!the!comparison.!
*!
*!See!bug!4320890!for!problems!that!this!can!cause.!
*/!!
Rectangle2D!class!! Rectangle!class!!
What’s that smell?
Refactoring
What’s that smell?
Refactoring
What’s that smell?
public'Insets'getBorderInsets(Component'c,'Insets'insets){'
''''''''Insets'margin'='null;'
'''''''''//'Ideally'we'd'have'an'interface'defined'for'classes'which'
''''''''//'support'margins'(to'avoid'this'hackery),'but'we've'
''''''''//'decided'against'it'for'simplicity'
''''''''//'
''''''''if'(c'instanceof'AbstractBuEon)'{'
'''''''''''''''''margin'='((AbstractBuEon)c).getMargin();'
''''''''}'else'if'(c'instanceof'JToolBar)'{'
''''''''''''''''margin'='((JToolBar)c).getMargin();'
''''''''}'else'if'(c'instanceof'JTextComponent)'{'
''''''''''''''''margin'='((JTextComponent)c).getMargin();'
''''''''}'
''''''''//'rest'of'the'code'omiEed'…'
Refactoring
Refactoring
!!!!!!!margin!=!c.getMargin();
!!!!!!!!if!(c!instanceof!AbstractBu8on)!{!
!!!!!!!!!!!!!!!!!margin!=!((AbstractBu8on)c).getMargin();!
!!!!!!!!}!else!if!(c!instanceof!JToolBar)!{!
!!!!!!!!!!!!!!!!margin!=!((JToolBar)c).getMargin();!
!!!!!!!!}!else!if!(c!instanceof!JTextComponent)!{!
!!!!!!!!!!!!!!!!margin!=!((JTextComponent)c).getMargin();!
!!!!!!!!}
What’s that smell?
Refactoring
Refactoring
What’s that smell?
What’s that smell?
Refactoring “speculative generality”
What’s that smell?
Refactoring
How about multiple interface inheritance?
Case study
What’s that smell?
switch'(transferType)'{'
case'DataBuffer.TYPE_BYTE:'
byte'bdata[]'='(byte[])inData;'
pixel'='bdata[0]'&'0xff;'
length'='bdata.length;'
break;'
case'DataBuffer.TYPE_USHORT:'
short'sdata[]'='(short[])inData;'
pixel'='sdata[0]'&'0xffff;'
length'='sdata.length;'
break;'
case'DataBuffer.TYPE_INT:'
int'idata[]'='(int[])inData;'
pixel'='idata[0];'
length'='idata.length;'
break;'
default:'
throw' new' UnsupportedOperaQonExcepQon("This' method' has' not' been' "+' "implemented'
for'transferType'"'+'transferType);'
}'
Replace conditional with polymorphism
protected(int(transferType;! protected(DataBuffer(dataBuffer;!
pixel(=(dataBuffer.getPixel();(
length(=(dataBuffer.getSize();!
switch((transferType)({(
case(DataBuffer.TYPE_BYTE:(
byte(bdata[](=((byte[])inData;(
pixel(=(bdata[0](&(0xff;(
length(=(bdata.length;(
break;(
case(DataBuffer.TYPE_USHORT:(
short(sdata[](=((short[])inData;(
pixel(=(sdata[0](&(0xffff;(
length(=(sdata.length;(
break;(
case(DataBuffer.TYPE_INT:(
int(idata[](=((int[])inData;(
pixel(=(idata[0];(
length(=(idata.length;(
break;(
default:(
throw( new( UnsupportedOperaRonExcepRon("This( method(
has( not( been( "+( "implemented( for( transferType( "( +(
transferType);(
}!
Scenario
enum ColorScheme { RGB, HSB, HLS, CMYK }
class Color {
private float red, green, blue; // for supporting RGB scheme
private float hue1, saturation1, brightness1; // for supporting HSB scheme
private float hue2, lightness2, saturation2; // for supporting HLS scheme
public Color(float arg1, float arg2, float arg3, ColorScheme cs) {
switch (cs) {
// initialize arg1, arg2, and arg3 based on ColorScheme value
}
}
}
• Assume that you need to support different Color schemes in your software
• RGB (Red, Green, Blue), HSB (Hue, Saturation, Brightness), and HLS (Hue,
Lightness, and Saturation) schemes
• Overloading constructors and differentiating them using enums can become
confusing
• What could be a better design?
Hands-on exercise
❖ Refactor Color.java
❖ Hint: Use “factory method” design pattern
A solution using factory method pattern
Color
+ GetRGBColor()
+ GetHSBColor()
+ GetHLSColor()
RGBColor
- red : float
- green : float
- blue : float
HSBColor
- hue : float
- saturation : float
- brightness : float
HLSColor
- hue : float
- lightness : float
- saturation : float
Factory method pattern: Discussion
❖ A class cannot anticipate the
class of objects it must create
❖ A class wants its subclasses to
specify the objects it creates
Define an interface for creating an object, but let subclasses decide which class to
instantiate. Factory method lets a class defer instantiation to subclasses.
❖ Delegate the responsibility
to one of the several helper
subclasses
❖ Also, localize the
knowledge of which
subclass is the delegate
Factory method: Java library example
Logger	
  logger	
  =	
  Logger.getLogger(TestFileLogger.class.getName());	
  
Scenario
❖ Consider a Route class in an
application like Google Maps
❖ For finding shortest path from
source to destination, many
algorithms can be used
❖ The problem is that these
algorithms get embedded into
Route class and cannot be
reused easily (smell!)
Route
+ Route(String, String)
+ getShortestPathJohnsons()
+ getShortestDijkstras()
+ getShortestBellmanFords()
+ …
How will you refactor such that
a) Support for shortest path
algorithm can be added easily?
b) Separate path finding logic
from dealing with location
information.
How about this solution?
ShortestPathAlgos
+ FindPath()
JohnsonsAlgo DijkstrasAlgo
Route
+ SetRoute(Locati
on, Location)
+ ShortestPath()
+ …
You’re right: Its Strategy pattern!
Source: “Design Patterns: Elements of Reusable Object-Oriented Software”, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Addison-Wesley,1994
Strategy pattern: Discussion
❖ Useful when there is a set of
related algorithms and a client
object needs to be able to
dynamically pick and choose
an algorithm that suits its
current need
Defines a family of algorithms, encapsulates each one, and makes
them interchangeable. Strategy lets the algorithm vary
independently from clients that use it
❖ The implementation of each of the
algorithms is kept in a separate
class referred to as a strategy.
❖ An object that uses a Strategy
object is referred to as a context
object.
❖ Changing the behavior of a
Context object is a matter of
changing its Strategy object to the
one that implements the required
algorithm
Scenario
How to separate:
a) code generation logic
from node types?
b) how to support different
target types?
class Plus extends Expr {
private Expr left, right;
public Plus(Expr arg1, Expr arg2) {
left = arg1;
right = arg2;
}
public void genCode() {
left.genCode();
right.genCode();
if(t == Target.JVM) {
System.out.println("iadd");
}
else { // DOTNET
System.out.println("add");
}
}
}
A solution using Visitor pattern
class Plus extends Expr {
private Expr left, right;
public Plus(Expr arg1, Expr arg2) {
left = arg1;
right = arg2;
}
public Expr getLeft() {
return left;
}
public Expr getRight() {
return right;
}
public void accept(Visitor v) {
v.visit(this);
}
}
class DOTNETVisitor extends Visitor {
public void visit(Constant arg) {
System.out.println("ldarg " + arg.getVal());
}
public void visit(Plus plus) {
genCode(plus.getLeft());
genCode(plus.getRight());
System.out.println("add");
}
public void visit(Sub sub) {
genCode(sub.getLeft());
genCode(sub.getRight());
System.out.println("sub");
}
public void genCode(Expr expr) {
expr.accept(this);
}
}
Visitor pattern: structure
Source: “Design Patterns: Elements of Reusable Object-Oriented Software”, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Addison-Wesley,1994
Visitor pattern: call sequence
Source: “Design Patterns: Elements of Reusable Object-Oriented Software”, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Addison-Wesley,1994
Visitor pattern: Discussion
❖ Many distinct and unrelated
operations need to be
performed on objects in an
object structure, and you want
to avoid “polluting” their
classes with these operations
Represent an operation to be performed on the elements of an object structure.
Visitor lets you define a new operation without changing the classes of the
elements on which it operations
❖ Create two class
hierarchies:
❖ One for the elements
being operated on
❖ One for the visitors that
define operations on the
elements
What’s that smell?
What’s that smell?
Refactoring “incomplete library classes” smell
min/max' open/close' create/destroy' get/set'
read/write' print/scan' first/last' begin/end'
start/stop' lock/unlock' show/hide' up/down'
source/target' insert/delete' first/last' push/pull'
enable/disable' acquire/release' le:/right' on/off'
Abstract factory pattern
What’s that smell?
“Combination
explosion”
smell
Refactoring using Bridge structure
Refactoring with Lambdas
File[] files = new File(".").listFiles(
new FileFilter() {
public boolean accept(File f) { return f.isFile(); }
}
);
for(File file: files) {
System.out.println(file);
}
Arrays.stream(new File(“.”)
.listFiles(file -> file.isFile()))
.forEach(System.out::println);
Refactoring APIs
public	
  class	
  Throwable	
  {	
  
//	
  following	
  method	
  is	
  available	
  from	
  Java	
  1.0	
  version.	
  	
  
//	
  Prints	
  the	
  stack	
  trace	
  as	
  a	
  string	
  to	
  standard	
  output	
  	
  
//	
  for	
  processing	
  a	
  stack	
  trace,	
  	
  
//	
  we	
  need	
  to	
  write	
  regular	
  expressions	
  	
  
public	
  void	
  printStackTrace();	
  	
  	
  	
  	
  	
  
//	
  other	
  methods	
  omiEed	
  	
  
}	
  
Refactoring APIs
public'class'Throwable'{'
//'following'method'is'available'from'Java'1.0'version.''
//'Prints'the'stack'trace'as'a'string'to'standard'output''
//'for'processing'a'stack'trace,''
//'we'need'to'write'regular'expressions''
public'void'printStackTrace();''''''
//'other'methods'omiEed'
}!
public'class'Throwable'{'
public'void'printStackTrace();''''''
'''''''''''''public'StackTraceElement[]'getStackTrace();'//'Since'1.4'
'''''''''''''//'other'methods'omiEed'
}!
public'final'class'StackTraceElement'{'
public'String'getFileName();'
public'int'getLineNumber();'
public'String'getClassName();'
public'String'getMethodName();'
public'boolean'isNaQveMethod();'
}!
Smells tend to “co-occur”
Amplification
Architecture smells
Agenda
• Refactoring Foundations
• Refactoring - Principles
• Refactoring Bad Smells
• Refactoring Tools
Structural Analysis for Java (stan4j)
JArchitect
InFusion
PMD CPD
SotoArc
CodeCity
Understand
Eclipse IDE
Books to read
Introduction to refactoring
Introduction to refactoring
Introduction to refactoring
Introduction to refactoring
Introduction to refactoring
“Applying design principles is the key to creating
high-quality software!”
Architectural principles:
Axis, symmetry, rhythm, datum, hierarchy, transformation
Image credits
❖ http://en.wikipedia.org/wiki/Fear_of_missing_out
❖ http://lesliejanemoran.blogspot.in/2010_05_01_archive.html
❖ http://javra.eu/wp-content/uploads/2013/07/angry_laptop2.jpg
❖ https://www.youtube.com/watch?v=5R8XHrfJkeg
❖ http://womenworld.org/image/052013/31/113745161.jpg
❖ http://www.fantom-xp.com/wallpapers/33/I'm_not_sure.jpg
❖ https://www.flickr.com/photos/31457017@N00/453784086
❖ https://www.gradtouch.com/uploads/images/question3.jpg
❖ http://gurujohn.files.wordpress.com/2008/06/bookcover0001.jpg
❖ http://upload.wikimedia.org/wikipedia/commons/d/d5/Martin_Fowler_-_Swipe_Conference_2012.jpg
❖ http://www.codeproject.com/KB/architecture/csdespat_2/dpcs_br.gif
❖ http://upload.wikimedia.org/wikipedia/commons/thumb/2/28/Bertrand_Meyer_IMG_2481.jpg/440px-
Bertrand_Meyer_IMG_2481.jpg
❖ http://takeji-soft.up.n.seesaa.net/takeji-soft/image/GOF-OOPLSA-94-Color-75.jpg?d=a0
❖ https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/OOP_ObjC/Art/watchcalls_35.gif
❖ http://www.pluspack.com/files/billeder/Newsletter/25/takeaway_bag.png
❖ http://cdn1.tnwcdn.com/wp-content/blogs.dir/1/files/2013/03/design.jpg
Introduction to refactoring

More Related Content

PDF
Refactoring
PPT
Code Refactoring
PDF
Design patterns through refactoring
PDF
Refactoring 101
PPTX
C# coding standards, good programming principles & refactoring
PPT
Of Lambdas and LINQ
ODP
Refactoring Techniques
PPTX
Code smells
Refactoring
Code Refactoring
Design patterns through refactoring
Refactoring 101
C# coding standards, good programming principles & refactoring
Of Lambdas and LINQ
Refactoring Techniques
Code smells

What's hot (18)

PPTX
Presentation 3rd
PPTX
More Little Wonders of C#/.NET
PPTX
DOC
Java Script Language Tutorial
PPTX
Java best practices
PDF
C# conventions & good practices
PDF
Object Oriented Programming Lab Manual
PPT
Create and analyse programs
PDF
Functional JavaScript Fundamentals
PPTX
The Little Wonders of C# 6
PPTX
Advanced Javascript
PDF
Code Smells and Its type (With Example)
PPS
Coding Best Practices
PDF
[教材] 例外處理設計與重構實作班201309
PPTX
Functional Programming in Java
PDF
Lambda: A Peek Under The Hood - Brian Goetz
PPTX
Java 101
Presentation 3rd
More Little Wonders of C#/.NET
Java Script Language Tutorial
Java best practices
C# conventions & good practices
Object Oriented Programming Lab Manual
Create and analyse programs
Functional JavaScript Fundamentals
The Little Wonders of C# 6
Advanced Javascript
Code Smells and Its type (With Example)
Coding Best Practices
[教材] 例外處理設計與重構實作班201309
Functional Programming in Java
Lambda: A Peek Under The Hood - Brian Goetz
Java 101
Ad

Similar to Introduction to refactoring (20)

PDF
Refactoring 2 The Max
PDF
Recommending refactoring operations in large software systems
PPS
Few minutes To better Code - Refactoring
PDF
Reduce Reuse Refactor
PDF
Refactoring for Software Design Smells - 1 day Workshop
PPT
Contemporary Software Engineering Practices Together With Enterprise
PDF
Achieving Design Agility by Refactoring Design Smells
PDF
Refactoring for Software Design Smells - Tech Talk
PDF
Refactoring for Software Design Smells - Tech Talk
PDF
2018 01-29 - brewbox - refactoring. sempre, senza pietà
PPT
Getting Unstuck: Working with Legacy Code and Data
PPTX
What’s expected in Spring 5
PPTX
Large scale agile development practices
PDF
Strategic refactoring. Refactoring strategies
PDF
Restful Best Practices
PPTX
Refactoring, 2nd Edition
PPTX
Code Refactoring
PPT
Lecture: Refactoring
PDF
Refactoring for Software Architecture Smells
PPTX
How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018
Refactoring 2 The Max
Recommending refactoring operations in large software systems
Few minutes To better Code - Refactoring
Reduce Reuse Refactor
Refactoring for Software Design Smells - 1 day Workshop
Contemporary Software Engineering Practices Together With Enterprise
Achieving Design Agility by Refactoring Design Smells
Refactoring for Software Design Smells - Tech Talk
Refactoring for Software Design Smells - Tech Talk
2018 01-29 - brewbox - refactoring. sempre, senza pietà
Getting Unstuck: Working with Legacy Code and Data
What’s expected in Spring 5
Large scale agile development practices
Strategic refactoring. Refactoring strategies
Restful Best Practices
Refactoring, 2nd Edition
Code Refactoring
Lecture: Refactoring
Refactoring for Software Architecture Smells
How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018
Ad

More from Ganesh Samarthyam (20)

PDF
Wonders of the Sea
PDF
Animals - for kids
PDF
Applying Refactoring Tools in Practice
PDF
CFP - 1st Workshop on “AI Meets Blockchain”
PDF
Great Coding Skills Aren't Enough
PDF
College Project - Java Disassembler - Description
PDF
Coding Guidelines - Crafting Clean Code
PDF
Design Patterns - Compiler Case Study - Hands-on Examples
PDF
Bangalore Container Conference 2017 - Brief Presentation
PDF
Bangalore Container Conference 2017 - Poster
PDF
Software Design in Practice (with Java examples)
PDF
OO Design and Design Patterns in C++
PDF
Bangalore Container Conference 2017 - Sponsorship Deck
PDF
Let's Go: Introduction to Google's Go Programming Language
PPT
Google's Go Programming Language - Introduction
PDF
Java Generics - Quiz Questions
PDF
Java Generics - by Example
PDF
Software Architecture - Quiz Questions
PDF
Docker by Example - Quiz
PDF
Core Java: Best practices and bytecodes quiz
Wonders of the Sea
Animals - for kids
Applying Refactoring Tools in Practice
CFP - 1st Workshop on “AI Meets Blockchain”
Great Coding Skills Aren't Enough
College Project - Java Disassembler - Description
Coding Guidelines - Crafting Clean Code
Design Patterns - Compiler Case Study - Hands-on Examples
Bangalore Container Conference 2017 - Brief Presentation
Bangalore Container Conference 2017 - Poster
Software Design in Practice (with Java examples)
OO Design and Design Patterns in C++
Bangalore Container Conference 2017 - Sponsorship Deck
Let's Go: Introduction to Google's Go Programming Language
Google's Go Programming Language - Introduction
Java Generics - Quiz Questions
Java Generics - by Example
Software Architecture - Quiz Questions
Docker by Example - Quiz
Core Java: Best practices and bytecodes quiz

Recently uploaded (20)

PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PPTX
ManageIQ - Sprint 268 Review - Slide Deck
PPTX
Online Work Permit System for Fast Permit Processing
PPTX
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
PPTX
ai tools demonstartion for schools and inter college
PDF
AI in Product Development-omnex systems
PPTX
ISO 45001 Occupational Health and Safety Management System
PPTX
Transform Your Business with a Software ERP System
PPTX
VVF-Customer-Presentation2025-Ver1.9.pptx
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PPT
Introduction Database Management System for Course Database
PDF
Understanding Forklifts - TECH EHS Solution
PPTX
Operating system designcfffgfgggggggvggggggggg
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PPTX
history of c programming in notes for students .pptx
PDF
Design an Analysis of Algorithms II-SECS-1021-03
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
ManageIQ - Sprint 268 Review - Slide Deck
Online Work Permit System for Fast Permit Processing
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
ai tools demonstartion for schools and inter college
AI in Product Development-omnex systems
ISO 45001 Occupational Health and Safety Management System
Transform Your Business with a Software ERP System
VVF-Customer-Presentation2025-Ver1.9.pptx
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
Introduction Database Management System for Course Database
Understanding Forklifts - TECH EHS Solution
Operating system designcfffgfgggggggvggggggggg
2025 Textile ERP Trends: SAP, Odoo & Oracle
Wondershare Filmora 15 Crack With Activation Key [2025
Internet Downloader Manager (IDM) Crack 6.42 Build 41
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
history of c programming in notes for students .pptx
Design an Analysis of Algorithms II-SECS-1021-03

Introduction to refactoring