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, чтобы узнать больше о том, как мы демократизируем бесплатное образование в области программирования во всем мире.