```indicationData = indicationData.copy( ...
# russian
l
Copy code
indicationData = indicationData.copy(
                        driver = indicationData.driver.copy(
                            excessiveTripTime = indicationData.driver.excessiveTripTime.copy(
                                state = SignalState.NORMAL
                            )
                        )
                    )
Что делать, чтобы не было copy copy copy copy? Там вложенные датаклассы по 10-15 свойств в каждом. И меняться может каждый из них. Больно
a
А почему бы поля мутабельными не сделать если уж все равно переприсвоение? Вместо того чтобы линзы переизобретать?
l
Потом хочется делать копирование всего объекта, ну и мутабельности по возможност избежать
a
В данном случае у тебя делается довольно вредная вещь, ты создаешь копию всего объекта и перезаписываешь ее в ту же ссылку. В общем делаешь ту же мутабельность через попу. Иммутабельность ради иммутабельности - вещь не очень хорошая. А копировать ты можешь и дата классы с изменяемыми полями
Я не говорю, что так никогда делать нельзя, просто надо подумать лишний раз над тем, что и зачем ты делаешь.
l
ты создаешь копию всего объекта и перезаписываешь ее в ту же ссылку Да ладно. Копия прям всего объекта?
a
Прям всего. Ты же для топового объекта copy вызываешь.
Он делает shallow copy всего объекта
l
Ну так не deep
Не всего уж
a
Ну я не знаю, что у тебя там за объект.
l
Там вложенные датаклассы по 10-15 свойств в каждом
Так что пусть будет shallow, окей. То, что не поменяно - трогаться не будет.
a
Согласен
То, что ты сейчас хочешь называется линзами и есть в том же Arrow. Но я сильно не рекомендую подтягивать Arrow ради этого.
l
Ну, все равно гляну для общего развития.
А почему не стоит?
a
глянь конечно, для этого ссылки и кинул. Там просто лекарство сильно вреднее, чем болезнь. Они подтягивают очень тяжелый компиляторный плагин и агромадное количество "тру-ФП" фич, которые нормальным людям не особо нужны.
Идея с этой либой умирать начинает.
l
Сайт очень красивый, но ничего не понятно
🙂 1
1
a
Разумеется
ФПшники еще очень любят сравнительно несложные вещи обвешивать диким количеством терминов из Computer Science. На самом деле они делают ровно то же, что ты со своими copy но при помощи кодогенерации
b
Не, я вот пожалел, что у меня есть мутабельный объект. Его отредактируешь в одном месте, а в другом он начинает что-то не то показывать
l
@beholder А надо держать такие объекты под контролем и не высовывать наружу свое мутабельное.
a
Поддерживаю. Просто затаскивать линзы ради объекта который изменяется ровно в одном месте - это так себе
a
Сделать Builder руками, возможно только для вот одного нужного поля.
Copy code
class Person(
    val name: String,
    val age: Int
) {
    fun withAge(age: Int): Person {
        return if (this.age == age) this else Person(name, age)
    }
}

val p1 = Person("Alex", 100)
println(p1.age)
val p2 = p1.withAge(200)
println(p2.age)
Вообще я бы с дата-классами аккуратнее был, equals/toString не для каждого POJO нужны, если внимательно так присмотреться.
g
а есть пример переизобретенных линз? Ну, те. код здорового человека (не arrow), который захотел спрятать copy?