@kotlin_lang

Страница 869 из 982
Roman
16.09.2018
13:12:28
Не надо сложных решений override fun toString() = secure(super.toString()) выглядит понятней

Igor
16.09.2018
13:12:46
Есть флажок такой override fun toString() = "". Ровно одна строчка кода
Уже писал выше: - это в каждом классе придется писать, а можно и забыть (а когда у тебя 100500 слоев “архитектуры” - это уже больно) - при разработке toString нужен

Mikhail
16.09.2018
13:13:01
Не надо сложных решений override fun toString() = secure(super.toString()) выглядит понятней
а super разве вызовется? для data класса же генерируется

Roman
16.09.2018
13:13:37
а super разве вызовется? для data класса же генерируется
Не вызовется. В этом случае toString вообще не будет сгенерен.

Google
Mikhail
16.09.2018
13:14:13
Уже писал выше: - это в каждом классе придется писать, а можно и забыть (а когда у тебя 100500 слоев “архитектуры” - это уже больно) - при разработке toString нужен
ну логи хорошо ложатся на Aспектно-ориентированное программирование (наверное, единственная вещь, которая на него неплохо ложится)

Mikhail
16.09.2018
13:15:15
можешь реально почикать все toString, только можно в рантайме получить где-нибудь на UI "ты чего залез в декомпилятор, падла?" если быть неаккуратным

Quantum Harmonizer
16.09.2018
13:16:44
мне кажется, что по-хорошему нужен способ вырезать все toString() так же, как обычно вырезают логи в релизных сборках.

Alexander
16.09.2018
13:19:06
Не подоспел к спору про кортежи. У меня к ним старая нелюбовь. Их очень любят в Питоне и руте, причем в действительности все от бедности. В питоне - потому что там объектная поддержка вообще слабая, а в руте - потому что С++ в самой монструозной ипостаси. Вообще не вижу смысла их использовать в человеческом языке. Map.Entry еще иногда встречаются, Максимум пары, тройки - уже не бывают.

А сейчас они всем нужны просто по привычку, как же так, в питоне-то есть

Roman
16.09.2018
13:19:53
По моему опыту правильно написанные toString это как раз то, что saves your ass когда что-то упало на prod, ну а секурные части (типа паролей и personaly identifyiable information) заменяются на ***

Ну а если какая-то security паранойся и никаких toString и никаких логов быть не должно, то тогда наверное действительно проще написать трасформер который все выпиливает для prod сборку. Уже очень это доменно-специфичный случай

Igor
16.09.2018
13:21:30
Умел бы это proguard делать, вопросов бы никаких не было к котлину

Quantum Harmonizer
16.09.2018
13:21:43
Google
Roman
16.09.2018
13:22:51
был случай, когда я разреверсил поля по имени a, b и c именно по toString(). Дменно-специфичный случай — client-side.
А чего логи на клиентах делать и посылать их разработчикам при крэше нынче не модно?

OlegKrikun
16.09.2018
13:23:41
Мапинги от прогуарда потерял наверное =)

Alexander
16.09.2018
13:24:27
а что не так в питоне с объектной моделью?
С точки зрения человека, привыкшего к нормальному ОП - криво и странно. Питон просто не располагает писать объектно, он больше процедурно ориентированный. Я знаю, что на нем можно делать все объектно. Ну и на Java можно делать все функционально, но не удобно, поэтому и не делают.

Igor
16.09.2018
13:27:32
был случай, когда я разреверсил поля по имени a, b и c именно по toString(). Дменно-специфичный случай — client-side.
Запилишь KEEP? Потом вместе сделаем патч к компилятору, думаю он элементарный (в if обернуть ?)

