Kotlin Code Smell 36 - Object Coupling

Kotlin Code Smell 36 - Object Coupling

Object Boundaries Respected: Navigating Coupling Challenges

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.

Credits