|
Нов арх
|
|||
---|---|---|---|
#18+
RMT А я вижу здесь подход к делу: чем бы не занимался, лишь бы заманался. В промышленном коде можно использовать ломбок, а можно не использовать. Ты же не ручками этот бойлерплейт пишешь, да? Что касается маппера - его запрет на мой вгляд бред собачий. MapStruct и погнали. Особенно если модель с > 30-50 полями. Ручками импл писать? Так пусть наймут ждуна за 30 тыс. вот вот меня тоже это напрягает- сейчас везде ломбок + какой то готовый маппер - по факту уже стандарт,ломбок вообще вроде как собираются в язык внедрить,ну а запрет на спринг внутри спринг приложения?это как будерброд с маслом где между хлебом и маслом пакетик проложили и от этого он перестал быть бутербродом? ну ок ладно если вы отказываетесь от спринга - пишем на чистой джаве все приложение но нет же- сверху спринг снизу спринг- посередке слой где не должно быть ничего кроме джавы- в этом слое интерфейс репы который по факту обретка над обычным жпа репозиторием и какая то прям борьба за консистентность прям в конструкторы и сетеры внедряются алерты - типо поле не может быть таким то и таким то ....для этого есть пакет javax.constraint при попытке записи в базу неконсистентно состояния будет ошибка- ну вообщем и целом обычно так же поступают ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 10:15 |
|
Нов арх
|
|||
---|---|---|---|
#18+
Хех, я думал этими мапперами уже никто не пользуется. Последний раз их видел, наверно, в 2012ом. А тут вон оказывается много людей которым критично чтоб они были. Прям архитектурный фундамент проекта :) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 10:19 |
|
Нов арх
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev, зависит от приложения, где-то не возникает в них необходимости. Например, у нас приложение на базе Eclipse, там вместо мепперов активно используются адаптеры. В веб-приложениях сложно представить как обходиться без мепперов. Там как минимум есть слой хранения данных и слой DTO для обмена данными с клиентом. В любом случае какой-то меппер нужен, хотя бы Jackson'овский. Может GraphQL как-то меняет ситуацию... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 10:37 |
|
Нов арх
|
|||
---|---|---|---|
#18+
Ares_ekb В веб-приложениях сложно представить как обходиться без мепперов. Там как минимум есть слой хранения данных и слой DTO для обмена данными с клиентом. В любом случае какой-то меппер нужен, хотя бы Jackson'овский. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 10:50 |
|
Нов арх
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev, не только про сериализацию. Там можно накрутить разных правил какие атрибут сериализовывать, какие нет, каким образом (де)сериализировать ссылки на объекты, как работать с иерархиями классов и т.д. Можно объединить entity и dto в одних классах, нафигачить там и JPA, и Jasckson аннотаций. Но в этом случае Jackson будет использоваться не просто как (де)сериализатор, он будет выполнять и функции меппера. А если entity и dto разделить, тогда, да, с Jackson задачи меппингу снимаются, он работает исключительно как (де)сериализатор. Но в этом случае нужен отдельный полноценный меппер. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 11:12 |
|
Нов арх
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Хех, я думал этими мапперами уже никто не пользуется. Последний раз их видел, наверно, в 2012ом. А тут вон оказывается много людей которым критично чтоб они были. Прям архитектурный фундамент проекта :) как бы логично в многослойной архитектуре - будет наличие мапперов- в сломанных архтектурах- где рекордами с базы на фронт плютются нам маперы не нужны) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 13:34 |
|
Нов арх
|
|||
---|---|---|---|
#18+
mayton В map ты передаешь лямбду. У лямбды есть синтаксис с bracers. Вот и создавай там conditions. Можешь отдельно функции создать. Конвертеры. Да много вариантов. покажи мне на примере как ты сделаешь это у тебя есть класс Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
тебе нужно написать функцию преообразования списка объектов класса Animal в список AnimalResponse Код: java 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 13:46 |
|
Нов арх
|
|||
---|---|---|---|
#18+
единственно нормальный вариант я вижу как сделать конструктор AnimalResponse,который включает в себя только общие для всех классов поля,остальное сеттерами досечивать по предикату ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 13:56 |
|
Нов арх
|
|||
---|---|---|---|
#18+
localhost8080, а зачем они схлопываются в один класс? И как они будут различаться на клиенте? Как клиент поймёт где собака, где кошка? Не знаю деталей, но я бы для каждого класса сделал свой DTO-класс: AnimalDto, CatDto, DogDto, BirdDto и мапил их один-к-одному. Возможно убирая какие-то технические поля, заменяя ссылки на идентификаторы, ... Если логика преобразования объектов какая-то сложная, то это уже не меппер, а бизнес-логика. Или нужен какой-нибудь GraphQL, чтобы клиенты сами выбирали данные какие им нужны. Хотя по-моему даже в GraphQL структура данных сохраняется, они не схлопываются. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 16:34 |
|
Нов арх
|
|||
---|---|---|---|
#18+
Ну, или даже если схлопывать, то можно сделать такой меппер (псевдокод). AnimalResponse я бы сразу переименовал в AnimalDto на случай если он и с клиента на сервер может приходить. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58.
По крайней мере это единообразный код, которым можно замапить что угодно, а не конструкторы с десятками параметорв. И конечно я не писал бы всё это вручную, а генерил. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 17:04 |
|
Нов арх
|
|||
---|---|---|---|
#18+
Ares_ekb localhost8080, а зачем они схлопываются в один класс? И как они будут различаться на клиенте? Как клиент поймёт где собака, где кошка? Не знаю отличаются они фактически парой полей - фронт чекает тип и делает свои манипуляции в дальнейшем- там нет нужды делить респонс на иерархию респонсов ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 18:48 |
|
Нов арх
|
|||
---|---|---|---|
#18+
Ares_ekb По крайней мере это единообразный код, которым можно замапить что угодно, а не конструкторы с десятками параметорв. И конечно я не писал бы всё это вручную, а генерил. очень много кода,проще сразу в конструктор вбить вот так Код: java 1. 2. 3. 4. 5. 6. 7.
мне кажется вот так гораздо более наглядней выглядит код ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 19:32 |
|
Нов арх
|
|||
---|---|---|---|
#18+
localhost8080 .map(x-> new AnimalResponse( x.getName,x.getAge ,......//тут нужно продолжить исходя из типа класса подставить нужное значение Ну есть в Java всякие рефлексивные библиотеки для конвертации из одних бинов в другие. Названий не помню но точно есть. Коллеги подскажите. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 19:33 |
|
Нов арх
|
|||
---|---|---|---|
#18+
mayton localhost8080 .map(x-> new AnimalResponse( x.getName,x.getAge ,......//тут нужно продолжить исходя из типа класса подставить нужное значение Ну есть в Java всякие рефлексивные библиотеки для конвертации из одних бинов в другие. Названий не помню но точно есть. Коллеги подскажите. нельзя использовать- только джава- никаких сторонних зависимостей,библиотек и фреймоврков ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 19:37 |
|
Нов арх
|
|||
---|---|---|---|
#18+
localhost8080, Можно в идею плагин поставить - Mapping Generator называется. Сам мэппинг нагенерить в утилитных классах. Из плюсов: + не надо руками изначально писать шаблоны для мэппинга + полный контроль над мэппингом , в том числе и при отладке + ошибки мэппинга на этапе компиляции детектятся + нет магии аннотаций и рефлексии в рантайме. И работает быстрее. Из минусов: - раздувается кодовая база (ну здесь еще посчитать надо, сколько конфигурация в мэппере занимает, а сколько код - может то на то и выйдет) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 20:16 |
|
Нов арх
|
|||
---|---|---|---|
#18+
localhost8080 chpasha Имхо - не нравится, чем занимаешься и есть куда валить? Вали. Однако я задал бы себе пару вопросов:
проблема в том,что я чувтвстую что мы идем не тем путем- да мне платят - я могу тупо делать что от меня хотят,но я вот явно вижу что мы сейчас тратим ресурсы в никуда ситуация простая- пришел человек,стаж больщой - но он в джаве 0 ему сходу не понавился спринг и хибер) он решил все перевести на жук + обычная джава я четно не знаю что тут сказать у нас был реализован кэш - он такой не видел - начал мутить что то на подобии пхп короче по факту запрещено все кроме джавы- даже ModelMapper нельзя Lombok нельзя - у меня воломы дыбом встают от этого бойлер плейта и контрусторов этих.. хз кто то двигается на пути прогресса а у меня такое чувство что мы куда то обрато в легаси 2000 года.. а что вы на спринг молитесь. я например был на проектах где спринг было просто нельзя )) и ломбок нельзя. модлмаппер тоже льзя было но не каждый. у каждого свои требования. ты или решаешь это когда тебе дают это решать или пилишь что есть. многие на опыте спринг не любят очень часто он делает черную магию в черной коробке которая хз как работает и перестает удовлетворять как только ты выходишь за рамки того что оно умеет в базовой комплектации. совсем недавно я столкнулся например с косяком кэша спринга. оно ПОЧЕМУ ТО стало воспринимать опшин.емпти как налл. вот хоть тресни. меняешь два мапа идущих друг за другом порядком и становится ок. ))) не меняешь - падает. и что делать в потроха лезть или забить. и таких случаев целый набор. иногда кажется что простые вещи проще сделать просто. и самому. а спринг - это для любителей бесконечных деклараций и аннотаций. которых никто нигде никогда не видел кроме как в спринге. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 20:34 |
|
Нов арх
|
|||
---|---|---|---|
#18+
RMT А я вижу здесь подход к делу: чем бы не занимался, лишь бы заманался. В промышленном коде можно использовать ломбок, а можно не использовать. Ты же не ручками этот бойлерплейт пишешь, да? Что касается маппера - его запрет на мой вгляд бред собачий. MapStruct и погнали. Особенно если модель с > 30-50 полями. Ручками импл писать? Так пусть наймут ждуна за 30 тыс. Автор, не нравится, уходи. Тем более джава. Перепрыгнуть на другую посудину легко, если знаешь актуальный стек: docker/k8s/os, спрингбут, spring data, реляционки, junit + mockito, mapstruct. я как то замерял перформансы этих мапперов. мапстракт оказался хуже всех. в принципе это не проблема если тебе надо две дтошки замапить раз в секунду. в итоге в мусорку. самый быстрый вариант оказался к сожалению ручками. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 20:35 |
|
Нов арх
|
|||
---|---|---|---|
#18+
Roman Osipov localhost8080, Можно в идею плагин поставить - Mapping Generator называется. Сам мэппинг нагенерить в утилитных классах. Из плюсов: + не надо руками изначально писать шаблоны для мэппинга + полный контроль над мэппингом , в том числе и при отладке + ошибки мэппинга на этапе компиляции детектятся + нет магии аннотаций и рефлексии в рантайме. И работает быстрее. Из минусов: - раздувается кодовая база (ну здесь еще посчитать надо, сколько конфигурация в мэппере занимает, а сколько код - может то на то и выйдет) интресно ,щас посмотрим - как этот плагин решает вопрос с иерархиями ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 20:53 |
|
Нов арх
|
|||
---|---|---|---|
#18+
Roman Osipov localhost8080, Можно в идею плагин поставить - Mapping Generator называется. Сам мэппинг нагенерить в утилитных классах. Из плюсов: + не надо руками изначально писать шаблоны для мэппинга + полный контроль над мэппингом , в том числе и при отладке + ошибки мэппинга на этапе компиляции детектятся + нет магии аннотаций и рефлексии в рантайме. И работает быстрее. Из минусов: - раздувается кодовая база (ну здесь еще посчитать надо, сколько конфигурация в мэппере занимает, а сколько код - может то на то и выйдет) не умеет он с иерархиями работать и различными конструкторами- у меня есть такие объекты - в силу приношения жертвы богу консистености у многих объектов часть полей собирается только через конструктор,вообщем генератор тут не подходит ,только руками все писать ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 20:59 |
|
Нов арх
|
|||
---|---|---|---|
#18+
localhost8080 тебе нужно написать функцию преообразования списка объектов класса Animal в список AnimalResponse Для чего это нужно и что реально в списке приходит? В метод можно пепедать указатель на базовый класс, но реально там наследник по факту. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 21:30 |
|
Нов арх
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Для чего это нужно и что реально в списке приходит? это нужно для того чтобы из списка Анималов сделать список анималреспонсов у анимала много наслдеников ,а анимал респонс - просто набор полей из всех этих классов наследников в списке реально приходят животные ,поля которых нужно преобразовать в анимал респонс- я же все написал во вводных для чего это реально нужно ? для того что мы рефакторим плохой код- где вместо рекордов,доменной модели ,респонсов и реквсестов - все выполнялось Хибернейт сущностью..От базы данных до клиента гуляла туда сюда) а респонс это джейсон который нужен фронту - обычный набор полей,которые раньше он получал из сучности ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 22:04 |
|
Нов арх
|
|||
---|---|---|---|
#18+
[quot PetroNotC Sharp#22392641] localhost8080 В метод можно пепедать указатель на базовый класс, но реально там наследник по факту. ну я собственно так и делаю Код: java 1. 2. 3. 4. 5. 6. 7.
такой же метод ,как у алекса- просто более короткий и внятный - а так суть одна ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2021, 22:08 |
|
Нов арх
|
|||
---|---|---|---|
#18+
andreykaT а что вы на спринг молитесь. я например был на проектах где спринг было просто нельзя )) и ломбок нельзя. модлмаппер тоже льзя было но не каждый. у каждого свои требования. ты или решаешь это когда тебе дают это решать или пилишь что есть. многие на опыте спринг не любят очень часто он делает черную магию в черной коробке которая хз как работает и перестает удовлетворять как только ты выходишь за рамки того что оно умеет в базовой комплектации. поменять можно на любой другой свой любимы фре ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2021, 02:17 |
|
Нов арх
|
|||
---|---|---|---|
#18+
localhost8080 очень много кода,проще сразу в конструктор вбить вот так Короче, при усложнении иерархии классов этот примитивный метод усложнится до совершенно неподдерживаемого состояния. А если в меппере всё разбито на map/init/create методы, то код масштабируемый на сколько угодно классов. И вообще он становится на столько примитивным, что его можно генерить, а не писать руками. Хотя, блин, тут можно попасть в другую крайность. Я сталкивался с тем, что люди фигачат кучу каких-то фабрик, вспомогательных классов, методов, которые совершенно не нужны и только усложняют код. А потом начинаются взаимные обвинения в оверинжиниринге :) Кстати! У вас же запрет на использование сторонних либ в рантайме? А в дизайнтайме можно использоваться что угодно? Может тот же MapStruct можно использовать? Это обычно ещё один довод в пользу кодогенераторов, что правила того же мепирования объектов описываются один раз, потом по этому описанию можно сгенерить реализацию под любые требования рантайма. У меня, например, из одних моделей генерится и Java, JavaScript код. Хотя, MapStruct вроде вынуждает засирать код аннотациями, а в случае своего кодогенератора это не нужно. Лично мне уже на втором меппере стало бы лень их писать. Я обычно смотрю только во вторую очередь как можно написать код короче и красивее, а в первую - как можно его вообще не писать, скинуть на кодогенаратор. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2021, 05:42 |
|
Нов арх
|
|||
---|---|---|---|
#18+
localhost8080 тормоза там везде изза неправильного использования ЖПА я немного декомпозировал и вот показал то что мы кидаем на фронт - теперь это надо мапить руками- вместо одной строчки с модельпамером Скорость конечного приложения как-то меняется из-за разных способов создания O(bject)R(elation)M(apping)? Нет? Тогда причём тут ваше личное удобство? Если вдруг вы ещё не догадались, то вы - маленький винтик бизнес-машины. Задача бизнеса - делать прибыль. Разрабатываемое приложение - средство извлечения прибыли. А ваш труд - инструмент, двигающий всю эту машинерию. Если, вдруг, вы считаете "основой всего" именно свой труд, то "разочарую я тебя до невозможности". Основа всего - прибыль. Максимум прибыли, из которой уже исключены издержки в виде фонда заработной платы. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2021, 09:10 |
|
|
start [/forum/topic.php?fid=59&msg=40109723&tid=2120314]: |
0ms |
get settings: |
23ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
48ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
520ms |
get tp. blocked users: |
1ms |
others: | 3210ms |
total: | 3839ms |
0 / 0 |