@kotlin_lang

Страница 444 из 982
BaLoo
06.12.2017
11:42:45
Дата-классам не генерируется оператор проверки на меньше?

Quantum Harmonizer
06.12.2017
11:43:15
Дата-классам не генерируется оператор проверки на меньше?
Нет. Нет никакой гарантии, что никакое из полей дата-класса не содержит не-Comparable.

BaLoo
06.12.2017
11:43:40
Ээ... То же самое можно сказать и про equality.

Google
Quantum Harmonizer
06.12.2017
11:43:55
BaLoo
06.12.2017
11:44:06
Ясно, спасибо.

Igor
06.12.2017
11:44:16
Ээ... То же самое можно сказать и про equality.
Ты откуда такой? Java вообще что-ли в глаза не видел?

BaLoo
06.12.2017
11:44:34
Видел, я знаю, что оно умеет сравниваться по адресам по-умолчанию.

Просто не считаю это правильным поведением для data-классов.

Gor
06.12.2017
11:45:23
Просто не считаю это правильным поведением для data-классов.
каким образом можно автоматически реализовать компейр?

BaLoo
06.12.2017
11:46:02
Зачем реализовывать его заведомо неправильным способом для 80% случаев?

BaLoo
06.12.2017
11:46:22
Компейр.

Quantum Harmonizer
06.12.2017
11:46:43
Компейр.
Так поэтому и не реализовывает.

BaLoo
06.12.2017
11:47:02
А. Сорри, я про equal.

Quantum Harmonizer
06.12.2017
11:47:43
Если дата-класс содаржит примитивы, строки и дата-классы, то всё правильно.

Igor
06.12.2017
11:48:17
Видел, я знаю, что оно умеет сравниваться по адресам по-умолчанию.
У тебя есть два реальных варианта (и даже IDEA сама предлагает их) 1) data class StrData(var data: String) { operator fun compareTo(other: StrData): Int = data.compareTo(other.data) } 2) operator fun StrData.compareTo(other: Example8.StrData): Int = data.compareTo(other.data)

Google
BaLoo
06.12.2017
11:48:24
Тогда было бы классно, если бы он умел брат их реализацию и для сравнения на меньше.

Я хочу, чтоб это делал сам язык.

Увы.

Igor
06.12.2017
11:49:13
Я хочу, чтоб это делал сам язык.
Расскажи мне как он это сделает для? data class StrData(var data: Thread) Или для дву и более полей (из которых половина nullable) data class StrData(var data: String, val value: Int?)

Quantum Harmonizer
06.12.2017
11:49:30
Я хочу, чтоб это делал сам язык.
Если все свойства Comparable, в каком порядке их сравнивать?

https://youtrack.jetbrains.com/issue/KT-8466

Gor
06.12.2017
11:51:27
очень не очевидно

BaLoo
06.12.2017
11:51:41
А как ещё?

Gor
06.12.2017
11:51:50
ну сам подумай

поменялась у тебя логика

теперь нужно компейр делать в другом порядке

BaLoo
06.12.2017
11:52:22
Описываешь его ручками.

Gor
06.12.2017
11:52:26
что делать в таком случае? переопределять или менять/добавлять конструктор

ну вот видимо решили такую путаницу не делать

BaLoo
06.12.2017
11:52:45
Но уметь как-то сортировать элементы по-умолчанию было бы неплохо.

Quantum Harmonizer
06.12.2017
11:54:18
Но уметь как-то сортировать элементы по-умолчанию было бы неплохо.
«как-то» — плохо. Философия Котлина — всё должно быть явно и очевидно.

Google
BaLoo
06.12.2017
11:55:03
Как-то - не значит не очевидно.

Igor
06.12.2017
11:56:33
Это стоит делать для тех классов, где все элементы предоставляют такие методы.
Делать не фичу, которая работает в половине случае и каком-то узком кейсе - полный бред и никто это делать не будет. Тебе дали возможности расширения - вот ими и пользуйся.

BaLoo
06.12.2017
11:57:53
В моём понимании существование equals и отсутствие compare - полный бред.

Руслан
06.12.2017
11:59:33
compare прямо в объекте - полный бред

хочешь сравнивать - пиши компоратор

или заветы effective java забыты?

Quantum Harmonizer
06.12.2017
12:00:11
compare прямо в объекте - полный бред
О, хороший поинт. Я то же самое думаю и про equals.

Kirill
06.12.2017
12:00:19
преставь такой кейс: автор библиотеки предоставляет data class, где все поля Comparable, компилятор генерирует метод compareTo

ты на это закладываешься и радуешься жизни

в следующей версии библиотеки автор доавбялет новое поле с дефолтным значеним (для обратной совместимости)

но тип уже не Comparable

Igor
06.12.2017
12:00:51
В моём понимании существование equals и отсутствие compare - полный бред.
Не тупи, братишь, equals там унаследован от java.lang.Object (как и wait/toString) https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)

Kirill
06.12.2017
12:00:58
метод compareTo пропадает

твой код ломается

Quantum Harmonizer
06.12.2017
12:01:14
метод compareTo пропадает
ну, это сламывание совместимости автором

Руслан
06.12.2017
12:01:26
твой код ломается
и это тоже хороший поинт

Igor
06.12.2017
12:01:40
О, хороший поинт. Я то же самое думаю и про equals.
Думаешь equals/toString/wait/hashCode не нужны в базовых классах?

Kirill
06.12.2017
12:01:41
это будет означать что автор библиотеки на каждый data class должен писать тест

что он comparable

