Kotlin Code Smell 12 - Ripple Effect

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.

More info

Credits