Code Smell 124 — Divergent Change

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

Maximiliano Contieri
2 min readMar 24, 2022

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
}

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
}

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

--

--

Maximiliano Contieri

I’m a senior software engineer specialized in declarative designs. S.O.L.I.D. and agile methodologies fan. Maximilianocontieri.com