@kotlin_lang

Страница 879 из 982
Тимур
19.09.2018
10:14:13
конфиг и ссылается на id, но потом загрузчик все ресурсы резолвит в прямые ссылки на id потому что дальше эти id никому не нужны прямая ссылка на соответствующий ресурс - это и есть id

Andrey
19.09.2018
10:14:17
мне кажется все(ну по крайней мере большинство) из тех кто топит за ручную сборку и прочие kiss не заглядывали даже в gof
Насчёт gof - а вы читали критику паттернов проектирования? В курсе, что большую часть из них становится не нужной, если есть анонимные функции в языке, а остальные перекрываются таким формализмом общей алгебры, как монада? Вообще, мне периодически приходится не только писать код, но и рассказывать про программирование (занимаюсь репетиторством ради удовольствия). Вот заметил такую болезнь: паттерны головного мозга - когда школьник/студент легко понимает простые абстракции общей алгебры, но если перед началом занятий он уже пробовал паттерны, понятие монады может как-то осознать только когда скажешь ему, что это такой специальный билдер с хорошо определённым контрактом на операции.

В общем, прошить недостающую часть компилятора себе в голову - не лучшая идея, как по мне.

Тимур
19.09.2018
10:21:35
Ну это тоже самое что описать граф, а графы обычно описывают как две сущности: объект, и связь между объектами
описать граф можно кучей способов но главное, что по своей природе граф может иметь циклы когда мы заменяем объекты на id, всякие прокси и так далее - это просто такая попытка обмануть природу вещей, замаскировать циклы ООП трюками иногда это работает но иногда проще и удобнее хранить граф в его натуральной, естественной форме

Google
Andrey
19.09.2018
10:29:47
описать граф можно кучей способов но главное, что по своей природе граф может иметь циклы когда мы заменяем объекты на id, всякие прокси и так далее - это просто такая попытка обмануть природу вещей, замаскировать циклы ООП трюками иногда это работает но иногда проще и удобнее хранить граф в его натуральной, естественной форме
А что такое натуральная и естественная форма хранения графа? Направленный граф, например, можно хранить в виде Map<Node, List<Node>>, где ключи - узлы, значения - список узлов, в которые можно пройти из узла. Это естественная форма?

Тимур
19.09.2018
10:32:38
А что такое натуральная и естественная форма хранения графа? Направленный граф, например, можно хранить в виде Map<Node, List<Node>>, где ключи - узлы, значения - список узлов, в которые можно пройти из узла. Это естественная форма?
в зависимости от задачи если например надо искать в графе путь, то да, удобно в каждом узле хранить ссылки в соседние узлы, так как это нужно для алгоритма поиска

Alexandr
19.09.2018
10:40:08
Если сможете привести пример где без таких костылей вроде dynamic proxy не обойтись, я признаю свою неправоту
приложение с динамической логикой, когда есть некоторый механизм в виде нормализованного ООП домена, инжектится все по интерфейсу и в местах где в зависимости от контекста (тип запроса, подтип отчета, которые строится по общему шаблону, в конце концов роль текущего пользователя) нужна кастомизация логики - инжектится прокси и по факту вызова в зависимости от контекста вызывается та реализация, которая сейчас нужна

это в какой-то степени стратегия получается

Alexandr
19.09.2018
11:00:15
Передаёшь нужную стратегию лямбдой или несколькими, в зависимости от контекста.
в document generation engine размером в 50+ классов в котором более 10+ подобных кастомизаций с 3-4 реализациями, которые еще могут комбинироваться?

ну можете дальше так жить :)

а, да, еще и через весь стек с парой десятков вызовов прокинуть) мои поздравления)

Andrey
19.09.2018
11:04:51
в document generation engine размером в 50+ классов в котором более 10+ подобных кастомизаций с 3-4 реализациями, которые еще могут комбинироваться?
Лямбды прекрасно комбинируются друг с другом. Большая часть ФП (комбинаторная логика, общая алгебра) про то, как всё со всем комбинировать, не получая при этом вложенных if/switch

Mikhail
19.09.2018
11:08:05
я бы не давал таких поспешных заявлений

