
Igor
14.02.2018
07:49:00
Да у тебя там же бизнес-логика небось
Нет, агрегирование сущностей и версионирование + выделение метаданных и два-три кейса агрегирование коллекций по хитрым правилам, вписывающихся в логику работы с данными. В DSL я бы это НЕ написал, ибо там есть View и на 100, и на 200, и на 400 строк

Igor
14.02.2018
07:51:15
Ну значит ты молодец, но сам подходе не мешает ее туда засунуть типа “временно” (сроки поджимали и тд) и оставить ее там на всегда

Руслан
14.02.2018
07:54:11

Igor
14.02.2018
07:54:46
Да там еще и хранимки можно на java / javascript писать ?
Это же можно postgres-процедурки на Kotlin писать и в JS компилить ?

Google

Igor
14.02.2018
07:56:55

Igor
14.02.2018
08:11:04

Phil
14.02.2018
08:14:40


Руслан
14.02.2018
08:16:20

Phil
14.02.2018
08:17:39
Ну и все обертки сильно уменьшают возможности, увы. Благо в современных СУБД хватает интересных вещей - от эффективной работы с Jason (что, зачастую, вообще делает orm не нужен) до оконных функций и массивов.

Руслан
14.02.2018
08:18:34

Phil
14.02.2018
08:19:14
Маппинг давно решен в jdbc templates, а типобезопасности ORM не дает, только иллюзию.
Но если нужен кэш - то Spring в помощь или любая другая реализация.

Руслан
14.02.2018
08:21:06
> одна простая функция на две строки
можно её привести?
> кэшировать результат запроса из БД
есть несколько кэшей, один из - кешировать объекты которые мы замапили.

Phil
14.02.2018
08:21:44
Вообще, я вот ещё не видел разработчиков, которые разбирались бы в БД и использовали ORM. Обычно просто прячут незнание и непонимание под желанием кэширования и т.п.

Руслан
14.02.2018
08:22:04
> типобезопасности ORM не дает
схема -> кодогенерация -> модель.
меняю название поля -> ломается билд.
На чистом SQL придется грепать строки. Одно это оправдывает существование ORM

Phil
14.02.2018
08:22:46
Ага, а двойную совместимость при смене версий ты как делаешь?

Google

Phil
14.02.2018
08:23:03
Нет, грепать ничего не надо )

Руслан
14.02.2018
08:23:40

Mikhail
14.02.2018
08:23:57
Большинству надо, чтобы было просто, поэтому ORM и NoSQL так и популярны.

Phil
14.02.2018
08:24:52
Ну, большинство даже не думает, а что такое просто, потому в среднем выигрывают худшие из технологий.
Собственно, NoSQL показательны, да.

Руслан
14.02.2018
08:30:24
json сериализатор/десериализатор тоже самим писать?

Phil
14.02.2018
08:30:30
Но вообще проверка SQL - дело ide, она даже справляется в простых случаях. А в сложных уже никто.
А зачем самим? Jackson вполне написан.

Руслан
14.02.2018
08:31:15
А зачем мне самому маппер писать с кэшем, если он есть в ORM/jooq?

Phil
14.02.2018
08:32:22
Ну, потому что поддержки json там нет, массивов, подозреваю, нет, всех функций нет.
А кода писать приходится очень много, пример сверху показателен. И плохого кода.
И жёсткие ограничения на работу с БД, структуры классов и т.п
И у тебя ещё простой запрос, без пары with, разворачивания массивов и генераторов.
Но вообще в нормальном коде работа с БД занимает так мало места, что обсуждать, в общем, нечего. Пока тормозить не начинает.

Igor
14.02.2018
08:43:15

Руслан
14.02.2018
08:43:29
Ну т.е. из-за того что мне может когда-нибудь понадобится что-то сложное для которого я смогу использовать например https://cayenne.apache.org/docs/4.0/cayenne-guide/#sqltemplate я должен с самого начала пилить велосипеды, писать на чистом SQL без сгенерированной модели и вот это все? Не убедительно.
Если же мне с самого начала будет понятно что нужно использовать фичи базы которой нет в ORM, я возьму JOOQ. Код поддерживать легче чем строки

Kira
14.02.2018
08:46:53
В пользу хибера - кэши там для уменьшения количества запросов к базе, запросы надо экономить

