DEV Community

Yonatan Karp-Rudin
Yonatan Karp-Rudin

Posted on • Originally published at yonatankarp.com on

Kotlin Code Smell 12 - Ripple Effect

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
Enter fullscreen mode Exit fullscreen mode

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)
    }

    // ...
}
Enter fullscreen mode Exit fullscreen mode

Conclusion

There are multiple strategies to deal with legacy and coupled systems. It is essential to address this problem before it becomes unmanageable.


Stay updated with my latest thoughts and ideas by registering for my newsletter. Connect with me on LinkedIn or Twitter. Let's stay connected and keep the conversation going!


More info

Credits

Top comments (0)