TL;DR: Соблюдайте границы объектов: избегайте привязки к данным и отдавайте приоритет интерфейсам и поведению.

Когда вы рассматриваете свои объекты просто как держатели данных, вы рискуете нарушить их инкапсуляцию.

Проблема

  • Информация, скрывающая нарушение
  • Нарушение инкапсуляции
  • Связь

Решение

  • Всегда связывайтесь с интерфейсами и поведением, а не с данными.

Образец кода

Неправильный

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

Верно

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

Заключение

Если ваши классы загрязнены сеттерами, геттерами и общедоступными методами, у вас наверняка найдутся способы подключиться к их случайной реализации.

Нравится то, что вы читаете? Давайте оставаться на связи!

Погрузитесь глубже, пообщайтесь или просто свяжитесь со мной:

Линкедин | Твиттер

Будьте в курсе моих последних мыслей и идей, подписавшись на мою рассылку новостей.

Кредиты

Оригинально опубликовано на https://yonatankarp.com.

Спасибо, что дочитали до конца. Пожалуйста, подумайте о том, чтобы подписаться на автора и эту публикацию. Посетите Stackademic, чтобы узнать больше о том, как мы демократизируем бесплатное образование в области программирования во всем мире.