@kotlin_lang

Страница 825 из 982
Andrey
24.08.2018
12:42:23
Quantum Harmonizer
24.08.2018
12:42:35
Andrey
24.08.2018
12:45:26
кажется, если есть мембер, экстеншен недостижим)
Вообще это плохо. Один человек написал библиотечку с экстеншенами к другой библиотечке, потом в другой библиотечке другой человек сделал мемберы с теми же именами и прощай экстеншены. Их теперь никак не вызовешь, если не переделывать библиотечку с экстеншенами.

Google
Andrey
24.08.2018
12:46:52
похоже на design flaw

Andrey
24.08.2018
12:47:23
Ну можно же не топ левел сделать экстеншен
Никакой разницы. Все экстеншены от ресивера отвалятся, как только у него появятся перекрывающие мемберы. Притом наглухо и без права воскрешения.

Alexander
24.08.2018
12:48:04
и та к и так
Разучился я в конец писать на яве, но все-таки запустил. Для топ левел расширения все работает

Quantum Harmonizer
24.08.2018
12:48:22
похоже на design flaw
Ну ситуация такая: можно читать значение, а если в области видимости есть транзакция, то ещё и писать.

Alexander
24.08.2018
12:50:11
Практически тоже самое, только строка в ресивере и все работает

Может я не правильно вопрос понял. В джаве работает

Bogdan
24.08.2018
12:53:43
я кидал код с котлин кодом

Alexander
24.08.2018
12:54:13
Аа. Ну это другое

Bogdan
24.08.2018
12:54:27
вот проблема

Google
Bogdan
24.08.2018
12:54:28
Никакой разницы. Все экстеншены от ресивера отвалятся, как только у него появятся пееркрывающие мемберы. Притом наглухо и без права воскрешения.

Andrey
24.08.2018
12:59:10
Ага. И я выше описывал, как можно отловить эти грабли в условиях, когда два разраба пишут две библиотечки, притом оба ничего плохого не делают.

Alexey
24.08.2018
13:00:00
А кек в котлине нельзя вообще вызвать экстеншен эксплиситно

Kirill
24.08.2018
13:00:55
Ну потому что он не лежит там, видимо.

Andrey
24.08.2018
13:01:13
А кек в котлине нельзя вообще вызвать экстеншен эксплиситно
Судя по всему, нет. qualified вызовов для екстеншенов не предусмотрено.

В общем, экстеншены - вещь опасная с точки зрения поддержки изменений в коде

Bogdan
24.08.2018
13:03:10
Ага. И я выше описывал, как можно отловить эти грабли в условиях, когда два разраба пишут две библиотечки, притом оба ничего плохого не делают.
мне кажется тут уже всетаки совесть разработчика, причем обоих. Если есть важные вещи то зачем их помещать в екстеншены, такие функции служать для расширения функционала, особено когда у тебя чужая либа, код которой ты не поменяешь

В общем, экстеншены - вещь опасная с точки зрения поддержки изменений в коде
в джаве можно переопределить метод случайно, только умная иде тебе подскажет что тут что-то не так

Bogdan
24.08.2018
13:06:18
любая иде покажет @Override не?
> только умная иде тебе подскажет что тут что-то не так

любая иде покажет @Override не?
так и идея подскажет что екстеншен не вызывается

Andrey
24.08.2018
13:07:00
мне кажется тут уже всетаки совесть разработчика, причем обоих. Если есть важные вещи то зачем их помещать в екстеншены, такие функции служать для расширения функционала, особено когда у тебя чужая либа, код которой ты не поменяешь
Ну вот ты расширил функционал. Классический пример - map для Iterable в котлине сделан на экстеншенах. Потом кто-то другой добавил map в реализацию Iterable и код экстеншена недоступен.

Bogdan
24.08.2018
13:07:03
(подсветка)

Andrey
24.08.2018
13:07:37
так и идея подскажет что екстеншен не вызывается
Нет, не подскажет, если на момент написания экстеншена он не перекрыт

