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
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
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.