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
- 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
Code Smell 34 — Too Many Attributes
A class defines objects with lots of attributes.
blog.devgenius.io
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.