Phil
16.09.2018
13:27:37
мне кажется, что по-хорошему нужен способ вырезать все toString() так же, как обычно вырезают логи в релизных сборках.
Когда нам нужно было обеспечить безопасное логирование (PCI DSS etc), то просто написали адаптер для logback с соответствующими проверками. Ну и еще независимую проверку от СБ на уже сформированных логах после выкладки. Это надежнее с точки зрения разворачивания на разных средах, позволяет (при большой необходимости) включить нужное логгирование и проще в реализации, чем всякие прагмы для компилятора.

OlegKrikun
16.09.2018
14:09:13
Так, чо то я запутался ? какую версию kotlinx.coroutines пихать в зависимости для котлин 1.3М2? UPD: 0.26.0-eap13 ???

Quantum Harmonizer
16.09.2018
14:11:35
Запилишь KEEP? Потом вместе сделаем патч к компилятору, думаю он элементарный (в if обернуть ?)
Я вообще считаю, что вместо дата-классов должно быть что-то вроде override fun hashCode(): Int by DataClasses.hashCode(), и вот уже у этой функции пусть будет intrinsic-реализация.

Roman
16.09.2018
14:23:21
Я вообще считаю, что вместо дата-классов должно быть что-то вроде override fun hashCode(): Int by DataClasses.hashCode(), и вот уже у этой функции пусть будет intrinsic-реализация.
Только синтаксис надо проще override fun hashCode() == dataClassHashCode(), где dataClassHashCode это inline extension function с reified параметром T. Можете такую себе через reflection написать. А вообще было бы круто, если бы компилятор её умел не просто inline-ить, но и специализировать по конкретный типа. У нас для этого механизма есть рабочее название "compile time reflectino"

Mikhail
16.09.2018
14:28:46
Я восхищаюсь ребятами из JB, какой надо силой воли обладать, чтобы столько всяких блестяшек не затянуть в язык

Не очень понимаю фразу "специализировать под конкретный тип"

Roman
16.09.2018
14:32:45
Ну просто такой inline на стероидах. Сначала делаем inline, потом видим что код, которые там через reflection идет по всем полям и считает общий hashcode на самом деле зависит от списка полей класса который на уже известен во время компиляции (мы ведь сделали inline в конкретный класс), поэтому можно статические известные значения и ссылки на все поля воткнуть, цикл по полям раскрыть. Получится в итоге ровно такой же код, как бы если бы мы делали для этого intrinsic в компиляторе. А так никакого intrinsic не надо. Если кому-то надо, то он сможет написать свою версию "шаблона" для toString или hashCode или еще чего угодно.

Но это всё мечты. В ближайшем будущем ничего такого появиться не может. Инфраструктура компилятора не готова. Надо на IR сначала первести всё

Roman
16.09.2018
14:36:35
^^ OH GOD NO! Как вы для макросов tooling всякий будете делать? Ответ — как в Scala, то есть ни как или с большми матюгами

Google
Roman
16.09.2018
14:37:32
Я же здесь предлагаю обычные inline fun только чуть по мощней. И все обычные механизмы работы с функциями с ними работают как обычно

Igor
16.09.2018
14:38:57
Да макросы прсто нужны… или плагин к компилятору (что бы как lobmok ? с аннотацией data)
Вот точно как https://projectlombok.org/features/Data @Data is a convenient shortcut annotation that bundles the features of @ToString, @EqualsAndHashCode, @Getter / @Setter and @RequiredArgsConstructor together Каждый сможет собрать свою аннотацию по вкусу ?

Roman
16.09.2018
14:40:18
Вот точно как https://projectlombok.org/features/Data @Data is a convenient shortcut annotation that bundles the features of @ToString, @EqualsAndHashCode, @Getter / @Setter and @RequiredArgsConstructor together Каждый сможет собрать свою аннотацию по вкусу ?
Это те же макросы вид сбоку. Или под каждую такую аннотацию вам надо писать свой IDE plugin, или ничего нормально в IDE не работает.

"Помощней" только для reified кейса, так?
Ну это по вкусу. Мощь inline фукнций можно наращивать круто или не очень круто — зависит от use-cases которые хочется покрыть

