
Mi
08.09.2017
17:46:46
разве в джаву нужно отправлять мутабл?
и из джавы не приходит в мутабл, там как сам решишь

Lev
08.09.2017
17:47:42
... мне нужен агрегат с двумя Map внутри. При этом объекты в разных Map ссылаются друг на друга. Я так думал хранить граф
очевидное правило - внутри иммутейбла хранить только иммутейбл.
То есть у нас есть иммутейбл агрегат, с иммутейбл списоком из иммутейбл элементов.
По идеологии доступ к списку строго через методы агрегата.
То есть получить/записать список можно только через геттер сеттер.
Т.к. список иммутейбл, то можно спокойно отдавать ссылку на внутренний, все равно ничего не сделать. Что копируй что не копируй.

Google

? animufag ?
08.09.2017
17:48:35
я тебе привёл пример одного уровня вложенности, если их будет 3 то
team.copy(lead = team.lead.copy(age = team.lead.age + 1)))
ну дурацкие примеры

Lev
08.09.2017
17:49:12
а пофиг =)
все внутри - иммутейбл
можно спокойно копировать по ссылкам как я понимаю
а вот как обновить элемент внутри Map/List?

? animufag ?
08.09.2017
17:51:03
разве в джаву нужно отправлять мутабл?
ну различные сдк с которыми ты работаешь и которые изменяют поля твоих объектов) пример не смогу привести на самом деле
ну например bindViewHolder подразумевает что вьюхи мутабельны

Lev
08.09.2017
17:51:11
(я на самом деле считаю что вся эта затея с immutable - модная фигня. Скоко работал с изменениями по ссылкам, грязными функциями и прочим - проблем не было. И читал такой же код, вплоть до натурально индусского. Ничо, все понятно было.)

Mi
08.09.2017
17:51:20
нахер такую иммутабельность тогда, это маразм
просто меру знать надо
ты главное сам ничего не сможешь сделать

Igor
08.09.2017
17:52:25

Lev
08.09.2017
17:52:27
И все же сама идея занятна. С этим действиетльно будет очень просто потом работать.

Google

Mi
08.09.2017
17:52:32
это нужно для того, чтобы защитить программиста от говна, а не библиотеки

Lev
08.09.2017
17:52:43

? animufag ?
08.09.2017
17:53:12
ну да это мода. и да ты ограничиваешь своих колег.
мб если бы я с конкаренси работал то мог что-нибудь сказать ещё

Lev
08.09.2017
17:53:13
... это нужно чтобы прогер который код читать не может почитал его...

Mi
08.09.2017
17:53:18
напиши экстеншонов для иммутабельных списков)))

Lev
08.09.2017
17:53:28
Короче )

? animufag ?
08.09.2017
17:53:42

Lev
08.09.2017
17:53:58
Да?
Короче, иммутабельный объект с иммутабельным списком иммутабельных объектов - он получается весь де факто иммутабельный, на какие бы его части я не ссылался? Так? =)

Mi
08.09.2017
17:55:42
а нахрена тебе такая иммутабельность?
ты прикинь какая это нагрузка на gc
мало-мальски объёмная операция превращается в ад

Igor
08.09.2017
17:56:17

Mi
08.09.2017
17:56:55
скала это тот ещё гемор

Lev
08.09.2017
17:57:20

? animufag ?
08.09.2017
17:57:38

Mi
08.09.2017
17:57:40
"правильно" не обязательно эффективно и нужно

Lev
08.09.2017
17:58:51
ну понятно что если вообще извернуться то можно сделать это дело мутабельным.
Это все же по больше чайсти защита от ненарочного неверного использования. А не от специального "взлома"

Mi
08.09.2017
17:59:22
эта защита не должна быть в ущерб пониманию и использованию

Google

Lev
08.09.2017
18:00:14
вероятно в моем случае не будет особой проблемы в использовании

? animufag ?
08.09.2017
18:01:24

Mi
08.09.2017
18:01:28
ну да, много вложенных copy это же не проблема...
переходите в хаскель

Lev
08.09.2017
18:14:29
https://github.com/fablue/imko еще один с ума сходит
Балин

? animufag ?
08.09.2017
18:19:20

Lev
08.09.2017
18:19:33
Хранить то мне это дело как.. конструктор же нужен
Через констурктор можно черти что повтыкать

? animufag ?
08.09.2017
18:21:27
хз о чём ты