Phil
14.02.2018
09:05:45

Google

Руслан
14.02.2018
09:07:02

Phil
14.02.2018
09:08:44


Igor
14.02.2018
09:14:55

Phil
14.02.2018
09:32:58
Ну, нам не нужно, у нас чуть другой подход к работе с json, да и JOOQ не нужен, и так работа с бд занимает минимум места и кода (но много внимания, но это уже другой вопрос).

nikita
14.02.2018
09:44:44

Phil
14.02.2018
09:46:04
При всей моей любви к JB, я надеюсь, что Котлин не станет лидирующей технологией.
Ну, пока Котлин хорошо спланированная прагматичная технология, а что бы он победил всех, его придется изрядно испортить, надобавлять возможностей прострелить себе ногу (которых и так уже довольно много), добавить ненужных хайповых фенечек и т.п. В общем, сделать очередным JavaScript со встроенной поддержкой MongoDB.

Sergey
14.02.2018
09:51:55

Денис
14.02.2018
09:53:41
Ну, пока Котлин хорошо спланированная прагматичная технология, а что бы он победил всех, его придется изрядно испортить, надобавлять возможностей прострелить себе ногу (которых и так уже довольно много), добавить ненужных хайповых фенечек и т.п. В общем, сделать очередным JavaScript со встроенной поддержкой MongoDB.
Я достаточно уважаю людей из JB, чтобы считать, что целью разработки языка является не "самый популярный язык на свете". Они, кажется, разумнее. :)

Andrew
14.02.2018
09:54:09
субъективщина, но по мне он уже лучше джавы, тайпскрипта и заходит на обгон го. :)

Phil
14.02.2018
09:56:31
Ну, мне вот тоже Котлин нравиться (хотя в первых версиях я на него сильно ругался), так что тоже надеюсь, что он не станет победившей, а будет просто хорошей технологией )

Andrew
14.02.2018
09:58:32
На тот же го поводов ругаться сильно больше, и тем не менее на него люди успешно спрыгивают с джав, рубей, пайтонов и т.п. Я к тому, что не обязательно подстилаться под нужды каждого, чтобы быть лидером (обычно, между делом, как раз наоборот).

Phil
14.02.2018
10:00:47
У Java все еще есть огромный плюс, про который все забывают - в ней что бы прострелить себе ногу, нужно специально постараться (или добавить какую-нибудь кодогенерацию и аспекты). Это очень существенно на больших проектах и пока языков-конкурентов нет )

Mikhail
14.02.2018
10:02:27
я б в котлин добавил тайпклассы и newtype из хаскелл и все, 100% мой язык
Елизаров намекал на то, что newtype добавят скоро

Sergey
14.02.2018
10:03:31

Mikhail
14.02.2018
10:03:38
а тайпклассы пилят ребята из arrow, надесь у них получится продвинуть эту идею

Andrew
14.02.2018
10:03:57
И при этом многие используют bytecode weaving и эти самые кодогенераторы на аннотациях. Так что в итоге получается, что шансов в среднестатистическом джава-проекте отстрелить себе ногу больше, чем в котлине, ибо то же самое, но за счёт сторонних решений.

Google

Andrew
14.02.2018
10:04:37
inline class сейчас одну проперти поддерживает, потому это не newtype, это typedef.

Igor
14.02.2018
10:04:43

Mikhail
14.02.2018
10:05:23

