Skip to content

Latest commit

 

History

History
112 lines (69 loc) · 3.81 KB

File metadata and controls

112 lines (69 loc) · 3.81 KB

Code Smell 36 - Switch/case/elseif/else/if statements

Code Smell 36 - Switch/case/elseif/else/if statements

First programming lesson: Control structures. Senior developer lesson: avoid them.

TL;DR: Don use Ifs or its friends

Problems

  • Too many decisions together

  • Coupling

  • Duplicated code

  • Violation of Open/Closed Principle.

  • A new condition should not change the main algorithm.

  • Nulls

Solutions

  1. Polymorphism

  2. Create hierarchies/compose objects following Open closed principle.

  3. Use State pattern to model transitions.

  4. Use Strategy Pattern/Method Object to choose for branches.

Examples

  • Discrete Values

  • State transition

  • Algorithm choice.

Sample Code

Wrong

class Mp3Converter {
  convertToMp3(source, mimeType) {
    if(mimeType.equals("audio/mpeg")) {
        this.convertMpegToMp3(source)
    } else if(mimeType.equals("audio/wav")) {
        this.convertWavToMp3(source)
    } else if(mimeType.equals("audio/ogg")) {
        this.convertOggToMp3(source)
    } else if(...) {
        // Lots of new clauses
}

Right

class Mp3Converter {
  convertToMp3(source, mimeType) {
    const foundConverter = this.registeredConverters.
        find(converter => converter.handles(mimeType));
        // Do not use metaprogramming to find and iterate converters
        // since this is another problem.    
    if (!foundConverter) {
      throw new Error('No converter found for ' + mimeType);
    }    
    foundConverter.convertToMp3(source);
  }
}

#Detection

Since there are valid cases for If/else usages, we should not pull the plug and forbid these instructions. We can put a ratio of if statements/other statements as a warning instead.

Relations

Code Smell 12 - Null

Code Smell 102 - Arrow Code

Code Smell 110 - Switches With Defaults

Code Smell 133 - Hardcoded IF Conditions

More Info

How to Get Rid of Annoying IFs Forever

Credits

Photo by Adarsh Kummur on Unsplash

If debugging is the process of removing software bugs, then programming must be the process of putting them in.

Edsger Dijkstra

Software Engineering Great Quotes


This article is part of the CodeSmell Series.

How to Find the Stinky Parts of your Code