Google
Mikhail
19.09.2018
11:08:43
но я намекаю что если система изначально задумывалась для использования прокси любой другой паттерн будет выглядеть как сова на глобусе

Andrey
19.09.2018
11:09:47
я просто спорить не буду :) каждй все равно при своем мнении останется
Да я и не призываю спорить. Я просто предлагаю вам посмотреть альтернативы, как ещё это решается без лишних проблем. Бандой четырёх проектирование не исчерпывается. Как по мне, так они продали под разнообразным соусом то, что называется лямбда абстракцией и частичным применением.

И вообще, они эти паттерны писали под C++, в котором, на тот момент, не было анонимных реализаций классов, лямбд и прочего. То есть, как раз и предлагали прошить в голову недостающую часть языка/компилятора в виде паттернов.

Тот же DI в функциональных языках с богатой системой типов (F#, Haskell) вполне может быть отдан на откуп компилятора, который, в зависимости от типа контекста подберёт нужную реализацию, статически свяжет её в выражении, где она используется, возможно ещё и заинлайнит для скорости.

И всё это с проверками типов и на этапе компиляции. В Kotlin так не всегда получится (система типов бедновата), но в большинстве случаев тоже реально.

Igor
19.09.2018
11:37:58
А тут кто-то использовал Nginx-clojure на котлине, какие впечатления?

Alexey
19.09.2018
11:46:17
намекаете что с нуля вы бы написали по другому?
Я бы точно написал по другому, и все варианты отчётов с параметрами передавал явно в зависимости от ситуации. Ситуации явно заведомо известны. И тут удже компилятор будет моим другом. А вашим другом будет только внимательность. Нет кейс вообще не убедительный ¯\_(ツ)_/¯

Andrey
19.09.2018
11:54:56
Ну автоматом конечно не получится, имплиситов нет
Во первых есть в качестве Language Extension, во вторых, имплиситы для этого не нужны. Достаточно ad hoc полиморфизма.

Или вы про Kotlin?

Alexey
19.09.2018
11:56:00
Или вы про Kotlin?
Да про котлин

C хаскелем то всё понятно

Andrey
19.09.2018
11:56:13
Да про котлин
А я то, дурак, про Haskell подумал

Max
19.09.2018
12:02:10
Ребята, как лучше передать контекст в фрагмент который вызывается из dialogfragment?

Alexey
19.09.2018
12:12:59
ну ок, посмотрел бы я на расширяемость и гибкость кода и конфигурации)
Ну дак и зачем тогда писать на строготипизированном языке, пишите на динамике, ух там свобода действий

Alexandr
19.09.2018
12:13:35
Anatolii
19.09.2018
12:14:43
с динамикой есть свобода отстрелить себе гениталии и не более

Alexey
19.09.2018
12:18:21
Ну построение отчёт - это по сути функция: (Data, Template) => Report А дальше - это уже pattern matching в чистом виде В котлине не хватает PartialFunction, которые можно комбинировать Так бы можно было описать каждый кейс отдельно и потом в одном месте сделать что то вроде val report: (Data, Template) -> Report = { reportA .orElse(reportB) .orElse(reportC) .andSoOn } Всё отлично расширяется и описывается нормально

Google
Igor
19.09.2018
12:25:08
?? ??

Andrey
19.09.2018
12:42:02
Alexey
19.09.2018
12:42:13
PartialFunction про другое

Andrey
19.09.2018
12:42:44
А причем тут карирование?
Ну partial functions - частичное применение? Если да, то как раз каррированием оно и делается.

Alexey
19.09.2018
12:43:51
нет

val foo: PartialFunction[Int, Int] = { case 1 => 2 } функция foo определена только на значении 1

Andrey
19.09.2018
12:45:14
Ааа. PartialFunction - не тотальные функции.

Alexey
19.09.2018
12:45:19
ага

Andrey
19.09.2018
12:46:27
ага
Ну да. В Kotlin when выражение требует, чтобы все варианты были рассмотрены. Правда некоторые могут бросать исключение, но это уже другое. У PartialFunction в Scala есть метод для проверки, определена она на значении, или нет.

Andrey
19.09.2018
12:47:58
только в случае если результат when-а где-то используется
Ну я и говорю про when выражение, а не про конструкцию.