Как в lombok дать свой формат toString? Только через вагоны параметров (настроек) которые захародкожены в Lombok. Получается какой-то особенный язык описания функция toString. Я же предлагаю, чтобы каждый мог иметь возможность написать свой toString на языке Kotlin

Alexander
16.09.2018
15:47:36
А зачем вообще нужен какой-то мощный арсенал для toString?

dimiii
16.09.2018
16:06:36
Так. Я опоздал на священную войну. Но все же, вброшу пару фактов, которые не опровергнуть. Дата классы нужнее, чем кортежи, хотя бы потому что есть возможность делать осмысленные проекции. Недаром же даже в языке с кортежами и сравнением образцов завезли record syntax. Всему можно дать имя, пусть и неуклюжее - типа StepNameResult

Да и по сути - кортежи это дата классы бедного человека

Igor
16.09.2018
16:07:51
Да и по сути - кортежи это дата классы бедного человека
Кмк, должно существовать и то, и то, и с data-классами мне не хватает кортежей иногда (а вот с кортежами без data-классов вполне возможно что жилось бы плюс-минус нормально).

Alexander
16.09.2018
16:10:49
Из питона тоже пытаются сделать перл

Так что он выше в смысле эволюции

Igor
16.09.2018
16:12:09
а пример реального использования кортежа ?
Да без проблем: 1) паттерн-матчинг, который у меня есть, и меня бесит оборачивать в TupleN матчащиеся значения, приговаривая "больше скобок богу скобок" 2) Внедрение зависимостей (ну, опять же, такое скорее всегоо в проде у меня и пары-тройки таких же как я: https://gist.github.com/komigor/f795381cad13352b0c62946a6b1e0dae) 3) По вашим пожеланиям, есть еще несколько кейсов, если нужно – вкину.

Alexander
16.09.2018
16:14:18
Ваш паттерн матчинг - это ваш собственный способ убиться об стену. Во-первых, много раз уже говорилось, что в котлине он не нужен, во- вторых, он у вас исходно сделан таким образом, чтобы работать на туплах. Внедрение зависимостей в общем случае вообще к туплам отношениея не имеет, там наоборот именованные поля более актуальны.

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

Google
Alexander
16.09.2018
16:17:16
Туплы - это вообще синтаксический сахар ранних языков, причем довольно убогий. Для того, чтобы с ними делать что-то разумное, к ним должно прилагаться описание формата, а тогда это уже недо-датаклассы.

Насмотрелся я на это в руте. Они там еще и сериализацию туплов делают. Получается, если что, мрак и жуть.

Alexander
16.09.2018
16:19:18
Это не ЯП, это платформа церновская: https://root.cern.ch/

Программистам смотреть осторожно, глаза вытекут

Phil
16.09.2018
16:20:24
(Мне это напоминает один большой java-проект, который делал perl senior, а мне пришлось сопровождать. На входе из полученного xml делался hashmap (с вложенными hashmap), который потом проходил через пару сотен функций, превращался опять в XML и отдавался в верстку. Мы это рефакторили года три).

Andrey
16.09.2018
16:21:18
Admin
ERROR: S client not available

Alexander
16.09.2018
16:22:02
Матлаб шибко медленный. Кроме того, эта штука старше. Ну и лицензии

Не поверете, но на этом весь ЦЕРН работает поголовно и не только

Igor
16.09.2018
16:23:21
Туплы - это вообще синтаксический сахар ранних языков, причем довольно убогий. Для того, чтобы с ними делать что-то разумное, к ним должно прилагаться описание формата, а тогда это уже недо-датаклассы.
Кстати в свеженький c# 7 таки завезли синтаксис для тюплы. Впринципе получилось неплохо, хотя я хз кто будет дата-саентистить на с# (когда есть f#)

Alexander
16.09.2018
16:23:22
Так вот. Там туплы очень любят, вместо таблиц сплошные списки туплов

Quantum Harmonizer
16.09.2018
16:33:30
А copy/equals/componentN ???
Copy, equals — так же, component — не знаю :)

