
Bogdan
08.10.2018
17:31:53

Георгий
08.10.2018
17:36:28
Есть очереди звонков, которые через настройки привязываются к филиалу. Данные связок забираются из апихи раз в N минут.
Кейс 1: когда звонки в очередь начали лететь до того, как изменили настройки. В этом случае нужно сначала создать очередь-пустышку, в которой данные филиала == null, а потом как только API отдаёт созданную конфигурацию, данные филиала подменяются в прокси и становятся доступны через очередь.
Кейс 2: когда настройки изменили, и новые настройки должны стать доступны через прокси после подгрузки из API.
Хотел всё это сделать одним оператором by =)) Эх, ну, попытаться стоило))


Bogdan
08.10.2018
17:39:45
Есть очереди звонков, которые через настройки привязываются к филиалу. Данные связок забираются из апихи раз в N минут.
Кейс 1: когда звонки в очередь начали лететь до того, как изменили настройки. В этом случае нужно сначала создать очередь-пустышку, в которой данные филиала == null, а потом как только API отдаёт созданную конфигурацию, данные филиала подменяются в прокси и становятся доступны через очередь.
Кейс 2: когда настройки изменили, и новые настройки должны стать доступны через прокси после подгрузки из API.
Хотел всё это сделать одним оператором by =)) Эх, ну, попытаться стоило))
Ну это мне напомнило врапер (по сути тот же делегат), ну можно через рефлекшин, например переопределить проперти data, и там рефлекшином сетить. Ну это конечно если других решений нет


Георгий
08.10.2018
17:41:11
Что-то как-то из пушки по воробьям ИМО))) Даже вот такой вариант:
class TestProxy(var data: Test): Test {
override val name: String get() = data.name
}
чище и понятнее, чем лазание в рефлекшин. Но за идею спасибо ?

Google


Bogdan
08.10.2018
17:42:04
@Metadata(
mv = {1, 1, 11},
bv = {1, 0, 2},
k = 1,
d1 = {"\u0000\u0014\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0006\n\u0002\u0010\u000e\n\u0002\b\u0003\u0018\u00002\u00020\u0001B\r\u0012\u0006\u0010\u0002\u001a\u00020\u0001¢\u0006\u0002\u0010\u0003R\u001a\u0010\u0002\u001a\u00020\u0001X\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\u0004\u0010\u0005\"\u0004\b\u0006\u0010\u0003R\u0012\u0010\u0007\u001a\u00020\bX\u0096\u0005¢\u0006\u0006\u001a\u0004\b\t\u0010\n¨\u0006\u000b"},
d2 = {"Lnet/zelenaya/groupwork/asteriskagent/TestProxy;", "Lnet/zelenaya/groupwork/asteriskagent/Test;", "data", "(Lnet/zelenaya/groupwork/asteriskagent/Test;)V", "getData", "()Lnet/zelenaya/groupwork/asteriskagent/Test;", "setData", "name", "", "getName", "()Ljava/lang/String;", "production sources for module asterisk-agent_main"}
)
public final class TestProxy implements Test {
@NotNull
private Test data;
// $FF: synthetic field
private final Test $$delegate_0;
@NotNull
public final Test getData() {
return this.data;
}
public final void setData(@NotNull Test var1) {
Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
this.data = var1;
}
public TestProxy(@NotNull Test data) {
Intrinsics.checkParameterIsNotNull(data, "data");
super();
this.$$delegate_0 = data;
this.data = data;
}
@NotNull
public String getName() {
return this.$$delegate_0.getName();
}
}
Странно зачем от тогда для data генерит сеттер ? Есть кто из jb ?