Lev
08.09.2017
18:36:18
хз о чём ты
Идея в том, что раз уж стал (вообще то тут меня к этому принудили val, nonnull) использовать immutable, то и агрегаты тоже должны быть как положено по ddd - immutable.
Простой объект можно просто сделать immutable: data class + val + все в конструкторе. А вот как сделать составной объект immutable. Пока что идея такая же - все внутренности корневого immutable тоже должны быть imm (замучался писать), указаны через val.
Но вот агрегат должен быть в любой момент времени согласованным. А значит если там два списка залинкованных друг на друга - нельзя просто так взять и создать его через конструктор. Сам orm я думаю это сделает через рефлексию, фиг с ним. Но надо как то сам конструктор защитить. Чтобы в клиентском коде было сравнительно невозможно привести его в несогласованное состояние. Наверно просто навесить модификатор доступа на этот констурктор.


? animufag ?
08.09.2017
18:43:51
ну циклические ссылки в иммутабл сложновато но реально
мб пример кода где они нужны?

Руслан
08.09.2017
19:10:34
ну как-как, через мэни-то-мэни обджект


Lev
08.09.2017
19:16:48
мб пример кода где они нужны?
Окей, вот моя реальная задача. Объект бизнес-процесса (большой прямоугольник) содержит лейны (lanes, средний прямоугольник, к лейну крепится исполнитель задачи), лейны содержат активити (маленький прямоугольник, задача). Мало того (это можно опустить пока), есть ещё список переходов. У активити есть список переходов в другие активити)
Только не отсылайте меня к фреймворку activity.
Все бы хорошо, но часто требуется получить все лейны какого-то активити и наоборот. Я очень не хочу это делать через циклы.
Хотя, признаться, эту структуру в NoSql я делаю первый раз, может я что то упускаю.
Получается объект процесса, в нем две мапы - лейны и активити. У них есть внутренние уникальные имена (считай Id)
Элементы мап друг на друга смотрят. Можно без ссылок, просто по идшники
В идеале это все сразу и в бд сохранять
Я не хочу чтобы этот агрегат мог прийти в несогласованное состояние. Если сделать ссылки - то при изменении последнего активити по цепочке копировать придется вообще все. Не весело. Ну и не особо в бд сохранится. Можно тогда просто ид хранить а ссылаемый объект.
Можно ещё проще - хранить рядом ещё мапы со связью ид-ид

Google

Глеб
08.09.2017
19:24:19
Уверен, что я где-то читал про православный подход к решению конкретно данной задачи
при чем типовому решению, даже название было

Lev
08.09.2017
19:25:19

Глеб
08.09.2017
19:25:33
Сейчас попробую загуглить :)

? animufag ?
08.09.2017
19:26:42
data class Child(val parent: Parent)
class Parent (
createChild: (Parent) -> Child
) {
val child = createChild(this)
}
это как решить проблему с одной циклической зависимостью) ну и датакласс здесь ок не выйдет
при множестве: да нужны внешние мапы скорей всего

Глеб
08.09.2017
19:29:16
Я сформулировал вопрос у себя в голове и вышел с этим вопросом в интернет. Результат меня, впрочем, не удивил - все найденные варианты many-to-many в nosql сделаны через вспомогательные "таблицы"

Lev
08.09.2017
19:30:19

Combot
08.09.2017
19:30:25
combot.org/chat/-1001032833563

? animufag ?
08.09.2017
19:31:35
?

Lev
08.09.2017
19:32:00
Я просто так нажал

Anton
08.09.2017
19:32:07
силен!!!

Lev
08.09.2017
19:32:29
... ???
Да я ради интереса нажал.... Что такого?
Я кажется тупанул... Для data класса не обязательно вообще все помещать в конструктор.
Завтра попробую

Anton
08.09.2017
20:19:16
парни, дайте ссылку на котлин оффтоп чат, пожалуйста

Vitalii
08.09.2017
20:34:49
Так это и есть он.

Anton
08.09.2017
22:27:01
А ну ок. Кто нибудь писал на clojure?

? animufag ?
08.09.2017
22:29:08

Anton
08.09.2017
22:30:14
Ну я просто пофлеймть хотел, у живых людей впечатления узнать так сказать

Google

Igor
08.09.2017
22:45:28
Логично спрашивать в @clojure_ru или если пофлудить, то в @jvmchat (там точно оценят и выскажут непредвзятое мнение ?).
Imho хороший язык для ФП, без лишней ленивости и io-монадок, жаль только динамический (еще и в ReactNative могет).
Советую посмотреть на youtube доклады Николая Рыжикова - отлично рассказывает.

Igor
08.09.2017
22:50:08
Если память не изменяет - тут не так давно jOOQ обсуждали. Хотел спросить, где собственно его подтягивать для котлина?

Anton
08.09.2017
23:11:08

Vitalii
09.09.2017
00:09:17

Руслан
09.09.2017
03:30:10

Igor
09.09.2017
08:40:13

Руслан
09.09.2017
08:46:33
Static statements vs. Prepared Statements
https://www.jooq.org/doc/3.9/manual/sql-execution/statement-type/
Вот это думаю поможет
Т.е. по умолчанию все prepared