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.
I hope you enjoyed this journey and learned something new. If you want to stay updated with my latest thoughts and ideas, feel free to register for my newsletter. You can also find me on LinkedIn or Twitter. Let's stay connected and keep the conversation going!
Top comments (0)