Kotlin Code Smell 12 - Ripple Effect
When Ripples Become Waves: The Importance of Decoupling

I've started to work as a software engineer at 2014, however, I started to write code at high-school.
My first language was Assembly, but still, I fall in love with the possibilities to make the computer to do as you wish, shortly after that I started to write in C.
Later on I studied a practical engineering in electricity, and during this time discovered that I preferred much more writing code than design electrical components.
As a result of this understanding I decided to switch and study bachelor degree in computer science in Reichman university, where the focus was of the Java language.
Today I'm working at SumUp using Kotlin, SpringBoot & Micronaut, Cassandra and Kafka
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.