Alexey
24.08.2018
13:09:11
Намного проще когда данные и функции разделены, нет никакой мутоты с наследованием

Andrey
24.08.2018
13:09:33
банально такая фигня и с наследованием может случтся, то ошибка програмиста, который не смотрит и ничего не знает и не пытается
С наследованием ты всё равно можешь до super достучаться. Тут же код экстеншена вообще недоступен никак

Bogdan
24.08.2018
13:09:42
Нет, не подскажет, если на момент написания экстеншена он не перекрыт
ты видишь что вызываетяс мембер или екстеншен, если у тебя был мембер и ты написал екстеншен ты это увидешь, если тебя был екстеншен и ты написал мембер ты это увидешь

Google
Andrey
24.08.2018
13:12:03
ты видишь что вызываетяс мембер или екстеншен, если у тебя был мембер и ты написал екстеншен ты это увидешь, если тебя был екстеншен и ты написал мембер ты это увидешь
Ок. Я пишу экстеншен на ресивер из сторонней библиотеки. В моей версии библиотеки он не перекрыт. Потом овнер библиотеки, который слыхом обо мне не слыхивал, добавляет перекрывающих мемберов, у него тоже ничего не конфликтует. Я обновляю версию библиотеки и ловлю грабли на ровном месте.

Andrey
24.08.2018
13:13:18
импорты ?
И как они помогут?

Andrey
24.08.2018
13:14:48
если пекеджы различаются то да
Всё равно не помнимаю, как мне импорты помогут сделать код экстеншенов доступным. Только их переименование поможет. А переименовать я тоже не могу, так как это сломает код тех, кто мой код использует.

Andrey
24.08.2018
13:15:59
даную проблему можно приплести к чему угодно, в джаве к классам
С классами эта проблема решается путём выноса API

Bogdan
24.08.2018
13:16:57
С классами эта проблема решается путём выноса API
я напсал класс Point, и друг написал класс Point, причем оба в пакете mega.liba/. Удачи

Konstantin
24.08.2018
13:17:39
abstract class AbstractClass<T> { companion object{ private val stuffy: Stuff<T> = Stuff.create() } } подскажите что не так написал, пишет что unresolved reference в компаньоне

Andrey
24.08.2018
13:18:29
я напсал класс Point, и друг написал класс Point, причем оба в пакете mega.liba/. Удачи
Ну тут jar hell, он в kotlin так же есть. Только в kotlin, походу, ещё extension hell добавится, притом даже без коллизий имён по пакетам

Bogdan
24.08.2018
13:19:46
Руслан
24.08.2018
13:19:56
Импорты помогут не скомпилироваться такому коду. Импорты помогу сделать локальный алиас для импортированного экстеншена На практике конечно может такое случиться, но это все очевидно и контролируемо

Руслан
24.08.2018
13:21:52
import x.y.z as foo

Если не изменяет память, не могу проверить сейчас

Bogdan
24.08.2018
13:22:30
Google
Bogdan
24.08.2018
13:25:59
Andrey еще люди каке-то там тесты дурацкие пишут но вы их не слушайте

Руслан
24.08.2018
13:26:40
При всем этом экстеншены это одна из самых вкусных фич. Вторая конечно после конструкторов, но именно то чего очень сильно не хватает в джава. Не просто конечно экстеншенов, а экстеншенов и инлайна, ну и пропертей. Ой, опять котлин получился ;)

Andrey
24.08.2018
13:26:42
import x.y.z as foo
Спасибо тебе, добрый человек. Ты ответил на исходный вопрос, который и привёл к этому флуду.

Andrey
24.08.2018
13:28:18
Andrey еще люди каке-то там тесты дурацкие пишут но вы их не слушайте
А тесты тут вообще при чём? Понятно, что проблема отлавливаемая, вопрос был в том, как пофиксить на стороне того, кто пользует библиотеку экстеншенов.

