@kotlin_lang

Страница 281 из 982
? animufag ?
15.08.2017
13:56:02
видимо также как и в фрагментах можешь сделать

где ctx экстеншн для контроллера = getActivity()

Va
15.08.2017
13:56:53
я у viewGroup могу взять контекст

? animufag ?
15.08.2017
13:56:59
только вот что делает овнер

Google
? animufag ?
15.08.2017
13:57:02
ну да)

ну то есть видимо ты разобрался в чём разница какой тип сделать овнером и я бы хотел послушать

Va
15.08.2017
14:01:07
короче, вот в чем задача я хочу абстрактный контроллер, который в себя будет принимать AnkoComponent<Конкретный контроллер>, сам контроллер будет делать мне onCreateView прелесть в том, что при описании лейаута, я могу обращаться к методам презентера, например, так:



но я не знаю, насколько это хорошая идея

? animufag ?
15.08.2017
14:05:05
я думаю (хотя и не придерживаюсь этого) что лучше всё таки делать эти компоненты отдельными классами. удобно иногда сделать ad-hoc object:AncoComponent<> который будет дёргать методы, но код быстро разрастается и теряется его общая цель (текущего файла).

Va
15.08.2017
14:05:33
ну окей, сути дела не меняет )

переменная или отдельный класс, наследующийся от AnkoLayout

я про саму архитектуру, есть ли смысл сюда давать доступ к презентеру ?

? animufag ?
15.08.2017
14:09:30
ну так да, это и хотел сказать, что лучше проставить колбеки торчащие из этого класса (не вложенного в презентер). добавить какую-нибудь минимальную логику (мол setError(e: Error?) ну и показывать контейнер ошибки если не нул с её текстом). иначе у тебя в презентере будет валяться этот ui и как бы мешать читать его

и ты его оттуда не вынесешь тк тебе нужен именно вложенный класс чтобы обращаться к методам

Va
15.08.2017
14:10:15
ну вот только как бы это правильно и красиво заимплементить ? )

для этого и нужен owner, полагаю

Google
? animufag ?
15.08.2017
14:10:40
и конечно же буду рад послушать, зачем нужна эта owner: T

не обязательно от тебя

Va
15.08.2017
14:11:09
так смотри

AnkoContext<T> это просто интерфейс, который содержит какую-то логику и owner : T соответственно, когда ты описываешь лейаут в скоупе AnkoContext, помимо рутинных verticalLayout { и прочая ересь}, у тебя есть возможность прямо там обратиться к owner. следовательно, если создавать AnkoContext<Fragment>, у тебя при описании в DSL будет доступ к Fragment

? animufag ?
15.08.2017
14:17:29
а ну да

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

хотя нигде этого раньше не делал

1я проблема которую вижу: class BaseAncoPresenter<T: AncoComponent<BaseAncoPresenter<....

ну контроллер, а не презентер

Va
15.08.2017
14:30:30
да, вот сейчас сижу и думаю, как это решить )

если будут идеи — велкам