Георгий
08.10.2018
17:45:46
Но это, блин, нифига не интуитивно(( По крайней мере, когда читаешь доки по делегатам. Может, я невнимательно читал, конечно

Bogdan
08.10.2018
17:48:09

Георгий
08.10.2018
17:48:28
Почему же? К ней можно обратиться на чтение по имени поля. Тогда получишь новое значение.

Bogdan
08.10.2018
17:48:34

Георгий
08.10.2018
17:50:01
Было бы классно, если бы можно было после by как-то указать, что имеешь ввиду ссылку на поле data. Типа, поменялось там - делегация идёт в новое место.
class Clazz(val data: Interface): Interface by &data
Типа такого

Bogdan
08.10.2018
17:53:20
следовательно она никак с делегатом не связана


Andrey
08.10.2018
17:59:56
Что-то как-то из пушки по воробьям ИМО))) Даже вот такой вариант:
class TestProxy(var data: Test): Test {
override val name: String get() = data.name
}
чище и понятнее, чем лазание в рефлекшин. Но за идею спасибо ?
Подмен делегата через рефлексию имеет смысл, если делегат о куче методов/полей и пробрасывать их все руками тяжко. Нифига не безопасно и громоздко, но вот рабочий пример:
fun main(args: Array<String>) {
val proxy = TestProxy(TestData("old"))
println(proxy.name)
proxy.data = TestData("new")
println(proxy.name)
}
interface Test {
val name: String
}
class TestData(override val name: String) : Test
class TestProxy(data: Test) : Test by data {
var data: Test = data
set(value) {
delegateField.set(this, value)
field = value
}
companion object {
private val delegateField: Field by lazy {
val declaredFields = TestProxy::class.java.declaredFields
val field: Field = declaredFields.find { it.name.contains("\$\$delegate") }!!
field.isAccessible = true
val modifiersField = Field::class.java.getDeclaredField("modifiers")
modifiersField.isAccessible = true
modifiersField.setInt(field, field.modifiers and Modifier.FINAL.inv())
field
}
}
}
Ремерка: это грязный хак и не советую его использовать без вот прям крайней нужды (100500 полей/методов в делегате, которые надо пробрасывать руками)

Google

Quantum Harmonizer
08.10.2018
18:03:17
другой вариант с рефлексией: динамический прокси

Bogdan
08.10.2018
18:03:21

Георгий
08.10.2018
18:04:33

Quantum Harmonizer
08.10.2018
18:05:24
«торжественно клянусь, что замышляю только шалость»

Andrey
08.10.2018
18:06:21

Quantum Harmonizer
08.10.2018
18:06:48

Руслан
08.10.2018
18:07:33
Кто-нибудь метрики по корутинам/фьючам/любой другой асинхронщине собирает?

Andrey
08.10.2018
18:07:52

Quantum Harmonizer
08.10.2018
18:11:49
Кто-нибудь писал правила для DeteKt или работал с PSI котлина? Какой верный способ вытащить тело метода (сомневаюсь в правильности function.children.last()) и пройтись по нему?

dimiii
08.10.2018
18:13:52
>Nothing инстанциирует в лёт.
шалость удалась

Bogdan
08.10.2018
18:14:13

Жайык
08.10.2018
18:15:33
Всем привет можете подсказать использую Kodein в проекте есть класс DBHelper с релизаций SQlite и есть класс MainPresenter подскажите как обратится с класса MainPresenter к классу DBHelper через Кодин
немогу их связать)

eshch
08.10.2018
18:26:13
а в котлине есть бесконесный цикл без мерзкого while(true)?

Quantum Harmonizer
08.10.2018
18:27:07

Bogdan
08.10.2018
18:27:27

Mikhail
08.10.2018
18:29:16

eshch
08.10.2018
18:29:51

Bogdan
08.10.2018
18:30:10

Руслан
08.10.2018
18:30:11
Потому что это нужно практически никогда

Google

eshch
08.10.2018
18:30:13

Bogdan
08.10.2018
18:30:58
есть "бесконечный" сиквенс, ну или можно его сделать

Руслан
08.10.2018
18:31:40
Ну вот да, такое. Если это очень нужно (в чем проблема написать while(true)?) и полезно в проектах, то можно сделать мини библиотечку для себя и выкинуть её на maven

Mikhail
08.10.2018
18:32:12

Nameless
08.10.2018
18:32:16

Bogdan
08.10.2018
18:32:30

Mikhail
08.10.2018
18:33:02

Bogdan
08.10.2018
18:33:11

Quantum Harmonizer
08.10.2018
18:33:25
я вот вообще считаю, что 2/3 stdlib должны быть отдельными, необязательными артифактами

Nameless
08.10.2018
18:33:26

