Refactoring Examples
- Data:
- Do not leave unnecessary variables lying around
(Before versus After)
- Use symbolic instead of literal constants
(Before versus After)
- Use boolean literal constants (C++)
(Before versus After)
- Keep data types consistent
(Before versus After)
- Expressions:
- Avoid self-assignment
(Before versus After)
- Boolean variable as condition
(Before versus After)
- Combine discrete values into ranges
(Before versus After)
- Unary assignment is self-sufficient
(Before versus After)
- if/if-else:
- Factor out code from if- and else- clauses
(Before versus After)
- Avoid redundant conditions
(Before versus After)
- Avoid empty else
(Before versus After)
- Combine if-else statements
(Before versus After)
- Code inversion
(Before versus After)
- Nested if/if-else:
- Avoid multiple ifs instead of nested if-else
(Before versus After)
- Avoid redundant conditions involving independent variables
(Before versus After)
- Avoid nested if-else for independent variables
(Before versus After)
- switch:
- Factor out code from switch
(Before versus After)
- Combine cases in switch
(Before versus After)
- Include default for error cases
(Before versus After)
- loops:
- Write well-formed loops:
- Do not use third party variables
(Before versus After)
- Avoid infinite loop with break
(Before versus After)
- Avoid empty for loops
(Before versus After)
- while loop:
- Don't rig the condition variable for the first iteration
(Before versus After)
- Move post-loop code out of the loop
(Before versus After)
- do-while for validation:
- Don't do work inside validation loop
(Before versus After)
- Don't use one loop to validate two or more inputs
(Before versus After)
- Use the correct loop:
- Don't use do-while instead of while
(Before versus After)
- Use do-while for validation
(Before versus After)
- Use for loop when using a counter
(Before versus After)
- Control structures:
- Eliminate unnecessary control structures
(Before versus After)
- Functions:
- Parameter Passing:
- Do not pass unnecessary parameters
(Before versus After)
- Prioritize local variables over parameters
(Before versus After)
- Prioritize passing by value over reference
(Before versus After)
- Avoid passing a single parameter by reference
(Before versus After)
- Pass an element instead of an array and subscript
(Before versus After)
- Use consistent order of parameters
(Before versus After)
- If you pass some parameters by reference, pass all necessary parameters by reference
(Before versus After)
- Return value
- Unnecessary return value
(Before versus After)
- Returning data that was passed by reference
(Before versus After)
- Body:
- Update variables within their scope
(Before versus After)
- When appropriate, use guards clauses instead of nested if-else:
(Before versus After)
- One function, one purpose:
(Before versus After)
- Don't use the same name for a local variable as the function
(Before versus After)
- Parameterize functions
(Before versus After)
- Recursion:
- Use loops instead of recursion when possible
(Before versus After)
- Avoid dragon-tail recursion
(Before versus After)
- Classes:
- Avoid declaring data members public
(Before versus After)
- Prioritize function variable over class variable
(Before versus After)
- Avoid dependent data members or mutators for them
(Before versus After)
- Inheritance:
- Migrate:
- Common data members to base class:
(Before versus After)
- Common member functions to base class:
(Before versus After)
- Don't re-declare:
- Base class data member in derived class
(Before versus After)
- Base class member function in derived class
(Before versus After)
- Call base class function in overriding derived class function:
- At the start:
(Before versus After)
- Template method:
(Before versus After)
- Use polymorphic behavior instead of if-else in client
(Before versus After)