а в свифте есть Self как тип (

? animufag ?
15.08.2017
14:32:05
ну я костылил для BaseAncoAdapter и я там звздочку поставил (BaseAncoAdapter<BaseComponent<*»)

а в свифте есть Self как тип (
кстати не знал. в расте пользовался им только. мб и в котлине тоже

Quantum Harmonizer
15.08.2017
14:34:48
да, вот сейчас сижу и думаю, как это решить )
Увы, в Java и Kotlin нет Self-типа, см. тот же E : Enum<E>.

Va
15.08.2017
14:37:20
да, но, мб, как-то иначе можно придумать





Igor
15.08.2017
15:14:32
Можно ли как-то обойти необходимость использовать !! в таком коде? Не нашел ни одного примера нормального double-checked паттерна на котле



Google
Va
15.08.2017
15:15:21
node?.let { node -> //код из if (node == null) }

вместо if (node == null), разумеется

Igor
15.08.2017
15:15:37
node?.let { node -> //код из if (node == null) }
Окей, а что с возвращаемым значением делать?

Va
15.08.2017
15:16:39
последнее значение let — и есть возвращаемое значение в случае если node таки null, то и вернется null

если вы захотите запровайдить что-то другое —   node?.let { node -> //код из if (node == null) } ?: что-то другое

Igor
15.08.2017
15:18:56
Угу, сделал. Выглядит, конечно, такое дело стремно

Но, все лучше чем отсутствие синхронизации

Va
15.08.2017
15:20:58
Я вас чуть-чуть обманул

?.let { делать, если НЕ null }

Igor
15.08.2017
15:21:42
Может стоит поработать на архитектрурой, что-бы без локовов обойтись? private val nodes = ConcurrentHashMap<String, IMemCache>() fun get(id: String): IMemCache = nodes.getOrPut(id, { create(id) })

Va
15.08.2017
15:25:28
справедливое замечаение но если очень надо, то вот



Dmitry
15.08.2017
15:26:13
вторая проверка внутри sync-блока потерялась

Va
15.08.2017
15:28:28
кстати, get можно сделать operator

Кстати, по поводу безобразия с контроллерами и анко, в итоге, пришел к выводу, что лучше сделать так



? animufag ?
15.08.2017
15:39:02
не знал про abstract val/var

в кондукторе одновременно сосуществуют презентер и контроллер? или твоё именование?

Va
15.08.2017
15:40:03
Controller кондуктора — это View, вместо фрагмента

Igor
15.08.2017
15:42:15
Хм, заметил, что вроде как можно вынести благодаря нормальным функциям инициализацию в отдельную функцию, можете глянуть - не накосячил ли?

Google
Igor
15.08.2017
15:42:22


Igor
15.08.2017
15:45:39
По гайдлайнам (в этом случае) все после = лучше перенести на новую строку (тем более код вылез за | )

Va
15.08.2017
15:45:54
и зачем T : Any ?

просто T

Igor
15.08.2017
15:51:42
и зачем T : Any ?
Чтобы случайно к nullable не кастанулось

Оно вроде как может

Да, пысы, setup предназначен в основном для того, чтобы в нем присваивать значение поля при его инициализации

Admin
ERROR: S client not available

Igor
15.08.2017
15:53:26
Мы ведь пихаем туда заведомо nullable, ибо T берется из accessor, например, и тогда на выхлопе он же и будет

Boris
15.08.2017
18:27:48
Не понял, а с каких пор старый добрый map.getOrPut() стал нехорош?

Igor
15.08.2017
18:34:50
Может я сейчас скажу что то в стиле Егора, но имхо synchronized надо уже объявлять deprecated или хотя бы в кодестайле idea подсвечивать. Не должно его встречается в обычном коде (разве что фреймворках)

Va
15.08.2017
18:36:38
Не понял, а с каких пор старый добрый map.getOrPut() стал нехорош?
не стал. просто рассматривайте это как альтернативу :)

Boris
15.08.2017
18:39:22
Igor
15.08.2017
18:42:00
Чаще всего хватает высокоуровневых инструментов, но иногда и синхронайзед нужен, нельзя его делать депрекейтед
Ну когда он нужен среднему юзеру котлина? Даже для фреймворков предпочтительнее использовать compareandswap или готовые очереди.

Эх запили ли бы в Kotlin STM

Igor
15.08.2017
18:52:37
Какой смысл CAS для ленивой инициализации?
Какой смысл делать свою ленивую инициализацию, когда есть object?

Igor
15.08.2017
18:53:35
там мапка
Юзай getOrPut

Google
Quantum Harmonizer
15.08.2017
18:55:33


Igor
15.08.2017
18:57:08
Тут точно надо развить мысль, ибо не понятно что именно не очень

Quantum Harmonizer
15.08.2017
18:57:58
defaultValue() вычисляется без блокировки

Denis
15.08.2017
18:59:18
как обновить элемент в MutableList?

Quantum Harmonizer
15.08.2017
18:59:33
Denis
15.08.2017
19:00:33
эм...set?
как найти index где находится этот элемент с помощью предиката напр

Kirill
15.08.2017
19:01:56
withIndex().find {i, elem -> ... } можно

Quantum Harmonizer
15.08.2017
19:03:47
Igor
15.08.2017
19:03:55
defaultValue() вычисляется без блокировки
Если defaultValue() идемпотентентный и не имеет сайд эффектов, то все равно

Quantum Harmonizer
15.08.2017
19:04:04
да, если

Kirill
15.08.2017
19:04:41
(i, elem) ->, я думаю
да, конечно.

Михаил
15.08.2017
19:23:02
никто не в курсе. почему классы прогрессий с стдлиб сделали закрытыми для расширения из клиентского кода?(

Va
15.08.2017
19:26:05
вам прям что-то такое надо, что экстеншнов не хватит ?

Михаил
15.08.2017
19:28:02
да) нужно иметь что-то в духе CompositeIntProgression, но проблема в том, что конструктор недоступен у прогрессий

просто хоть код копируй)

Quantum Harmonizer
15.08.2017
20:11:09
просто хоть код копируй)
Так rangeTo создаст прогрессию. Или я не допёр.

Михаил
15.08.2017
20:25:20
Так rangeTo создаст прогрессию. Или я не допёр.
он создаст рендж, но мне нужна имнно прогрессия ибо требуется указывать шаг

Quantum Harmonizer
15.08.2017
20:41:05
Михаил
15.08.2017
20:41:38
где ты раньше был :DDDD

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