Kotlin Code Smell 12 - Ripple Effect
When Ripples Become Waves: The Importance of Decoupling
TL;DR: If small changes have a significant impact, you need to decouple your system.
Problems
- Coupling
Solutions
Decouple.
Cover with tests.
Refactor and isolate what is changing.
Depend on interfaces.
Examples
- Legacy Systems
Sample Code
Wrong
class Time(
private val hour: Int,
private val minute: Int,
private val seconds: Int
) {
fun now() {
// call operating system
}
}
// Adding a TimeZone will have a big Ripple Effect
// Changing now() to consider timezone will also bring the effect
Right
// Removed now() since it is invalid without context
data class Time(
private val hour: Int,
private val minute: Int,
private val seconds: Int,
private val timezone: String
)
class RelativeClock(private val timezone: String) {
fun now() {
val localSystemTime = this.localSystemTime()
val localSystemTimezone = this.localSystemTimezone()
// Make some calculations to translate timezones...
return Time(..., timezone)
}
// ...
}
Conclusion
There are multiple strategies to deal with legacy and coupled systems. It is essential to address this problem before it becomes unmanageable.