DEV Community

Cover image for Code Smell 124 - Divergent Change
Maxi Contieri ⭐⭐⭐
Maxi Contieri ⭐⭐⭐

Posted on • Originally published at maximilianocontieri.com

 

Code Smell 124 - Divergent Change

You change something in a class. You change something unrelated in the same class

TL:DR; Classes should have just one responsibility and one reason to change.

Problems

  • Coupling

  • Code Duplication

  • Low Cohesion

  • Single Responsibility Principle violation

Solutions

  1. Extract class

Context

We create classes to fulfill responsibilities.

If an object does too much, it might change in different directions.

Sample Code

Wrong

class Webpage {

  renderHTML(): {
    renderDocType();
    renderTitle();
    renderRssHeader();
    renderRssTitle();
    renderRssDescription();
   // ...
  }
  //HTML render can change

  renderRssDescription() {
   // ...
  }

  renderRssTitle() {
   // ...
  }

  renderRssPubDate() {
   // ...
  }
  //RSS Format might change

}
Enter fullscreen mode Exit fullscreen mode

Right

class Webpage {

  renderHTML() {
    this.renderDocType();
    this.renderTitle();
    (new RSSFeed()).render();
    this.renderRssTitle();
    this.renderRssDescription();
   // ...
  }
  //HTML render can change
}

class RSSFeed {
  render() {
    this.renderDescription();
    this.renderTitle();
    this.renderPubDate();
    //...
  }  
  //RSS Format might change
  //Might have unitary tests 
  //etc
}
Enter fullscreen mode Exit fullscreen mode

Detection

[X] Semi Automatic

We can automatically detect large classes or track changes.

Tags

  • Coupling

Conclusion

Classes must follow the Single Responsibility Principle and have just one reason to change.

If they evolve in different ways, they are doing too much.

Relations

More Info


A design that doesn’t take change into account risks major redesign in the future.

Erich Gamma


This article is part of the CodeSmell Series.

Top comments (0)

Timeless DEV post...

Git Concepts I Wish I Knew Years Ago

The most used technology by developers is not Javascript.

It's not Python or HTML.

It hardly even gets mentioned in interviews or listed as a pre-requisite for jobs.

I'm talking about Git and version control of course.

One does not simply learn git