о боже, я понял. Проблема архитектуры - это проблема архитектора а не яп.
Не согласен, что это проблема архитектуры. Экстеншены вводились для написания DSL в язык. 100% появятся библиотеки этих самых DSL на экстеншенах, а значит или их использовать и ловить потенциальные грабли, или свои велосипеды подо всё.

Bogdan
24.08.2018
13:32:55
А тесты тут вообще при чём? Понятно, что проблема отлавливаемая, вопрос был в том, как пофиксить на стороне того, кто пользует библиотеку экстеншенов.
> вопрос был в том, как пофиксить на стороне того, кто пользует библиотеку экстеншенов а, ну вариант написать класс на джаве со статиками, и из котлина вызывать

Alexey
24.08.2018
13:33:48
Мне кажется вы просто обсуждаете кейс, использования экстеншенов "не по назначению"

Admin
ERROR: S client not available

Alexey
24.08.2018
13:35:17
По мне экстендить стоит классы данных

Чтобы добавить "сахарка" в свой dsl

Boris
24.08.2018
13:36:13
Ну с точки зрения байт кода он и так static: public final static foo(LFoo;)Ljava/lang/String;
причем тут байт-код, если мы говорим про возможность языка?

Andrey
24.08.2018
13:38:19
ну вариант же ?
Особенно поможет в Kotlin JS и Kotlin Native

Bogdan
24.08.2018
13:39:06
Особенно поможет в Kotlin JS и Kotlin Native
там свои варянты найдутся

Andrey
24.08.2018
13:39:52
там свои варянты найдутся
В Native - палюбас. Через assembler вызывать ?

Руслан
24.08.2018
13:40:18
.... а как же корутины..
Определенно очень важная фича, но не в топе того что мне не хватает в джаве.

Quantum Harmonizer
24.08.2018
13:41:17
В Native - палюбас. Через assembler вызывать ?
О. Нам нужны ассемблерные вставки!

Google
Andrey
24.08.2018
13:41:41
Чтобы добавить "сахарка" в свой dsl
А потом автор класса данных сыплет соль на сахар, решив, что это уже не совсем класс данных, и добавив в него перекрывающих мемберов

Alexey
24.08.2018
13:42:50
Ссаными тряпками такого архитектора библитек надо гнать

Quantum Harmonizer
24.08.2018
13:43:20
ваще DTO — очень спорный паттерн

Alexey
24.08.2018
13:43:31
А при чем тут DTO

data != dto

ваще никак

Andrey
24.08.2018
13:44:32
кек, как данные могут стать не данными
Легко. Автор библиотеки с классами данных решил, что ничего плохого не будет, если в класс данных добавить мемберов. С точки зрения ООП ничего плохого и нет в расширении функциональности класса.

Alexey
24.08.2018
13:45:08
С точки зрения здравого смысла data class должны быть чистыми

Quantum Harmonizer
24.08.2018
13:45:25
Quantum Harmonizer
24.08.2018
13:45:43
у каждого свой здравый смысл
вот с моей точки зрения data class не нужны, например

Di7aK
24.08.2018
13:45:45
да не вдруг

Andrey
24.08.2018
13:45:49
С точки зрения здравого смысла data class должны быть чистыми
Что значит чистый? Неизменяемый? Без методов или как?

Alexey
24.08.2018
13:46:00
Ну взять и херить вещи пришедшие из функциональщины своим ООП - это такое

всё так

Quantum Harmonizer
24.08.2018
13:46:18
так о том и речь, ну такого создателя либ. Вот вы покупаете вещь вы ведь определеяете внимание на бренд
Обращать внимание на бренд? Лол, что за бред? Разве что проверить, не заведомо ли косячный бренд.

Di7aK
24.08.2018
13:46:23
а если его от Parcelable надо унаследовать

Alexey
24.08.2018
13:46:43
type class

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