1. Improve Conditional
    1. Why?
      1. Reduce the complexity
      2. Improve readability
      3. Improove maintainability
      4. Improve reusability
    2. When?
      1. When there is more than one condition (and / or)
      2. When there is too much code inside in the body
      3. When the if is based on string or type
    3. How?
      1. Refactor if statement
        1. Replace complex expression with method call
        2. Flatten nested if
      2. Avoid if statement
        1. Replace if statement with derived type
        2. Use strategy pattern
        3. Delegate implementation
      3. Invert if statement
        1. Don't use negative
        2. Write if statement so the least amount of code is in it
  2. Improve Documentation
    1. Why?
      1. Improve readability
      2. Improove maintainability
      3. Avoid obsolete comments
    2. When?
      1. Every time there is a comment that describe something else than intention
    3. How?
      1. Replace comment with code naming
        1. Extract method
        2. Use meaningful names
      2. Naming Conventions
        1. Properties
        2. Enums
        3. Events
        4. Protected
        5. Actions
  3. Improve Method call
    1. Why?
      1. Improve performance
      2. Improve readability
      3. Improve reusability
    2. When?
      1. When there is more than 2 parameters
      2. When there are many out parameters
      3. When you need default valies
    3. How?
      1. Reduce number of parameters
        1. Encapsulate parameters in type
        2. Create overload with less parameters
        3. Use default value
      2. Return type value
      3. Use out paramters
      4. Overload method in proper order
  4. Manage Scope
    1. Why?
      1. Avoid side effect
      2. Improve reusability
      3. Improve maintainability
    2. When?
      1. A field is used in few methods
      2. Public members expose class behaviour
    3. How?
      1. Reduce visibility
        1. Use protected
        2. Use private
        3. Use Internal
      2. Reduce scope
        1. Move fields to method
        2. Split class
        3. Move local variable close to its use
      3. Reduce lifetime
        1. Initialize late
        2. Reduce references
        3. Free early
  5. Remove Dead code
    1. Why?
      1. Because you must
      2. Improve maintainability
      3. Improve performance
      4. Improve readbility
    2. When?
      1. You know the code is dead
      2. You think the code is dead
      3. You want that code to be dead
    3. How?
      1. Identify dead code
      2. Remove code