Инкапсуляция data class
Всем привет,скажите пожалуйста, правильно ли я поступаю,когда инкапсулирую параметры в data class,приведу пример,есть клиент серверное приложение и у меня есть модкль данных,данные я беру с сервера,к примеру,и по сколько я пытаюсь писать ООП код я делаю так:
abstract class Abstract {
abstract class Object<T, M:Mapper>{
abstract fun map(mapper: M) : T
}
interface Mapper{
class Empty : Mapper
}
data class BookServerModel(
private val id:Int?= null,
private val name: String?= null):Abstract.Object<BookData,BookServerToDataMapper>() {
override fun map(mapper: BookServerToDataMapper): BookData {
return mapper.map(id,name)
}
Вот,то есть вместо того,чтобы делать параметры дата класса публичными,я делаю их приватными и с помощью мапперов я посылаю данные куда мне надо, то есть не нарушаю инкапсуляцию. Вопрос: Правильно ли я поступаю? Правильно ли я делаю,что ставлю private,а не public
Ответы (1 шт):
Есть такая интересная штука как API.
Если взглянуть на неё шире, чем просто на API погоды сайта siteOfPogoda.com, то, мы увидим вот что:
Есть некая неизвестная для вас система(класс/что-угодно ещё)(тоесть, допустим, вы не знаете точно как она работает(тот же компьютер, врятли вы знаете как из електричества получается то что на мониторе)), которая вам сразу показывает ряд своих возможностей.
Вот, допустим, что вы смотрите на что-то, и всё всё знаете, что это нечто делать может.
Вы смотрите на класс извне, и знаете его возможности - в 100% случаев это ТОЛЬКО, ИСКЛЮЧИТЕЛЬНО публичные свойства, и методы.
Так вот, те возможности, которые вам как пользователю извне предоставляет система - это всё и является на самом деле понятием API. Api сайта погоды - частный случай, который подтверждает это правило.
В программировании мы скрываем данные, не потому что так есть какое-то уставное правило, или потому что кто-то так сказал, и все так делают. Мы скрываем данные, потому что есть возможности, которые надо использовать извне, и есть те - которые 100% не надо.
Когда вы спрашиваете себя, надо ли здесь делать что-то публичным, спросите себя: а надо ли подобное API пользователю?
Если да, и оно будет использоватся, то офк делайте public, если же это 100% только внутренняя часть - то 100% закрывайте
P.S так же, отдельно стоит рассмотреть публичные свойства.
Помните ВСЕГДА - это очень опасная штука. Просто так лучше их никогда не обьявлять, тк мало ли что пользователь туда введёт.
В моей практике,
- приходится использовать их в ActiveRecord(потому что это правила фреймворка)
- использую в DTO(и то, не всегда), потому что DTO по сути и должен просто доставить данные со слоя А в слой Б