when expression VS when statement

Alexey
19.09.2018
12:51:56
Andrey
19.09.2018
12:52:31
Google
Mikhail
19.09.2018
12:53:37
ну да, через ?: будет очень даже идиоматично

Andrey
19.09.2018
12:57:59
ну да, через ?: будет очень даже идиоматично
Через ?: не получится комбинировать функции.

Mikhail
19.09.2018
12:59:25
Через ?: не получится комбинировать функции.
так если они будут возвращать опциональное значение, то reportA(x) ?: reportB(x) ?: reportC(x) и так далее

Admin
ERROR: S client not available

Алексей
19.09.2018
13:00:21
Всем привет! Вопрос немного (совсем) оффтоп, но я просто не знаю, где спрашивать (может, посоветуете чего). Вопрос следующий - что необходимо при оформлении на дистанционную работу за границу из России?

Алексей
19.09.2018
13:01:54
понял, спасибо

Andrey
19.09.2018
13:05:44
+
Вот практически 1 в 1 пример из Scala: typealias PartialFunction<A, B> = (A) -> B? infix fun <A, B> PartialFunction<A, B>.orElse(other: PartialFunction<A, B>): PartialFunction<A, B> = { this(it) ?: other(it) } fun main(args: Array<String>) { val isEven: PartialFunction<Int, String> = { if (it % 2 == 0) "$it is even" else null } val isOdd: PartialFunction<Int, String> = { if (it % 2 == 1) "$it is odd" else null } println((1..10).map(isEven orElse isOdd)) } https://www.scala-lang.org/api/2.12.1/scala/PartialFunction.html

Alexey
19.09.2018
13:06:57
тоже пойдёт

Проблема только будет, если тебе надо будет комбинировать PartialFunction<A, B?>

Andrey
19.09.2018
13:08:37
Проблема только будет, если тебе надо будет комбинировать PartialFunction<A, B?>
Да. С точки зрения системы типов PartialFunction<A, B> и PartialFunction<A, B?> не различимы.

Ну чтобы сделать их различимыми надо уже делать через Option. Тогда null и empty станут разными значениями.

Sergey
19.09.2018
17:48:31
https://github.com/JetBrains/kotlin/blob/1.3.0/ChangeLog.md#13-rc

вот даже хз, будут релизить до конфы или после. не думаю что во время, ибо будут заняты самой конфой..

Leonid
19.09.2018
18:46:03
Всё вам расскажи… Вы что, сюрпризов не любите? ?

Sergey
19.09.2018
18:46:26
?

Sergey
19.09.2018
18:52:33
А когда конфа, не подскажите?
4-5 октября, будет трансляция

Google
Жабра
19.09.2018
18:52:43
OlegKrikun
19.09.2018
20:02:15
ээээ... а может мне кто объяснить мотивацию запрета на использовани kotlin.Result как типа возвращаемого значения? =) https://youtrack.jetbrains.com/issue/KT-26659

OlegKrikun
19.09.2018
20:17:26
непонятно ?

Quantum Harmonizer
19.09.2018
20:18:29
непонятно ?
Чтобы никак не получилось Result<Result<...>>, это сломает инлайновость

OlegKrikun
19.09.2018
20:19:25
ЭЭЭ... а зачем нужен результ который вернуть нельзя? о_О

Quantum Harmonizer
19.09.2018
20:19:43
Можно, но только руками компилятора

OlegKrikun
19.09.2018
20:20:16
тоесть без использования корутин его не имеет смысл юзать?

Quantum Harmonizer
19.09.2018
20:21:29
Ну, имеет, но нельзя :)

OlegKrikun
19.09.2018
20:22:06
мля ?

Руслан
19.09.2018
20:22:21
Почему бы не спросить об этом в тикете?

А потом тут рассказать почему же

OlegKrikun
19.09.2018
20:23:15
Хороший вопрос, пойду порефлексирую

Roman
19.09.2018
20:23:24
Здесь описано почему: https://github.com/Kotlin/KEEP/blob/result-rename/proposals/stdlib/result.md

OlegKrikun
19.09.2018
20:23:53
Спс

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