Kotlin Code Smell 36 - Object Coupling
Object Boundaries Respected: Navigating Coupling Challenges
Table of contents
TL;DR: Respect object boundaries: avoid coupling to data and prioritize interfaces and behavior.
- When you view your objects merely as data holders, you risk violating their encapsulation.
Problem
Information Hiding Violation
Encapsulation Violation
Coupling
Solution
- Always couple to interfaces and behavior, not data.
Sample Code
Wrong
data class Point(var x: Double, var y: Double)
class DistanceCalculator {
fun distanceBetween(origin: Point, destination: Point): Double {
return sqrt(
(destination.x - origin.x).pow(2) +
(destination.y - origin.y).pow(2)
)
}
}
Right
data class Point(
private val radius: Double,
private val theta: Double
) {
val x: Double get() = radius * cos(theta)
val y: Double get() = radius * sin(theta)
}
class DistanceCalculator {
fun distanceBetween(origin: Point, destination: Point): Double {
return sqrt(
(destination.x - origin.x).pow(2) +
(destination.y - origin.y).pow(2)
)
}
}
Conclusion
If your classes are polluted with setters, getters and public methods you will certainly have ways to couple to their accidental implementation.