Phil
14.02.2018
10:06:11
Угу, потому Котлин и лучше. Пока и в нем не появиться куча микроскопов, используемых как молотки.
Впрочем, надеюсь, что расширениия компилятора будут давать больше.
Кстати, идеальный ORM (вернее, статическую проверку маппинга и SQL-кода) лучше всего делать именно через расширения комплятора. Правда, иногда они будут выдавать всякое некорректное (

Andrew
14.02.2018
10:07:30

Mikhail
14.02.2018
10:07:36

Andrew
14.02.2018
10:08:20

Mikhail
14.02.2018
10:08:26

Igor
14.02.2018
10:09:14

Andrew
14.02.2018
10:10:34

Mikhail
14.02.2018
10:10:37
и как то такие вещи, как иммутабельность и чистые функции продвигаются и в java-сообществе, не говоря уже о котлинистах

Igor
14.02.2018
10:11:57

Mikhail
14.02.2018
10:12:21
как говорили ребята из JB

Andrew
14.02.2018
10:12:49

Igor
14.02.2018
10:13:03

Phil
14.02.2018
10:15:20
О, кстати, о всяком умном и расширении языка.
Мне вот не хватает инструментов управления исключительными ситуациями (или ошибками, не суть важно).
Есть какой-то классический Result<Data,EnumOfErrors>, тут все просто и понятно.
Но если у меня сложная бизнес-логика, то набор возможных ошибок может нарастать на разных инфраструктурных уровнях и хочется расширять этот Enum, но так, что бы в любой момент видеть, а какие конкретно ошибки могут быть без их явного описания и маппинга. И разбирать их через when на верхнем уровне, разумеется )
Checked exceptions этого не дают делать, увы. Расширяемых enum тоже нет. Sealed class тут тоже не помогут (
Есть какие-то умные варианты?


Mikhail
14.02.2018
10:16:29
О, кстати, о всяком умном и расширении языка.
Мне вот не хватает инструментов управления исключительными ситуациями (или ошибками, не суть важно).
Есть какой-то классический Result<Data,EnumOfErrors>, тут все просто и понятно.
Но если у меня сложная бизнес-логика, то набор возможных ошибок может нарастать на разных инфраструктурных уровнях и хочется расширять этот Enum, но так, что бы в любой момент видеть, а какие конкретно ошибки могут быть без их явного описания и маппинга. И разбирать их через when на верхнем уровне, разумеется )
Checked exceptions этого не дают делать, увы. Расширяемых enum тоже нет. Sealed class тут тоже не помогут (
Есть какие-то умные варианты?
если найду и скину на F#, разберешь?

Google

Phil
14.02.2018
10:16:36
Хм, попробую )

Mikhail
14.02.2018
10:16:53
а хотя искать не надо
Result<Data, List<EnumOfErrors»
или тебе не это надо?

Phil
14.02.2018
10:17:28
Нее, не это )

Mikhail
14.02.2018
10:18:18
ааа, тебе надо, чтобы было несколько разных enum на разных слоях и ты мог их все композировать?

Phil
14.02.2018
10:18:23
Ага!
Скорее даже именно что расширять каждый и по call stack видеть, какие расширения могут быть (или вручную это показывать)
Ну, и что бы Idea все это красиво рисовала )

Mikhail
14.02.2018
10:19:47
sealed class иерархию не рассматривал?

Igor
14.02.2018
10:19:54

Даниил
14.02.2018
10:21:02
вот завезли бы в F# тайпклассы и HKP :c

Igor
14.02.2018
10:22:11
На фиг не надо. Хотя простые тайп-классы планируют когда-нибудь завести в C#, а там какой-нибудь интероп придумают.

Mikhail
14.02.2018
10:23:15
Ага!
типа
sealed class CustomException
sealed class DataException : CustomException()
sealed class ApiException: DataException()
data class ConversionException: DataException()
sealed class DomainException: CustomException()

Phil
14.02.2018
10:23:29
У sealed тут нет разницы от общего enum, насколько я понимаю. Расширять "позже" все равно нельзя.
Технически такое, наверно, можно сделать через кучу интерфейсов, но очень неудобно.

Mikhail
14.02.2018
10:24:37
нууу, а зачем расширять класс ошибок?

Anton
14.02.2018
10:24:59
О, кстати, о всяком умном и расширении языка.
Мне вот не хватает инструментов управления исключительными ситуациями (или ошибками, не суть важно).
Есть какой-то классический Result<Data,EnumOfErrors>, тут все просто и понятно.
Но если у меня сложная бизнес-логика, то набор возможных ошибок может нарастать на разных инфраструктурных уровнях и хочется расширять этот Enum, но так, что бы в любой момент видеть, а какие конкретно ошибки могут быть без их явного описания и маппинга. И разбирать их через when на верхнем уровне, разумеется )
Checked exceptions этого не дают делать, увы. Расширяемых enum тоже нет. Sealed class тут тоже не помогут (
Есть какие-то умные варианты?
А по-пролетарски иметь String c mark ошибки не подходит?