https://kotlinlang.org logo
#russian
Title
# russian
l

lewik

04/22/2020, 2:36 PM
Copy code
indicationData = indicationData.copy(
                        driver = indicationData.driver.copy(
                            excessiveTripTime = indicationData.driver.excessiveTripTime.copy(
                                state = SignalState.NORMAL
                            )
                        )
                    )
Что делать, чтобы не было copy copy copy copy? Там вложенные датаклассы по 10-15 свойств в каждом. И меняться может каждый из них. Больно
a

altavir

04/22/2020, 8:07 PM
А почему бы поля мутабельными не сделать если уж все равно переприсвоение? Вместо того чтобы линзы переизобретать?
l

lewik

04/23/2020, 7:50 AM
Потом хочется делать копирование всего объекта, ну и мутабельности по возможност избежать
a

altavir

04/23/2020, 7:52 AM
В данном случае у тебя делается довольно вредная вещь, ты создаешь копию всего объекта и перезаписываешь ее в ту же ссылку. В общем делаешь ту же мутабельность через попу. Иммутабельность ради иммутабельности - вещь не очень хорошая. А копировать ты можешь и дата классы с изменяемыми полями
Я не говорю, что так никогда делать нельзя, просто надо подумать лишний раз над тем, что и зачем ты делаешь.
l

lewik

04/23/2020, 8:03 AM
ты создаешь копию всего объекта и перезаписываешь ее в ту же ссылку Да ладно. Копия прям всего объекта?
a

altavir

04/23/2020, 8:03 AM
Прям всего. Ты же для топового объекта copy вызываешь.
Он делает shallow copy всего объекта
l

lewik

04/23/2020, 8:04 AM
Ну так не deep
Не всего уж
a

altavir

04/23/2020, 8:04 AM
Ну я не знаю, что у тебя там за объект.
l

lewik

04/23/2020, 8:04 AM
Там вложенные датаклассы по 10-15 свойств в каждом
Так что пусть будет shallow, окей. То, что не поменяно - трогаться не будет.
a

altavir

04/23/2020, 8:05 AM
Согласен
То, что ты сейчас хочешь называется линзами и есть в том же Arrow. Но я сильно не рекомендую подтягивать Arrow ради этого.
l

lewik

04/23/2020, 8:08 AM
Ну, все равно гляну для общего развития.
А почему не стоит?
a

altavir

04/23/2020, 8:10 AM
глянь конечно, для этого ссылки и кинул. Там просто лекарство сильно вреднее, чем болезнь. Они подтягивают очень тяжелый компиляторный плагин и агромадное количество "тру-ФП" фич, которые нормальным людям не особо нужны.
Идея с этой либой умирать начинает.
l

lewik

04/23/2020, 8:15 AM
Сайт очень красивый, но ничего не понятно
🙂 1
1
a

altavir

04/23/2020, 8:16 AM
Разумеется
ФПшники еще очень любят сравнительно несложные вещи обвешивать диким количеством терминов из Computer Science. На самом деле они делают ровно то же, что ты со своими copy но при помощи кодогенерации
b

beholder

04/23/2020, 11:39 AM
Не, я вот пожалел, что у меня есть мутабельный объект. Его отредактируешь в одном месте, а в другом он начинает что-то не то показывать
l

lewik

04/23/2020, 12:17 PM
@beholder А надо держать такие объекты под контролем и не высовывать наружу свое мутабельное.
a

altavir

04/23/2020, 12:18 PM
Поддерживаю. Просто затаскивать линзы ради объекта который изменяется ровно в одном месте - это так себе
a

alex

04/24/2020, 9:48 PM
Сделать 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

ghedeon

06/18/2020, 11:00 PM
а есть пример переизобретенных линз? Ну, те. код здорового человека (не arrow), который захотел спрятать copy?
3 Views