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.
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!
Top comments (0)