Google
Руслан
06.12.2017
12:01:56
ну, это сламывание совместимости автором
но если это делается under the hood то автор мог и не заметить

BaLoo
06.12.2017
12:02:27
Думаешь equals/toString/wait/hashCode не нужны в базовых классах?
Я думаю, что реализация equals через сравнение указателей для data-классов - бессмысленна.

Руслан
06.12.2017
12:02:29
Quantum Harmonizer
06.12.2017
12:03:01
потому что композиция?)
Нет, потому что объекты могут быть «равны» по-разному, в разном смысле, для разных целей.

Igor
06.12.2017
12:04:57
Нет, потому что объекты могут быть «равны» по-разному, в разном смысле, для разных целей.
А как ты предлагаешь работать функциям сортировки и тд? Везде явно передать лямбду или comparable? (или может быть через имплиситы…)

Kirill
06.12.2017
12:07:00
Из-за того что кому-то может понадобиться два критерия равенства все должны явно его передавать.

Так себе.

Phil
06.12.2017
12:08:03
Ну, вообще очевидного равенства или очевидного сравнения почти никогда не бывает. Полагаться на порядок полей в описании - это полный ужас.

Igor
06.12.2017
12:08:06
Admin
ERROR: S client not available

Quantum Harmonizer
06.12.2017
12:08:24
А что думаешь про toString?
норм, это чисто дебажная штука

Руслан
06.12.2017
12:08:29
А что думаешь про toString?
То же самое же - для разных мест разный toString

Как это дебажный? Я может хочу в console logger делать человеко понятный toString, а в file logger - json-like

нужно тоже передавать реализацию конкретную везде

Phil
06.12.2017
12:09:37
Ну, тогда пиши разные методы и передавай их явно. А стандартный toString - для дебага )

Но вообще не хватает хитрых средств обеспечения code style. Типа, если в code style есть стандарт на наличие в каждом классе домена двух вариантов toString, то как проверить это при сборке проекта? Аналогично - если у меня запрещено использовать встроенные синглтоны или глобальные переменные - то тоже хочется это проверять на этапе сборки проекта, а не через code review )

Phil
06.12.2017
12:17:10
Статические анализаторы под такие задачи не настроишь ( Это скорее отдельный инструмент, заточенный именно под kotlin и интегрированный с Idea. Но если что-то из этого уже есть - то буду рад ) Интерфейс - оно понятно, но как гарантировать, что все созданные в проекте классы его реализуют )

BaLoo
06.12.2017
12:18:26
Мне кажется, все пришли к мысли, что золотой пули не бывает. А попытки сделать полностью универсальное решение приведут к необходимости передачи той или иной реализации для каждого чиха. Так может быть всё-таки лучше решать большую часть проблем максимально простым способом, и только в редких случаях городить огород?

Google
Phil
06.12.2017
12:21:32
Этим путем шли многие языки, результат плачевный. Из прекрасного в истории - в некоторых языках переменные i,j,k всегда были только integer, они же обычно используются в циклах )

Но вообще универсального решения для сравнения вообще не бывает.

BaLoo
06.12.2017
12:26:06
Как мне кажется, идея смотреть на элементы data-класса, и предоставлять реализацию compare, когда в каждом из них он определён - скорее полезная вещь, чем нет. Мы ведь ни в чём при этом не ограничиваем пользователя класса.

Quantum Harmonizer
06.12.2017
12:27:18
чито?
равны ID; равно содержание; равны контекстно-зависимые метаданные

BaLoo
06.12.2017
12:29:54
Скорее вредная. Полезная — сделать это явно. Например, реализовывать Comparable если он есть в списке надтипов (data class X : Comparable<X>).
Я не совсем уверен, но это скорее относится к аспекту реализации, с точки зрения пользователя класса это будет выглядеть просто как наличествующая функция сравнения, нет?

Gor
06.12.2017
12:31:02
равны ID; равно содержание; равны контекстно-зависимые метаданные
одно одинаковое поле в объектах - не делает объекты равными(если у них не одно поле) вот если бизнеслогика требует то это явно не коммон кейс и скорее ломания "правильной" реализации сравнения

BaLoo
06.12.2017
12:31:24
Это крайне важный аспект реализации. Явность.
При этом нужно будет самому описывать реализацию сравнения?

Quantum Harmonizer
06.12.2017
12:32:04
одно одинаковое поле в объектах - не делает объекты равными(если у них не одно поле) вот если бизнеслогика требует то это явно не коммон кейс и скорее ломания "правильной" реализации сравнения
Допустим, в одном сете я хочу держать записи с уникальными ID, в другом — записи с уникальным содержимым. Всё, только обёртками обмазываться.

При этом нужно будет самому описывать реализацию сравнения?
Я сейчас не про реализацию руками говорю, с ней всё понятно.

Quantum Harmonizer
06.12.2017
12:34:01
Gor
06.12.2017
12:34:18
Нужны ли hashCode и equals сферическому объекту в вакууме?
да, потому что стандартные коллекции с ними работают

Quantum Harmonizer
06.12.2017
12:34:49
да, потому что стандартные коллекции с ними работают
Нужно ли разрешать действия, которые требуют сравнения, над объектами, которые не умеют сравнивать?

Gor
06.12.2017
12:34:51
поспешил) сферическому не нужны

нашему - нужны

Нужно ли разрешать действия, которые требуют сравнения, над объектами, которые не умеют сравнивать?
ну тебе язык явно сказал что объекты могут проверятся на идентичность, и могут иметь свой уникальный ключ - хеш

от этого и едем дальше

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