Igor
16.09.2018
16:54:39
Алексей
16.09.2018
17:00:34
у меня это в проде, если у вас там чистый ООП, вам они не нужны.
Ну чистый ООП - это скорее утопия:) причем банально в силу человеческой лени

Mi
16.09.2018
17:03:03
Чистое - не значит удобное и практичное

Алексей
16.09.2018
17:04:20
Если говорить про ооп - практичное, но не во всем удобное

Я точно могу сказать, что инкапсуляция через интерфейсы всего - это очень практично, но мало кем практикуется на уровне полного внедрения

Google
Алексей
16.09.2018
17:07:25
А что такое "чистый ооп"?
Соблюдение всех принципов:) очевидно же

Igor
16.09.2018
17:08:14
Соблюдение всех принципов:) очевидно же
Принципов как в smalltalk/erlang? ? Там же истинный ооп.

Igor
16.09.2018
17:08:16
Ну чистый ООП - это скорее утопия:) причем банально в силу человеческой лени
Ну вот насколько он не чистый, а склоненный к ФП, настолько такие вещи как монады/оптика/продукты и начинают быть нужны. Если совсем фп-головного мозга, то и вещи поинтереснее.

ИМХО, мне например оптика в проекте код сделала куда более читаемым и сократила его раза в два. Особенно presentation слой.

Алексей
16.09.2018
17:09:27
Оптика?

Mikhail
16.09.2018
17:13:25
короткий != читаемый, и легко понимаемый
если ты не знаком с концепциями, с помощью которых был написан код, то его скорее всего не поймешь, и это далеко не только к ФП применимо

Igor
16.09.2018
17:13:37
короткий != читаемый, и легко понимаемый
Проблемы тех, кто будет потом мой код поддерживать. Недостаточно скилов => дадут другой проект.

Алексей
16.09.2018
17:14:54
Имхо, независимо от либ и прочего, если код невозможно читать - либо это хитрожопый костыль, либо он плохо написан

Igor
16.09.2018
17:16:49
?? интересный подход (джобсекьюрити зашкаливает)
Ну, то есть, я там планирую быть еще долго, вики по проекту будет писаться по его закрытию, детальная, с описанием всех концепций и полной документацией. Если после этого кто-то не сможет поддерживать код – это уже клиника же :)

Mikhail
16.09.2018
17:16:52
это от популярности технологии зависит - хороший пример - Rx. В андроиде сейчас я не видел ни одного продового проекта без Rx. А на IOS знакомые говорили, что боятся внедрять, чтобы не приходилось обучать долго разработчиков

кстати, набросал тут gist про паттерн-матчинг на ComponentN https://gist.github.com/Mishkun/9430a6740858876895c1eb0f870b7a59

Igor
16.09.2018
17:29:57
кстати, набросал тут gist про паттерн-матчинг на ComponentN https://gist.github.com/Mishkun/9430a6740858876895c1eb0f870b7a59
Мне нравится :) Но лучше все-таки добавить генерацию для всех Tupleов

Mikhail
16.09.2018
17:32:55
так ты можешь свой data class просто пометить интерфейсом ComponentN

сами методы же котлин генерит

Igor
17.09.2018
08:46:43
Может кто сказать, будет ли это работать? (см gson.kt внутри функцию serializersFix) https://gist.github.com/komigor/548820a0a6008fb0e725ca00afdcb3a1

Friedrich
17.09.2018
08:51:41
Может кто сказать, будет ли это работать? (см gson.kt внутри функцию serializersFix) https://gist.github.com/komigor/548820a0a6008fb0e725ca00afdcb3a1
Никто, кроме безумного автора сих строк, не в силах понять, будет это работать или нет.

Страница 869 из 982