Mikhail
08.10.2018
18:33:50
И вообще, разве фреймворков нет?

Mikhail
08.10.2018
18:34:09

Quantum Harmonizer
08.10.2018
18:34:23

Bogdan
08.10.2018
18:34:29
ох уж эти ваши андроды

Quantum Harmonizer
08.10.2018
18:34:56

Mikhail
08.10.2018
18:35:12

Bogdan
08.10.2018
18:35:16

Mikhail
08.10.2018
18:35:25
Оно же выпиливается все

Bogdan
08.10.2018
18:35:36
причем тут котлин std либа

Google

Quantum Harmonizer
08.10.2018
18:35:41

Mikhail
08.10.2018
18:36:00
И сильно будет быстрее без стдлибы?
Есть бенчи?

Quantum Harmonizer
08.10.2018
18:37:05

Bogdan
08.10.2018
18:37:30
пока единий минус котлина (существенный), слишком много промежуточных классов

eshch
08.10.2018
18:38:28

Mikhail
08.10.2018
18:38:52

Admin
ERROR: S client not available

Руслан
08.10.2018
18:39:44

Bogdan
08.10.2018
18:40:05
Они вроде могут инлайниться прогардом
я не юзаю прогард, да и tornadoFX, где я этот недостаток увидел. Но как бы меня не сильно это волную, просто надеюсь сделаю когда-то. Ведь пилять новый компилятор с новой архитектурой

Mikhail
08.10.2018
18:40:33
Я видел твит Вортона, что он прогнал новый shrinker андроида R8 и он заинлайнил весь бойлерплейт даггера прямо в место DI

eshch
08.10.2018
18:41:02

Mikhail
08.10.2018
18:41:20

Руслан
08.10.2018
18:41:30

Mikhail
08.10.2018
18:41:34
Семантика while очень проста и понятна
while (<выражение>) <выражение>
И никаких спец кейсов

Google

eshch
08.10.2018
18:42:49

Mikhail
08.10.2018
18:42:56
Никакого дефолта нету

Руслан
08.10.2018
18:43:17

eshch
08.10.2018
18:43:55
почему нет?

Quantum Harmonizer
08.10.2018
18:44:39
ну вообще, мне нравится loop {} в Rust, но я не вижу никакой проблемы в его отсутствии.

eshch
08.10.2018
18:45:21
у вас странные категории зрения
если нет, то и не надо
есть и хер с ним

Руслан
08.10.2018
18:45:44
почему нет?
А почему да? Потому что нужно будет писать на 6 символов меньше? И для этого вводить отдельный синтаксис while без boolean expression?

Денис
08.10.2018
18:46:18
почему нет?
Ты чего-то не понимаешь, proof of burden lies with [positive] affirmation. Если ты говоришь, что это надо и "с этим лучше", то ты должен доказать, что это так. Никто не обязан доказывать, что необходимо отсутствие.

Mikhail
08.10.2018
18:47:24
почему нет?
если ты не сделал до сих пор себе утильный метод loop значит проблема не стоит даже того чтобы ее рассматривать

Денис
08.10.2018
18:48:03
есть и хер с ним
Угу, покажи мне тот бесконечный ряд программистов, у которого есть время под каждую такую хотелку переписывать компилятор и его части.

Руслан
08.10.2018
18:49:42
И будет два способа выразить одну мысль:
while {
// ...
}
и например у меня есть условие при котором while должен стать бесконечным
while (isDeamon) {
}
который хорошо сочетается визуально с существующим
while (true) {
}
Real life example: Вот есть либа, kotlinx.coroutines, там на 36212 строчек кода на котлине есть 133 while (true). Вроде не глупые люди пишут, и проблем с этим не испытывают

Mikhail
08.10.2018
18:51:18
и кстати, если перевести while с английского, будет "пока". сразу впрос: "пока что?"

Руслан
08.10.2018
18:51:41
И вот потом придет кто-то и скажет: "А зачем вы ввели loop, есть же while (true)"

Dmitriy
08.10.2018
18:52:38
until
?

eshch
08.10.2018
18:52:50

Nameless
08.10.2018
18:53:16
for (;;) {
}
алл хайль макаронному монстру