powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Нов арх
65 сообщений из 65, показаны все 3 страниц
Нов арх
    #40109067
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Хочу спросить совета у старожилов так сказать.
Есть некое приложение- стандартная архитектура MVC ,под капотом бут2,постгрес ,хибер и хезелькаст
приложение медлленно работает изза того что база данных откровенное дерьмо,на нее повешен жпа слой ,который так же откровенное дерьмо и сверху все это прикрыто запросами ,которые так же откровенное дерьмо с джоинам,которые вызывают декартово произведение,сущности хибер кидаются сразу на фронт - со всеми вытекающими,так же никак не реализована многопоточка

вообщем наше руководство пришло к выводу что нужно что то менять и решило поменять !внимание архитектуру)
тоесть не переделать базу,не переделать жпа слой ,может быть что то перевести на многопоточку в сервисах,нет!
ввели новую архитектуру- в стандартый мвс воткнули два лишних слоя,при этом везде теперь запреты,тут нельзя спринг,тут нельзя что то из доменной модели,тут ломбок нельзя,тут вообще нельзя ничего кроме джава
маперы писать руками ,хотя есть модельмапер отличный ..
складывается ощущение что оттуда пора уходить.
Расскажите может было такое у кого то? есть смысл просто смириться и печать код,который от тебя ждут или просто поменять контору,тем более есть на руках действующий оффер
...
Рейтинг: 0 / 0
Нов арх
    #40109085
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080,
Ты зря такие топики опять в java.
Их в форум работа надо.
...
Рейтинг: 0 / 0
Нов арх
    #40109086
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имхо - не нравится, чем занимаешься и есть куда валить? Вали. Однако я задал бы себе пару вопросов:

  • может ли стать лучше на текущей работе или будет только то, что тебе не нравится (это конечно тот еще критерий, особенно с учетом твоего чсв ;) , но с другой стороны сердцу не прикажешь, даже если они правы - а ты нет). Реальность такова, что вряд ли кто-то занимается 100% времени только тем, что ему нравится - везде есть какое-го старое УГ, которое нужно поддерживать или проекты, которые не нравятся по объективным или субъективным причинам.
  • станет ли лучше на новой работе, не будет ли шило на мыло
...
Рейтинг: 0 / 0
Нов арх
    #40109092
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chpasha
Имхо - не нравится, чем занимаешься и есть куда валить? Вали. Однако я задал бы себе пару вопросов:

  • может ли стать лучше на текущей работе или будет только то, что тебе не нравится (это конечно тот еще критерий, особенно с учетом твоего чсв ;) , но с другой стороны сердцу не прикажешь, даже если они правы - а ты нет). Реальность такова, что вряд ли кто-то занимается 100% времени только тем, что ему нравится - везде есть какое-го старое УГ, которое нужно поддерживать или проекты, которые не нравятся по объективным или субъективным причинам.
  • станет ли лучше на новой работе, не будет ли шило на мыло

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

ситуация простая- пришел человек,стаж больщой - но он в джаве 0
ему сходу не понавился спринг и хибер) он решил все перевести на жук + обычная джава
я четно не знаю что тут сказать
у нас был реализован кэш - он такой не видел - начал мутить что то на подобии пхп

короче по факту запрещено все кроме джавы- даже ModelMapper нельзя
Lombok нельзя - у меня воломы дыбом встают от этого бойлер плейта и контрусторов этих..
хз кто то двигается на пути прогресса а у меня такое чувство что мы куда то обрато в легаси 2000 года..
...
Рейтинг: 0 / 0
Нов арх
    #40109097
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
localhost8080,
Ты зря такие топики опять в java.
Их в форум работа надо.

да с точки зрения работы там будет понятно все- слать все лесом и уходить
я хочу все таки для себя разобраться- ибо контора мне нравится и непонятно что в этой ситуации делать
либо я ошибаюсь и наша новая архтектура взлетит либо я прав ,но я не вижу ничего кроме тонны дополнительных маперов,чтобы наше приложение стало лучше рабоать)
...
Рейтинг: 0 / 0
Нов арх
    #40109116
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080
Всем привет.
Хочу спросить совета у старожилов так сказать.
Есть некое приложение- стандартная архитектура MVC ,под капотом бут2,постгрес ,хибер и хезелькаст
приложение медлленно работает изза того что база данных откровенное дерьмо,на нее повешен жпа слой ,который так же откровенное дерьмо и сверху все это прикрыто запросами ,которые так же откровенное дерьмо с джоинам,которые вызывают декартово произведение,сущности хибер кидаются сразу на фронт - со всеми вытекающими,так же никак не реализована многопоточка

Ты на митинге поднимал воппрос оптимизации? Какие были от тебя предложения?

Складывается ощущение что ты просто сегодня напился с горя и пришел сюда.
Был тут такой один. Крысопытом звали. Всё ходил и ныл. Ему в ПТ таких советов накидали - с тех
пор молчит и не ноет. Лежит себе тихо на глубине полтора метра. Улавливаешь?

Так что или давай сюда архитектурную диаграмму и короче ... соберись, тряпка!
...
Рейтинг: 0 / 0
Нов арх
    #40109161
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работал в компании, где на проекте были примерно так же. До 150 человек (на одном проекте!), 5-6 лет работы, на выходе голимое дерьмо, которое заказчик при первой возможности выкинул и вернулся на предыдущею систему. На предыдущей системе (клиент-сервер, forms 6.0) так и живут.
...
Рейтинг: 0 / 0
Нов арх
    #40109164
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень часто тема топика звучит так.

Меня взяли юнгой на корабль. Корабль куда-то плывет. Но корабль - дерьмо. И капитан со стар-помом - полные
дураки и ничего не понимают. Скоро доплывём до края земли.

Складывается ощущение что пора прыгать за борт.
...
Рейтинг: 0 / 0
Нов арх
    #40109167
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080
Всем привет.

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


Честно не понимаю в чём тут вопрос?!
Ну как бы есть возможность уйти с не приятной работы - уходи.
Может на другой работе повезет.
<:o)
...
Рейтинг: 0 / 0
Нов арх
    #40109168
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Меня взяли юнгой на корабль. Корабль куда-то плывет. Но корабль - дерьмо. И капитан со стар-помом - полные дураки и ничего не понимают

это не важно - если то, что они делали раньше ему нравилось, а то, что делают сейчас - нет, то пусть идет туда, где нравится, будь он хоть сто раз не прав
...
Рейтинг: 0 / 0
Нов арх
    #40109169
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080,
Стас. В топике нет вопроса по архитектуре.
А болтовню тут не любят.
...
Рейтинг: 0 / 0
Нов арх
    #40109188
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha
mayton
Меня взяли юнгой на корабль. Корабль куда-то плывет. Но корабль - дерьмо. И капитан со стар-помом - полные дураки и ничего не понимают

это не важно - если то, что они делали раньше ему нравилось, а то, что делают сейчас - нет, то пусть идет туда, где нравится, будь он хоть сто раз не прав

Я думаю что сильный разработчик спокойно сообщает о намерении уйти за 2 месяца и спокойно находит позицию
и так-же спокойно уходит. Что сотрясать воздух? Корабль плывёт. И если у тебя нет возможности поменять его
курс - уходи чьорт тебя побери. К чему рефлексировать? Одни нервы и толку никакого. Я так понимаю
что просто у людей накапливатся боль и ее надо куда-то выплеснуть. Просто место выбрано неудачно.

Может в дедофорум было-бы лучше.
...
Рейтинг: 0 / 0
Нов арх
    #40109509
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общих словах архтектура выглядит так -
1.слой перситенс- там всякие имлементации репозиториев,маперы и тд(разрешено все)
2.доменный слой тут интерфейс репо + сама доменная модель- (тут запрещено все - спринг,ломбок,короче чистая джава только)
3.слой юз кейса- который фактически делает круд операции над доменными моделями- тоесть может быть createUserUserCase,
deleteUserUseCase
тут тоже нельзя спринг,написаны свои анотации вообщем
4.СЛой это презентер- тут у нас лежат имлпементации презетеров( который в юзкейсе в виде интрерфейса вложенного)
и респонсы - это то что мы непосрдественно скармливаем контроллеру( тут опять все разрещено- спринг и ломбок)


как я это вижу- какая то динозавра с головой и жопой спринга,внутри которой есть прослойка на чистой джаве

зачем это я честно хер знает- но сейчас я корячу тонный бойлер плейт кода- какие то астрономические конструкторы,учитывая что иерахия и все запрещено и это не 17 джава в констктор нужно как то загнать тип - приходится прям внутри делать инстаст офф

вместо 1 строчки кода с ModelMapper -но нам запретили любые сторонние мапперы

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

Код: 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.
 @Override
  public void presentSuccess(List<Channel> channelList) {
    var payload = channelList.stream()
      .map(x -> new GetChannelResponse(x.getId(),
        x.getPollId(),
        x.isOneAnswerPerDevice(),
        x.isHashUniqueAnswer(),
        x.getHashAnswerMax(),
        x.isEnabled(),
        x.isShowShortCode(),
        x.getCode(),
        x.getShortCode(),
        Arrays.stream(Channel.ChannelType.values()).filter(channelType->channelType.getaClass()==x.getClass()).findFirst().get(),
        x.getName(),
        x.getMaxAnswers(),
        x.getStopTimestamp(),
        x.getCompleteLink(),
        x.getScreenoutLink(),
        x.getQuotafullLink(),
        x.getQuotas(),
        x.getCreatedAt(),
        x.getUpdatedAt(),
        x.getDeletedAt(),
        x.getCustomId(),
        x.isDebug(),
        x instanceof ChannelMailing ? ((ChannelMailing) x).getMailing() : null,
        x instanceof ChannelShortLinks ? ((ChannelShortLinks) x).getGeneratedAt() : null,
        x instanceof ChannelShortLinks ? ((ChannelShortLinks) x).getFileId() : null,
        x instanceof ChannelShortLinks ? ((ChannelShortLinks) x).getLinksCount() : null,
        x instanceof ChannelShortLinks ? ((ChannelShortLinks) x).getStatus() : null,
        x instanceof ChannelSiteWidget ? ((ChannelSiteWidget) x).getWidgetType() : null,
        x instanceof ChannelSiteWidget ? ((ChannelSiteWidget) x).getAppearanceAnimation() : null,
        x instanceof ChannelSiteWidget ? ((ChannelSiteWidget) x).getButtonType() : null,
        x instanceof ChannelSiteWidget ? ((ChannelSiteWidget) x).getButtonName() : null,
        x instanceof ChannelSiteWidget ? ((ChannelSiteWidget) x).getWidth() : null,
        x instanceof ChannelSiteWidget ? ((ChannelSiteWidget) x).getHeight() : null
      )).collect(Collectors.toList());

    setResponse(new ApiResponse<>(payload));
  }


вот эта портянка выше - в одну строчку пишется с помощью ModelMapper- при этом при измененеии названия полей или еще чего то - мне не нужно будет сюда идти и что то менять ,а сейчас это жесточайший хардкод


поэтому у меня дичайше горит зад изза вот таких вот портянок
...
Рейтинг: 0 / 0
Нов арх
    #40109514
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
из этой портянки я вижу только что если что то где то меняется - оно не скомпилируется
при ModelMapper оно упадет в рантайме
при этом мы будем писать тонны бойлер плейта с намеком на то ,что мы настолько тупы и ниразу не запустим свой код- чтобы увидеть что ModelMapper не может смапить....
Вообщем поэтому и горит задница
...
Рейтинг: 0 / 0
Нов арх
    #40109533
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080,
вроде основной вопрос был что тормоза в проекте.
Где именно тормоза ты не выяснил и начал гнать волну на условия работы.
Найди где тормоза!
Не?
...
Рейтинг: 0 / 0
Нов арх
    #40109536
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
localhost8080,
вроде основной вопрос был что тормоза в проекте.
Где именно тормоза ты не выяснил и начал гнать волну на условия работы.
Найди где тормоза!
Не?

тормоза там везде изза неправильного использования ЖПА

я немного декомпозировал и вот показал то что мы кидаем на фронт - теперь это надо мапить руками- вместо одной строчки с модельпамером

я вот этого умом не понимаю - где выгода будет? как по мне этот бойлер плейт дороже писать и еще дороже поддерживать
...
Рейтинг: 0 / 0
Нов арх
    #40109554
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080
тормоза там везде изза неправильного использования ЖПА

Начальство скажет - где цифры и логи тормозов?
Говорил про ТОРМОЗА.
А счас сказал про БОЙЛЕР ПЛЕЙТ.
Ну не дураки же они у вас там если ты сам всё в своем посте смешал в кучу.
...
Рейтинг: 0 / 0
Нов арх
    #40109565
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
localhost8080
тормоза там везде изза неправильного использования ЖПА

Начальство скажет - где цифры и логи тормозов?
Говорил про ТОРМОЗА.
А счас сказал про БОЙЛЕР ПЛЕЙТ.
Ну не дураки же они у вас там если ты сам всё в своем посте смешал в кучу.

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

как оно может повлиять на что то кроме геморая разработчика?я пока этот код писал - 100 раз наверно ошибся в данных ,которые надо в конструктор передавать- это известная проблема классов с множестом полей- тут либо юзать мапер готовый -либо вот так с горящей задницей писать бойлер плейт

а таких классов то сотни - вот представь объем работы вникуда- вместо строчки кода с модель мапером

Код: java
1.
var payload = mapper.map(channel, CreateChannelResponse.class);



ну вот скажи что я не прав и желательно обоснуй - только опять же ты абстрагируйся- у тебя есть задача зачем то переписать маперы на ручной маппинг- при этом зачем - умалчивают
класс channel имеет кучу наследников- для модель мапера это норм- он все скушает и все размпаит куда надо- а вот руками это будет как я показал выше и это боль
...
Рейтинг: 0 / 0
Нов арх
    #40109567
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Непонятно чего все так возбудились. Я вижу обычный ентерпрайзный код. Видывали и похуже. Этот - вполне себе норм.

Ну .. можно рефакторить чтоб убрать хотя-бы повторяющиеся instanceof. Это даже не из соображения перформанса
а просто. По человечески. Чтоб больше в коде было типизации. И меньше всякого разыменования неизвестных ссылок.
Короче .. меньше Ansi C и больше Хаскеля.

По поводу моделлеров и всего прочего.

Все кодо-генераторы упрощают задачу при внесении изменений. Но нужно следовать протоколу. Тоесть вы - больше
не Java-разработчик. А вы - Java/Modeller пользователь. С этим надо смирится и жить. Это плата за использование
всяких там Rational e.t.c. И к этому тоже приходят эволюционным путем. Если такая роль не устраивает - то можно
покинуть проект.
...
Рейтинг: 0 / 0
Нов арх
    #40109574
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Непонятно чего все так возбудились. Я вижу обычный ентерпрайзный код. Видывали и похуже. Этот - вполне себе норм.

Ну .. можно рефакторить чтоб убрать хотя-бы повторяющиеся instanceof. Это даже не из соображения перформанса
а просто. По человечески. Чтоб больше в коде было типизации. И меньше всякого разыменования неизвестных ссылок.
Короче .. меньше Ansi C и больше Хаскеля.

По поводу моделлеров и всего прочего.

Все кодо-генераторы упрощают задачу при внесении изменений. Но нужно следовать протоколу. Тоесть вы - больше
не Java-разработчик. А вы - Java/Modeller пользователь. С этим надо смирится и жить. Это плата за использование
всяких там Rational e.t.c. И к этому тоже приходят эволюционным путем. Если такая роль не устраивает - то можно
покинуть проект.

вот да не очень устраивает ,скорей всего последую твоему совету
...
Рейтинг: 0 / 0
Нов арх
    #40109575
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton


Ну .. можно рефакторить чтоб убрать хотя-бы повторяющиеся instanceof. Это даже не из соображения перформанса

а можно посмотреть как ты в конструкторе уберешь повторяющиеся и инстан офы?я напомню что это конструктор ,а не набор сетеров
...
Рейтинг: 0 / 0
Нов арх
    #40109580
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В map ты передаешь лямбду.
У лямбды есть синтаксис с bracers.
Вот и создавай там conditions.
Можешь отдельно функции создать.
Конвертеры. Да много вариантов.
...
Рейтинг: 0 / 0
Нов арх
    #40109599
Ares_ekb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю, что модели тут не причем. То, что в конструктор передаются десятки параметров и то что эти мэпперы пишутся руками - явно какой-то бред.

У меня, например, из такой модели:
Model
Код: 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.
@Ecore(
    nsURI='',
    nsPrefix='anchor')
@GenModel(
    modelName='Anchor',
    prefix='Anchor',
    modelDirectory='target/generated-sources/xcore')

annotation "http://www.eclipse.org/emf/2002/Ecore" as Ecore
annotation "http://www.eclipse.org/emf/2002/GenModel" as GenModel

class AnchorModel extends NamedElement {
    contains Anchor[] anchors opposite model
    contains Tie[] ties opposite model
    contains Knot[] knots opposite model
}

class Anchor extends NamedElement {
    container AnchorModel[1] model opposite anchors
    contains Attribute[] attributes opposite anchor
}

interface HistorizedElement {
    contains DataTypeBase[?] dateTimeType
}

abstract class Attribute extends NamedElement, HistorizedElement {
    container Anchor[1] anchor opposite attributes
}

class TypedAttribute extends Attribute, TypedElement {
}

class KnottedAttribute extends Attribute {
    refers Knot[1] knot
}

class Tie extends NamedElement, HistorizedElement {
    container AnchorModel[1] model opposite ties
    contains AnchorRole[2..*] anchorRoles opposite tie
    contains KnotRole[] knotRoles opposite tie
}

class AnchorRole extends NamedElement {
    container Tie[1] tie opposite anchorRoles
    refers Anchor[1] anchor
}

class KnotRole extends NamedElement {
    container Tie[1] tie opposite knotRoles
    refers Knot[1] knot
}

class Knot extends NamedElement, TypedElement {
    container AnchorModel[1] model opposite knots
}

генерились такие мэпперы:
BusinessObjects -> DTO
Код: 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.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
public class AnchorToDtoMapper {

    public static final AnchorToDtoMapper INSTANCE = new AnchorToDtoMapper();
    private static final String UNSUPPORTED = "Unsupported mapping for %s";

    private AnchorToDtoMapper() {
    }

    public AnchorModelDto map(final AnchorModel obj, final Map<java.lang.Class<?>, Object> imports) {
        final AnchorModelDto result = new AnchorModelDto();
        initAnchorModel(result, obj, imports);
        return result;
    }
    
    public void initAnchorModel(final AnchorModelDto result, final AnchorModel obj,
            final Map<java.lang.Class<?>, Object> imports) {
        DataModelToDtoMapper.INSTANCE.initNamedElement(result, obj, imports);
        result.getAnchors().addAll(obj.getAnchors().stream().
                map(item -> map(item, imports)).
                collect(Collectors.toList()));
        result.getTies().addAll(obj.getTies().stream().
                map(item -> map(item, imports)).
                collect(Collectors.toList()));
        result.getKnots().addAll(obj.getKnots().stream().
                map(item -> map(item, imports)).
                collect(Collectors.toList()));
    }

    public AnchorDto map(final Anchor obj, final Map<java.lang.Class<?>, Object> imports) {
        final AnchorDto result = new AnchorDto();
        initAnchor(result, obj, imports);
        return result;
    }
    
    public void initAnchor(final AnchorDto result, final Anchor obj,
            final Map<java.lang.Class<?>, Object> imports) {
        DataModelToDtoMapper.INSTANCE.initNamedElement(result, obj, imports);
        result.getAttributes().addAll(obj.getAttributes().stream().
                map(item -> map(item, imports)).
                collect(Collectors.toList()));
    }

    public AttributeDto map(final Attribute obj, final Map<java.lang.Class<?>, Object> imports) {
        if (obj instanceof TypedAttribute) {
            return map((TypedAttribute) obj, imports);
        }
        if (obj instanceof KnottedAttribute) {
            return map((KnottedAttribute) obj, imports);
        }
        for (Entry<java.lang.Class<?>, Object> mapperImport : imports.entrySet()) {
            java.lang.Class<?> objClass = mapperImport.getKey();
            Object mapper = mapperImport.getValue();
            if (objClass.isInstance(obj)) {
                try {
                    return (AttributeDto) mapper.getClass()
                            .getMethod("map", objClass, Map.class)
                            .invoke(mapper, obj, imports);
                }
                catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        }
        throw new UnsupportedOperationException(
                String.format(UNSUPPORTED, obj.getClass().getName()));
    }
    
    public void initAttribute(final AttributeDto result, final Attribute obj,
            final Map<java.lang.Class<?>, Object> imports) {
        DataModelToDtoMapper.INSTANCE.initNamedElement(result, obj, imports);
        if (obj.getDateTimeType() != null) {
            result.setDateTimeType(DataModelToDtoMapper.INSTANCE.map(obj.getDateTimeType(), imports));
        }
    }

    public TypedAttributeDto map(final TypedAttribute obj, final Map<java.lang.Class<?>, Object> imports) {
        final TypedAttributeDto result = new TypedAttributeDto();
        initTypedAttribute(result, obj, imports);
        return result;
    }
    
    public void initTypedAttribute(final TypedAttributeDto result, final TypedAttribute obj,
            final Map<java.lang.Class<?>, Object> imports) {
        initAttribute(result, obj, imports);
        if (obj.getDataType() != null) {
            result.setDataType(DataModelToDtoMapper.INSTANCE.map(obj.getDataType(), imports));
        }
    }

    public KnottedAttributeDto map(final KnottedAttribute obj, final Map<java.lang.Class<?>, Object> imports) {
        final KnottedAttributeDto result = new KnottedAttributeDto();
        initKnottedAttribute(result, obj, imports);
        return result;
    }
    
    public void initKnottedAttribute(final KnottedAttributeDto result, final KnottedAttribute obj,
            final Map<java.lang.Class<?>, Object> imports) {
        initAttribute(result, obj, imports);
        if (obj.getKnot() != null) {
            result.setKnot(obj.getKnot().getId());
        }
    }

    public TieDto map(final Tie obj, final Map<java.lang.Class<?>, Object> imports) {
        final TieDto result = new TieDto();
        initTie(result, obj, imports);
        return result;
    }
    
    public void initTie(final TieDto result, final Tie obj,
            final Map<java.lang.Class<?>, Object> imports) {
        DataModelToDtoMapper.INSTANCE.initNamedElement(result, obj, imports);
        if (obj.getDateTimeType() != null) {
            result.setDateTimeType(DataModelToDtoMapper.INSTANCE.map(obj.getDateTimeType(), imports));
        }
        result.getAnchorRoles().addAll(obj.getAnchorRoles().stream().
                map(item -> map(item, imports)).
                collect(Collectors.toList()));
        result.getKnotRoles().addAll(obj.getKnotRoles().stream().
                map(item -> map(item, imports)).
                collect(Collectors.toList()));
    }

    public AnchorRoleDto map(final AnchorRole obj, final Map<java.lang.Class<?>, Object> imports) {
        final AnchorRoleDto result = new AnchorRoleDto();
        initAnchorRole(result, obj, imports);
        return result;
    }
    
    public void initAnchorRole(final AnchorRoleDto result, final AnchorRole obj,
            final Map<java.lang.Class<?>, Object> imports) {
        DataModelToDtoMapper.INSTANCE.initNamedElement(result, obj, imports);
        if (obj.getAnchor() != null) {
            result.setAnchor(obj.getAnchor().getId());
        }
    }

    public KnotRoleDto map(final KnotRole obj, final Map<java.lang.Class<?>, Object> imports) {
        final KnotRoleDto result = new KnotRoleDto();
        initKnotRole(result, obj, imports);
        return result;
    }
    
    public void initKnotRole(final KnotRoleDto result, final KnotRole obj,
            final Map<java.lang.Class<?>, Object> imports) {
        DataModelToDtoMapper.INSTANCE.initNamedElement(result, obj, imports);
        if (obj.getKnot() != null) {
            result.setKnot(obj.getKnot().getId());
        }
    }

    public KnotDto map(final Knot obj, final Map<java.lang.Class<?>, Object> imports) {
        final KnotDto result = new KnotDto();
        initKnot(result, obj, imports);
        return result;
    }
    
    public void initKnot(final KnotDto result, final Knot obj,
            final Map<java.lang.Class<?>, Object> imports) {
        DataModelToDtoMapper.INSTANCE.initNamedElement(result, obj, imports);
        if (obj.getDataType() != null) {
            result.setDataType(DataModelToDtoMapper.INSTANCE.map(obj.getDataType(), imports));
        }
    }

}

DTO -> BusinessObjects
Код: 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.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
public class DtoToAnchorMapper {

    public static final DtoToAnchorMapper INSTANCE = new DtoToAnchorMapper();
    private static final AnchorFactory factory = AnchorPackage.eINSTANCE.getAnchorFactory();
    private static final String UNSUPPORTED = "Unsupported mapping for %s";

    private DtoToAnchorMapper() {
    }

    private void initRefs(final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        for (SimpleImmutableEntry<Object, Object> mapping : trace.values()) {
            Object source = mapping.getKey();
            Object target = mapping.getValue();
            if (source instanceof AnchorModelDto) {
                initAnchorModelRefs((AnchorModel) target, (AnchorModelDto) source, trace);
            }
            if (source instanceof AnchorDto) {
                initAnchorRefs((Anchor) target, (AnchorDto) source, trace);
            }
            if (source instanceof AttributeDto) {
                initAttributeRefs((Attribute) target, (AttributeDto) source, trace);
            }
            if (source instanceof TypedAttributeDto) {
                initTypedAttributeRefs((TypedAttribute) target, (TypedAttributeDto) source, trace);
            }
            if (source instanceof KnottedAttributeDto) {
                initKnottedAttributeRefs((KnottedAttribute) target, (KnottedAttributeDto) source, trace);
            }
            if (source instanceof TieDto) {
                initTieRefs((Tie) target, (TieDto) source, trace);
            }
            if (source instanceof AnchorRoleDto) {
                initAnchorRoleRefs((AnchorRole) target, (AnchorRoleDto) source, trace);
            }
            if (source instanceof KnotRoleDto) {
                initKnotRoleRefs((KnotRole) target, (KnotRoleDto) source, trace);
            }
            if (source instanceof KnotDto) {
                initKnotRefs((Knot) target, (KnotDto) source, trace);
            }
        }
    }

    public AnchorModel map(final AnchorModelDto obj, final Map<java.lang.Class<?>, Object> imports) {
        final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace = new HashMap<>();
        final AnchorModel result = create(obj, imports, trace);
        initRefs(trace);
        return result;
    }
    
    public AnchorModel create(final AnchorModelDto obj,
            final Map<java.lang.Class<?>, Object> imports,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        final AnchorModel result = factory.createAnchorModel();
        trace.put(new SimpleImmutableEntry<String, Object>("AnchorModel", obj.getId()),
                new SimpleImmutableEntry<Object, Object>(obj, result));
        initAnchorModel(result, obj, imports, trace);
        return result;
    }
    
    public void initAnchorModel(final AnchorModel result, final AnchorModelDto obj,
            final Map<java.lang.Class<?>, Object> imports,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        DtoToDataModelMapper.INSTANCE.initNamedElement(result, obj, imports, trace);
        result.getAnchors().addAll(obj.getAnchors().stream().
                map(item -> create(item, imports, trace)).
                collect(Collectors.toList()));
        result.getTies().addAll(obj.getTies().stream().
                map(item -> create(item, imports, trace)).
                collect(Collectors.toList()));
        result.getKnots().addAll(obj.getKnots().stream().
                map(item -> create(item, imports, trace)).
                collect(Collectors.toList()));
    }
    
    public void initAnchorModelRefs(final AnchorModel result, final AnchorModelDto obj,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        DtoToDataModelMapper.INSTANCE.initNamedElementRefs(result, obj, trace);
    }

    public Anchor map(final AnchorDto obj, final Map<java.lang.Class<?>, Object> imports) {
        final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace = new HashMap<>();
        final Anchor result = create(obj, imports, trace);
        initRefs(trace);
        return result;
    }
    
    public Anchor create(final AnchorDto obj,
            final Map<java.lang.Class<?>, Object> imports,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        final Anchor result = factory.createAnchor();
        trace.put(new SimpleImmutableEntry<String, Object>("Anchor", obj.getId()),
                new SimpleImmutableEntry<Object, Object>(obj, result));
        initAnchor(result, obj, imports, trace);
        return result;
    }
    
    public void initAnchor(final Anchor result, final AnchorDto obj,
            final Map<java.lang.Class<?>, Object> imports,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        DtoToDataModelMapper.INSTANCE.initNamedElement(result, obj, imports, trace);
        result.getAttributes().addAll(obj.getAttributes().stream().
                map(item -> create(item, imports, trace)).
                collect(Collectors.toList()));
    }
    
    public void initAnchorRefs(final Anchor result, final AnchorDto obj,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        DtoToDataModelMapper.INSTANCE.initNamedElementRefs(result, obj, trace);
    }

    public Attribute map(final AttributeDto obj, final Map<java.lang.Class<?>, Object> imports) {
        final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace = new HashMap<>();
        final Attribute result = create(obj, imports, trace);
        initRefs(trace);
        return result;
    }
    
    public Attribute create(final AttributeDto obj,
            final Map<java.lang.Class<?>, Object> imports,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        if (obj instanceof TypedAttributeDto) {
            return create((TypedAttributeDto) obj, imports, trace);
        }
        if (obj instanceof KnottedAttributeDto) {
            return create((KnottedAttributeDto) obj, imports, trace);
        }
        for (Entry<java.lang.Class<?>, Object> mapperImport : imports.entrySet()) {
            java.lang.Class<?> objClass = mapperImport.getKey();
            Object mapper = mapperImport.getValue();
            if (objClass.isInstance(obj)) {
                try {
                    return (Attribute) mapper.getClass()
                            .getMethod("create", objClass, Map.class, Map.class)
                            .invoke(mapper, obj, imports, trace);
                }
                catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        }
        throw new UnsupportedOperationException(
                String.format(UNSUPPORTED, obj.getClass().getName()));
    }
    
    public void initAttribute(final Attribute result, final AttributeDto obj,
            final Map<java.lang.Class<?>, Object> imports,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        DtoToDataModelMapper.INSTANCE.initNamedElement(result, obj, imports, trace);
        if (obj.getDateTimeType() != null) {
            result.setDateTimeType(DtoToDataModelMapper.INSTANCE.create(obj.getDateTimeType(), imports, trace));
        }
    }
    
    public void initAttributeRefs(final Attribute result, final AttributeDto obj,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        DtoToDataModelMapper.INSTANCE.initNamedElementRefs(result, obj, trace);
    }

    public TypedAttribute map(final TypedAttributeDto obj, final Map<java.lang.Class<?>, Object> imports) {
        final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace = new HashMap<>();
        final TypedAttribute result = create(obj, imports, trace);
        initRefs(trace);
        return result;
    }
    
    public TypedAttribute create(final TypedAttributeDto obj,
            final Map<java.lang.Class<?>, Object> imports,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        final TypedAttribute result = factory.createTypedAttribute();
        trace.put(new SimpleImmutableEntry<String, Object>("TypedAttribute", obj.getId()),
                new SimpleImmutableEntry<Object, Object>(obj, result));
        initTypedAttribute(result, obj, imports, trace);
        return result;
    }
    
    public void initTypedAttribute(final TypedAttribute result, final TypedAttributeDto obj,
            final Map<java.lang.Class<?>, Object> imports,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        initAttribute(result, obj, imports, trace);
        if (obj.getDataType() != null) {
            result.setDataType(DtoToDataModelMapper.INSTANCE.create(obj.getDataType(), imports, trace));
        }
    }
    
    public void initTypedAttributeRefs(final TypedAttribute result, final TypedAttributeDto obj,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        initAttributeRefs(result, obj, trace);
    }

    public KnottedAttribute map(final KnottedAttributeDto obj, final Map<java.lang.Class<?>, Object> imports) {
        final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace = new HashMap<>();
        final KnottedAttribute result = create(obj, imports, trace);
        initRefs(trace);
        return result;
    }
    
    public KnottedAttribute create(final KnottedAttributeDto obj,
            final Map<java.lang.Class<?>, Object> imports,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        final KnottedAttribute result = factory.createKnottedAttribute();
        trace.put(new SimpleImmutableEntry<String, Object>("KnottedAttribute", obj.getId()),
                new SimpleImmutableEntry<Object, Object>(obj, result));
        initKnottedAttribute(result, obj, imports, trace);
        return result;
    }
    
    public void initKnottedAttribute(final KnottedAttribute result, final KnottedAttributeDto obj,
            final Map<java.lang.Class<?>, Object> imports,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        initAttribute(result, obj, imports, trace);
    }
    
    public void initKnottedAttributeRefs(final KnottedAttribute result, final KnottedAttributeDto obj,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        initAttributeRefs(result, obj, trace);
        if (obj.getKnot() != null) {
            result.setKnot((Knot) trace.get(
                    new SimpleImmutableEntry<String, Object>("Knot", obj.getKnot())).getValue());
        }
    }

    public Tie map(final TieDto obj, final Map<java.lang.Class<?>, Object> imports) {
        final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace = new HashMap<>();
        final Tie result = create(obj, imports, trace);
        initRefs(trace);
        return result;
    }
    
    public Tie create(final TieDto obj,
            final Map<java.lang.Class<?>, Object> imports,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        final Tie result = factory.createTie();
        trace.put(new SimpleImmutableEntry<String, Object>("Tie", obj.getId()),
                new SimpleImmutableEntry<Object, Object>(obj, result));
        initTie(result, obj, imports, trace);
        return result;
    }
    
    public void initTie(final Tie result, final TieDto obj,
            final Map<java.lang.Class<?>, Object> imports,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        DtoToDataModelMapper.INSTANCE.initNamedElement(result, obj, imports, trace);
        if (obj.getDateTimeType() != null) {
            result.setDateTimeType(DtoToDataModelMapper.INSTANCE.create(obj.getDateTimeType(), imports, trace));
        }
        result.getAnchorRoles().addAll(obj.getAnchorRoles().stream().
                map(item -> create(item, imports, trace)).
                collect(Collectors.toList()));
        result.getKnotRoles().addAll(obj.getKnotRoles().stream().
                map(item -> create(item, imports, trace)).
                collect(Collectors.toList()));
    }
    
    public void initTieRefs(final Tie result, final TieDto obj,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        DtoToDataModelMapper.INSTANCE.initNamedElementRefs(result, obj, trace);
    }

    public AnchorRole map(final AnchorRoleDto obj, final Map<java.lang.Class<?>, Object> imports) {
        final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace = new HashMap<>();
        final AnchorRole result = create(obj, imports, trace);
        initRefs(trace);
        return result;
    }
    
    public AnchorRole create(final AnchorRoleDto obj,
            final Map<java.lang.Class<?>, Object> imports,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        final AnchorRole result = factory.createAnchorRole();
        trace.put(new SimpleImmutableEntry<String, Object>("AnchorRole", obj.getId()),
                new SimpleImmutableEntry<Object, Object>(obj, result));
        initAnchorRole(result, obj, imports, trace);
        return result;
    }
    
    public void initAnchorRole(final AnchorRole result, final AnchorRoleDto obj,
            final Map<java.lang.Class<?>, Object> imports,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        DtoToDataModelMapper.INSTANCE.initNamedElement(result, obj, imports, trace);
    }
    
    public void initAnchorRoleRefs(final AnchorRole result, final AnchorRoleDto obj,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        DtoToDataModelMapper.INSTANCE.initNamedElementRefs(result, obj, trace);
        if (obj.getAnchor() != null) {
            result.setAnchor((Anchor) trace.get(
                    new SimpleImmutableEntry<String, Object>("Anchor", obj.getAnchor())).getValue());
        }
    }

    public KnotRole map(final KnotRoleDto obj, final Map<java.lang.Class<?>, Object> imports) {
        final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace = new HashMap<>();
        final KnotRole result = create(obj, imports, trace);
        initRefs(trace);
        return result;
    }
    
    public KnotRole create(final KnotRoleDto obj,
            final Map<java.lang.Class<?>, Object> imports,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        final KnotRole result = factory.createKnotRole();
        trace.put(new SimpleImmutableEntry<String, Object>("KnotRole", obj.getId()),
                new SimpleImmutableEntry<Object, Object>(obj, result));
        initKnotRole(result, obj, imports, trace);
        return result;
    }
    
    public void initKnotRole(final KnotRole result, final KnotRoleDto obj,
            final Map<java.lang.Class<?>, Object> imports,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        DtoToDataModelMapper.INSTANCE.initNamedElement(result, obj, imports, trace);
    }
    
    public void initKnotRoleRefs(final KnotRole result, final KnotRoleDto obj,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        DtoToDataModelMapper.INSTANCE.initNamedElementRefs(result, obj, trace);
        if (obj.getKnot() != null) {
            result.setKnot((Knot) trace.get(
                    new SimpleImmutableEntry<String, Object>("Knot", obj.getKnot())).getValue());
        }
    }

    public Knot map(final KnotDto obj, final Map<java.lang.Class<?>, Object> imports) {
        final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace = new HashMap<>();
        final Knot result = create(obj, imports, trace);
        initRefs(trace);
        return result;
    }
    
    public Knot create(final KnotDto obj,
            final Map<java.lang.Class<?>, Object> imports,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        final Knot result = factory.createKnot();
        trace.put(new SimpleImmutableEntry<String, Object>("Knot", obj.getId()),
                new SimpleImmutableEntry<Object, Object>(obj, result));
        initKnot(result, obj, imports, trace);
        return result;
    }
    
    public void initKnot(final Knot result, final KnotDto obj,
            final Map<java.lang.Class<?>, Object> imports,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        DtoToDataModelMapper.INSTANCE.initNamedElement(result, obj, imports, trace);
        if (obj.getDataType() != null) {
            result.setDataType(DtoToDataModelMapper.INSTANCE.create(obj.getDataType(), imports, trace));
        }
    }
    
    public void initKnotRefs(final Knot result, final KnotDto obj,
            final Map<SimpleImmutableEntry<String, Object>, SimpleImmutableEntry<Object, Object>> trace) {
        DtoToDataModelMapper.INSTANCE.initNamedElementRefs(result, obj, trace);
    }

}

Естественно классы для самих объектов тоже генерятся (вместе с JPA, Jackson и т.п. аннотациями).

В мепперах для каждого типа объектов генерятся такие виды методов:
map - получает на вход исходный объект и возможно какие-то параметры, на выходе - результирующий объект
init - инициализирует атрибуты и ссылки создаваемого объекта, в том числе вызывает мапинг вложенных объектов
create - создает результирующий объект, если его нельзя создать просто с помощью конструктора

Естественно всё это работает с учетом иерархии классов. Мепперы дочерних классов вызывают init родительских классов. Плюс если одна модель основана на других моделях, то она наследует их мепперы.

Можно было бы JavaDoc генерить, но руки не дошли.

Это абсолютно прозрачный и понятный код. В отличие от динамических мепперов, которые не проверишь пока не запустишь. Хотя кроме динамических есть и статические с кодогенерацией, но мне они не подошли поэтому сделал свой. Если бы я писал эти мепперы вручную, то выглядели бы они ровно так же.

В общем, не нужно катить бочку на модели :) Это просто у вас очень странный чел всё это придумывал.
...
Рейтинг: 0 / 0
Нов арх
    #40109606
RMT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMT
Гость
А я вижу здесь подход к делу: чем бы не занимался, лишь бы заманался.

В промышленном коде можно использовать ломбок, а можно не использовать. Ты же не ручками этот бойлерплейт пишешь, да?
Что касается маппера - его запрет на мой вгляд бред собачий. MapStruct и погнали. Особенно если модель с > 30-50 полями. Ручками импл писать? Так пусть наймут ждуна за 30 тыс.

Автор, не нравится, уходи. Тем более джава. Перепрыгнуть на другую посудину легко, если знаешь актуальный стек: docker/k8s/os, спрингбут, spring data, реляционки, junit + mockito, mapstruct.
...
Рейтинг: 0 / 0
Нов арх
    #40109610
Ares_ekb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RMT
MapStruct и погнали
localhost8080
даже ModelMapper нельзя
Ares_ekb
У меня, например, из такой модели ... генерились такие мэпперы
Уже 3 разных варианта в одной теме :) Плюс в "новой архитектуре" тоже какой-то свой вариант. Лично мне MapStruct нравится на много больше, в отличие от ModelMapper он основан на кодогенерации, он существенно быстрее работает , а главное в сгенеренном коде можно разобраться что вообще происходит. Но у меня были более сложные объекты, для которых он не подходил и проще было сделать свой генератор.
...
Рейтинг: 0 / 0
Нов арх
    #40109613
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RMT
А я вижу здесь подход к делу: чем бы не занимался, лишь бы заманался.

В промышленном коде можно использовать ломбок, а можно не использовать. Ты же не ручками этот бойлерплейт пишешь, да?
Что касается маппера - его запрет на мой вгляд бред собачий. MapStruct и погнали. Особенно если модель с > 30-50 полями. Ручками импл писать? Так пусть наймут ждуна за 30 тыс.

вот вот меня тоже это напрягает- сейчас везде ломбок + какой то готовый маппер - по факту уже стандарт,ломбок вообще вроде как собираются в язык внедрить,ну а запрет на спринг внутри спринг приложения?это как будерброд с маслом где между хлебом и маслом пакетик проложили и от этого он перестал быть бутербродом?
ну ок ладно если вы отказываетесь от спринга - пишем на чистой джаве все приложение
но нет же- сверху спринг снизу спринг- посередке слой где не должно быть ничего кроме джавы- в этом слое интерфейс репы который по факту обретка над обычным жпа репозиторием и какая то прям борьба за консистентность
прям в конструкторы и сетеры внедряются алерты - типо поле не может быть таким то и таким то ....для этого есть пакет javax.constraint при попытке записи в базу неконсистентно состояния будет ошибка- ну вообщем и целом обычно так же поступают
...
Рейтинг: 0 / 0
Нов арх
    #40109614
Хех, я думал этими мапперами уже никто не пользуется. Последний раз их видел, наверно, в 2012ом. А тут вон оказывается много людей которым критично чтоб они были. Прям архитектурный фундамент проекта :)
...
Рейтинг: 0 / 0
Нов арх
    #40109615
Ares_ekb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev,

зависит от приложения, где-то не возникает в них необходимости. Например, у нас приложение на базе Eclipse, там вместо мепперов активно используются адаптеры.

В веб-приложениях сложно представить как обходиться без мепперов. Там как минимум есть слой хранения данных и слой DTO для обмена данными с клиентом. В любом случае какой-то меппер нужен, хотя бы Jackson'овский. Может GraphQL как-то меняет ситуацию...
...
Рейтинг: 0 / 0
Нов арх
    #40109616
Ares_ekb
В веб-приложениях сложно представить как обходиться без мепперов. Там как минимум есть слой хранения данных и слой DTO для обмена данными с клиентом. В любом случае какой-то меппер нужен, хотя бы Jackson'овский.
Jackson - это про сериализацию в JSON. Выше речь была про то чтоб подключать доп библиотеку для конвертации между объектами Entity и DTO.
...
Рейтинг: 0 / 0
Нов арх
    #40109621
Ares_ekb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev,

не только про сериализацию. Там можно накрутить разных правил какие атрибут сериализовывать, какие нет, каким образом (де)сериализировать ссылки на объекты, как работать с иерархиями классов и т.д. Можно объединить entity и dto в одних классах, нафигачить там и JPA, и Jasckson аннотаций. Но в этом случае Jackson будет использоваться не просто как (де)сериализатор, он будет выполнять и функции меппера.

А если entity и dto разделить, тогда, да, с Jackson задачи меппингу снимаются, он работает исключительно как (де)сериализатор. Но в этом случае нужен отдельный полноценный меппер.
...
Рейтинг: 0 / 0
Нов арх
    #40109635
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stanislav Bashkyrtsev
Хех, я думал этими мапперами уже никто не пользуется. Последний раз их видел, наверно, в 2012ом. А тут вон оказывается много людей которым критично чтоб они были. Прям архитектурный фундамент проекта :)

как бы логично в многослойной архитектуре - будет наличие мапперов- в сломанных архтектурах- где рекордами с базы на фронт плютются нам маперы не нужны)
...
Рейтинг: 0 / 0
Нов арх
    #40109636
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
class AnimalResponse{
private String name;
private Integer age;
private CatShit;
private DogAss;
private BirdMilk;

}

abstract class Animal{
protected String name;
protected Integer age;
}

public class Cat extends Animal{
private CatShit catShit;
}

public class Dog extends Animal{
private DogAss dogAss;
}

public class Bird extends Animal{
private BirdMilk  birdMilk;
}




тебе нужно написать функцию преообразования списка объектов класса Animal
в список AnimalResponse

Код: java
1.
2.
3.
 public void presentSuccess(List<Animal> animalList) {
    var payload = animalLis.stream()
.map(x-> new AnimalResponse( x.getName,x.getAge ,......//тут нужно продолжить исходя из типа класса подставить нужное значение 
...
Рейтинг: 0 / 0
Нов арх
    #40109637
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
единственно нормальный вариант я вижу как сделать конструктор AnimalResponse,который включает в себя только общие для всех классов поля,остальное сеттерами досечивать по предикату
...
Рейтинг: 0 / 0
Нов арх
    #40109665
Ares_ekb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080,

а зачем они схлопываются в один класс? И как они будут различаться на клиенте? Как клиент поймёт где собака, где кошка? Не знаю деталей, но я бы для каждого класса сделал свой DTO-класс: AnimalDto, CatDto, DogDto, BirdDto и мапил их один-к-одному. Возможно убирая какие-то технические поля, заменяя ссылки на идентификаторы, ...

Если логика преобразования объектов какая-то сложная, то это уже не меппер, а бизнес-логика. Или нужен какой-нибудь GraphQL, чтобы клиенты сами выбирали данные какие им нужны. Хотя по-моему даже в GraphQL структура данных сохраняется, они не схлопываются.
...
Рейтинг: 0 / 0
Нов арх
    #40109671
Ares_ekb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, или даже если схлопывать, то можно сделать такой меппер (псевдокод). 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.
// Не обязательно делать методы статическими, у меппера может быть и состояние
// Особенно если это DTO -> Entity, и там требует разрешать ссылки на объекты по id
public class AnimalMapper {

    // Тут можно использовать моднейший паттерн-матчинг вместо if
    public static AnimalDto map(Animal animal) {
        if (animal instanceof Cat) {
            return map((Cat) animal);
        }
        if (animal instanceof Dog) {
            return map((Dog) animal);
        }
        if (animal instanceof Bird) {
            return map((Bird) animal);
        }
        throw new IllegalArgumentException();
    }

    // Не обязательно использовать сеттеры и геттеры
    public static void initAnimal(AnimalDto result, Animal animal) {
        result.setName(animal.getName());
        result.setAge(animal.getAge());
    }

    public static AnimalDto map(Cat cat) {
        AnimalDto result = new AnimalDto();
        initCat(result, cat);
        return result;
    }

    public static void initCat(AnimalDto result, Cat cat) {
        initAnimal(reslut, cat);
        result.setCatShit(cat.getCatShit());
    }

    public static AnimalDto map(Dog dog) {
        AnimalDto result = new AnimalDto();
        initDog(result, dog);
        return result;
    }

    public static void initDog(AnimalDto result, Dog dog) {
        initAnimal(reslut, dog);
        result.setDogAss(dog.getDogAss());
    }

    public static AnimalDto map(Bird bird) {
        AnimalDto result = new AnimalDto();
        initBird(result, bird);
        return result;
    }

    public static void initBird(AnimalDto result, Bird bird) {
        initAnimal(reslut, bird);
        result.setBirdMilk(bird.getBirdMilk());
    }

}


По крайней мере это единообразный код, которым можно замапить что угодно, а не конструкторы с десятками параметорв. И конечно я не писал бы всё это вручную, а генерил.
...
Рейтинг: 0 / 0
Нов арх
    #40109684
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ares_ekb
localhost8080,

а зачем они схлопываются в один класс? И как они будут различаться на клиенте? Как клиент поймёт где собака, где кошка? Не знаю

отличаются они фактически парой полей - фронт чекает тип и делает свои манипуляции в дальнейшем- там нет нужды делить респонс на иерархию респонсов
...
Рейтинг: 0 / 0
Нов арх
    #40109698
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ares_ekb

По крайней мере это единообразный код, которым можно замапить что угодно, а не конструкторы с десятками параметорв. И конечно я не писал бы всё это вручную, а генерил.


очень много кода,проще сразу в конструктор вбить вот так

Код: java
1.
2.
3.
4.
5.
6.
7.
public AnimalResponse map(Animal animal){
var resp=  AnimalResponse(animal.getName(),animal,getAge());
if( animal instanseof Cat){
resp.setCatShit(((Cat)animal).getCatShit())
}
if(animal instanseof dog ){
resp.setDogAss()}



мне кажется вот так гораздо более наглядней выглядит код
...
Рейтинг: 0 / 0
Нов арх
    #40109700
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080

.map(x-> new AnimalResponse( x.getName,x.getAge ,......//тут нужно продолжить исходя из типа класса подставить нужное значение

Ну есть в Java всякие рефлексивные библиотеки для конвертации из одних бинов в другие.

Названий не помню но точно есть. Коллеги подскажите.
...
Рейтинг: 0 / 0
Нов арх
    #40109701
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
localhost8080

.map(x-> new AnimalResponse( x.getName,x.getAge ,......//тут нужно продолжить исходя из типа класса подставить нужное значение

Ну есть в Java всякие рефлексивные библиотеки для конвертации из одних бинов в другие.

Названий не помню но точно есть. Коллеги подскажите.

нельзя использовать- только джава- никаких сторонних зависимостей,библиотек и фреймоврков
...
Рейтинг: 0 / 0
Нов арх
    #40109714
Roman Osipov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
localhost8080, Можно в идею плагин поставить - Mapping Generator называется.
Сам мэппинг нагенерить в утилитных классах.

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

Из минусов:
- раздувается кодовая база (ну здесь еще посчитать надо, сколько конфигурация в мэппере занимает, а сколько код - может то на то и выйдет)
...
Рейтинг: 0 / 0
Нов арх
    #40109717
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080
chpasha
Имхо - не нравится, чем занимаешься и есть куда валить? Вали. Однако я задал бы себе пару вопросов:

  • может ли стать лучше на текущей работе или будет только то, что тебе не нравится (это конечно тот еще критерий, особенно с учетом твоего чсв ;) , но с другой стороны сердцу не прикажешь, даже если они правы - а ты нет). Реальность такова, что вряд ли кто-то занимается 100% времени только тем, что ему нравится - везде есть какое-го старое УГ, которое нужно поддерживать или проекты, которые не нравятся по объективным или субъективным причинам.
  • станет ли лучше на новой работе, не будет ли шило на мыло

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

ситуация простая- пришел человек,стаж больщой - но он в джаве 0
ему сходу не понавился спринг и хибер) он решил все перевести на жук + обычная джава
я четно не знаю что тут сказать
у нас был реализован кэш - он такой не видел - начал мутить что то на подобии пхп

короче по факту запрещено все кроме джавы- даже ModelMapper нельзя
Lombok нельзя - у меня воломы дыбом встают от этого бойлер плейта и контрусторов этих..
хз кто то двигается на пути прогресса а у меня такое чувство что мы куда то обрато в легаси 2000 года..

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

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

совсем недавно я столкнулся например с косяком кэша спринга. оно ПОЧЕМУ ТО стало воспринимать опшин.емпти как налл. вот хоть тресни. меняешь два мапа идущих друг за другом порядком и становится ок. ))) не меняешь - падает. и что делать в потроха лезть или забить. и таких случаев целый набор.

иногда кажется что простые вещи проще сделать просто. и самому. а спринг - это для любителей бесконечных деклараций и аннотаций. которых никто нигде никогда не видел кроме как в спринге.
...
Рейтинг: 0 / 0
Нов арх
    #40109718
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RMT
А я вижу здесь подход к делу: чем бы не занимался, лишь бы заманался.

В промышленном коде можно использовать ломбок, а можно не использовать. Ты же не ручками этот бойлерплейт пишешь, да?
Что касается маппера - его запрет на мой вгляд бред собачий. MapStruct и погнали. Особенно если модель с > 30-50 полями. Ручками импл писать? Так пусть наймут ждуна за 30 тыс.

Автор, не нравится, уходи. Тем более джава. Перепрыгнуть на другую посудину легко, если знаешь актуальный стек: docker/k8s/os, спрингбут, spring data, реляционки, junit + mockito, mapstruct.

я как то замерял перформансы этих мапперов. мапстракт оказался хуже всех. в принципе это не проблема если тебе надо две дтошки замапить раз в секунду. в итоге в мусорку. самый быстрый вариант оказался к сожалению ручками.
...
Рейтинг: 0 / 0
Нов арх
    #40109723
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Osipov
localhost8080, Можно в идею плагин поставить - Mapping Generator называется.
Сам мэппинг нагенерить в утилитных классах.

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

Из минусов:
- раздувается кодовая база (ну здесь еще посчитать надо, сколько конфигурация в мэппере занимает, а сколько код - может то на то и выйдет)


интресно ,щас посмотрим - как этот плагин решает вопрос с иерархиями
...
Рейтинг: 0 / 0
Нов арх
    #40109724
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Osipov
localhost8080, Можно в идею плагин поставить - Mapping Generator называется.
Сам мэппинг нагенерить в утилитных классах.

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

Из минусов:
- раздувается кодовая база (ну здесь еще посчитать надо, сколько конфигурация в мэппере занимает, а сколько код - может то на то и выйдет)


не умеет он с иерархиями работать и различными конструкторами- у меня есть такие объекты - в силу приношения жертвы богу консистености у многих объектов часть полей собирается только через конструктор,вообщем генератор тут не подходит ,только руками все писать
...
Рейтинг: 0 / 0
Нов арх
    #40109730
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080
тебе нужно написать функцию преообразования списка объектов класса Animal
в список AnimalResponse

Для чего это нужно и что реально в списке приходит?
В метод можно пепедать указатель на базовый класс, но реально там наследник по факту.
...
Рейтинг: 0 / 0
Нов арх
    #40109734
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp

Для чего это нужно и что реально в списке приходит?


это нужно для того чтобы из списка Анималов сделать список анималреспонсов
у анимала много наслдеников ,а анимал респонс - просто набор полей из всех этих классов наследников
в списке реально приходят животные ,поля которых нужно преобразовать в анимал респонс- я же все написал во вводных

для чего это реально нужно ? для того что мы рефакторим плохой код- где вместо рекордов,доменной модели ,респонсов и реквсестов - все выполнялось Хибернейт сущностью..От базы данных до клиента гуляла туда сюда)

а респонс это джейсон который нужен фронту - обычный набор полей,которые раньше он получал из сучности
...
Рейтинг: 0 / 0
Нов арх
    #40109735
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot PetroNotC Sharp#22392641]
localhost8080

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

ну я собственно так и делаю

Код: java
1.
2.
3.
4.
5.
6.
7.
public AnimalResponse map(Animal animal){//передается базовый класс в аргументы
var resp=  AnimalResponse(animal.getName(),animal,getAge());//создается респонс с полями,которые есть в супер классе
if( animal instanseof Cat){//проверяем класс объекта
resp.setCatShit(((Cat)animal).getCatShit())//делаем сетинг полей,которые присущи данному наследнику
}
if(animal instanseof dog ){//идем далее вниз по иерархии
resp.setDogAss()}



такой же метод ,как у алекса- просто более короткий и внятный - а так суть одна
...
Рейтинг: 0 / 0
Нов арх
    #40109760
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT

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

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


поменять можно на любой другой свой любимы фре
...
Рейтинг: 0 / 0
Нов арх
    #40109765
Ares_ekb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080
очень много кода,проще сразу в конструктор вбить вот так
Это проще при написании отдельного маппера для отдельных классов. Когда этих классов сотни, когда у них много атрибутов, сложные иерархии наследования, то становится не так важно что код немного избыточный, на много важнее, что он единообразный. Например, для абстрактных классов с наследниками мы всегда пишем/генерим код с if/instanceof. Для классов без наследников генерим просто инициализацию атрибутов. Для неабстрактных классов с наследниками генерим гибридный вариант (на самом деле в шаблоне только его и нужно описать с двумя проверками: есть ли дочерние классы, абстрактный ли это класс). Методы init вынесены отдельно, чтобы можно было мапить сложные иерархии классов без дублирования кода.

Короче, при усложнении иерархии классов этот примитивный метод усложнится до совершенно неподдерживаемого состояния. А если в меппере всё разбито на map/init/create методы, то код масштабируемый на сколько угодно классов. И вообще он становится на столько примитивным, что его можно генерить, а не писать руками.

Хотя, блин, тут можно попасть в другую крайность. Я сталкивался с тем, что люди фигачат кучу каких-то фабрик, вспомогательных классов, методов, которые совершенно не нужны и только усложняют код. А потом начинаются взаимные обвинения в оверинжиниринге :)

Кстати! У вас же запрет на использование сторонних либ в рантайме? А в дизайнтайме можно использоваться что угодно? Может тот же MapStruct можно использовать? Это обычно ещё один довод в пользу кодогенераторов, что правила того же мепирования объектов описываются один раз, потом по этому описанию можно сгенерить реализацию под любые требования рантайма. У меня, например, из одних моделей генерится и Java, JavaScript код. Хотя, MapStruct вроде вынуждает засирать код аннотациями, а в случае своего кодогенератора это не нужно.

Лично мне уже на втором меппере стало бы лень их писать. Я обычно смотрю только во вторую очередь как можно написать код короче и красивее, а в первую - как можно его вообще не писать, скинуть на кодогенаратор.
...
Рейтинг: 0 / 0
Нов арх
    #40109767
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080
тормоза там везде изза неправильного использования ЖПА
я немного декомпозировал и вот показал то что мы кидаем на фронт - теперь это надо мапить руками- вместо одной строчки с модельпамером
"А ты не путай свою личную шерсть с государственной" (ц) личный водитель т.Саах ... "А-а-х, какого человека!"

Скорость конечного приложения как-то меняется из-за разных способов создания O(bject)R(elation)M(apping)?
Нет? Тогда причём тут ваше личное удобство?

Если вдруг вы ещё не догадались, то вы - маленький винтик бизнес-машины.
Задача бизнеса - делать прибыль. Разрабатываемое приложение - средство извлечения прибыли. А ваш труд - инструмент, двигающий всю эту машинерию.

Если, вдруг, вы считаете "основой всего" именно свой труд, то "разочарую я тебя до невозможности".
Основа всего - прибыль. Максимум прибыли, из которой уже исключены издержки в виде фонда заработной платы.
...
Рейтинг: 0 / 0
Нов арх
    #40109768
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ares_ekb
localhost8080
очень много кода,проще сразу в конструктор вбить вот так
Это проще при написании отдельного маппера для отдельных классов. Когда этих классов сотни, когда у них много атрибутов, сложные иерархии наследования, то становится не так важно что код немного избыточный, на много важнее, что он единообразный. Например, для абстрактных классов с наследниками мы всегда пишем/генерим код с if/instanceof. Для классов без наследников генерим просто инициализацию атрибутов. Для неабстрактных классов с наследниками генерим гибридный вариант (на самом деле в шаблоне только его и нужно описать с двумя проверками: есть ли дочерние классы, абстрактный ли это класс). Методы init вынесены отдельно, чтобы можно было мапить сложные иерархии классов без дублирования кода.

Короче, при усложнении иерархии классов этот примитивный метод усложнится до совершенно неподдерживаемого состояния. А если в меппере всё разбито на map/init/create методы, то код масштабируемый на сколько угодно классов. И вообще он становится на столько примитивным, что его можно генерить, а не писать руками.

Хотя, блин, тут можно попасть в другую крайность. Я сталкивался с тем, что люди фигачат кучу каких-то фабрик, вспомогательных классов, методов, которые совершенно не нужны и только усложняют код. А потом начинаются взаимные обвинения в оверинжиниринге :)

Кстати! У вас же запрет на использование сторонних либ в рантайме? А в дизайнтайме можно использоваться что угодно? Может тот же MapStruct можно использовать? Это обычно ещё один довод в пользу кодогенераторов, что правила того же мепирования объектов описываются один раз, потом по этому описанию можно сгенерить реализацию под любые требования рантайма. У меня, например, из одних моделей генерится и Java, JavaScript код. Хотя, MapStruct вроде вынуждает засирать код аннотациями, а в случае своего кодогенератора это не нужно.

Лично мне уже на втором меппере стало бы лень их писать. Я обычно смотрю только во вторую очередь как можно написать код короче и красивее, а в первую - как можно его вообще не писать, скинуть на кодогенаратор.



в моем случае наследников всего 5 - поэтому и из них два имеют лишь набор базовых полей,расширяться там некуда уже)
но есть у нас и такие случаи как ты описал,огромное количество полей и сотни наследников- вот туда твой метод можно будет применить
...
Рейтинг: 0 / 0
Нов арх
    #40109769
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080
только опять же ты абстрагируйся- у тебя есть задача зачем то переписать маперы на ручной маппинг- при этом зачем - умалчивают
класс channel имеет кучу наследников- для модель мапера это норм- он все скушает и все размпаит куда надо- а вот руками это будет как я показал выше и это боль

Если абстрагироваться, то пиши свой маффер. Мне пофигу.
А если рассуждать об архитектуре которую ты не любишь, то почему класс channell имеет кучу наследников?
- в бд 10 наследников это 10 таблиц?
- ddl покажешь?
- ты в курсе что при неправильной модели ты ВЫНУЖДЕН брать из бд классА а отдавать классБ на фронт.
Ты же этим счас занят?.
)))

Basil A. Sidorov,
Да, вы правы. Он начал тему про скорость, а сейчас разговор про удобство кодинга.

Ares_ekb,

Имхо оверхед. Вы видите, что очень мало проектов и людей согласны на DSL и генераторы
...
Рейтинг: 0 / 0
Нов арх
    #40109770
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080
наследников всего 5 - поэтому и из них два имеют лишь набор базовых полей
DDL дай.
А то то скорость, то куча наследников, то секретная работа, то маппинг жирафа на черепаху.
Посерьезнее сеньор программист
...
Рейтинг: 0 / 0
Нов арх
    #40109771
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
localhost8080
наследников всего 5 - поэтому и из них два имеют лишь набор базовых полей
DDL дай.
А то то скорость, то куча наследников, то секретная работа, то маппинг жирафа на черепаху.
Посерьезнее сеньор программист

абстрагируйся от БД то наконец уже петро,давай я упрощу тебе задачу таким образом чтобы ты начал думать наконец- БД нет вообще))

есть доменная модель в виде иерархии Animal и есть AnimalResponse- твоя задача сделать красивый код ,желательно в функциональном стиле получил на вход Animal и отдать AnimalResponse,ни каких сторонних библиотек- только java/

Все вводные данные вверху ^
||
^
...
Рейтинг: 0 / 0
Нов арх
    #40109773
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp

А если рассуждать об архитектуре которую ты не любишь, то почему класс channell имеет кучу наследников?
- в бд 10 наследников это 10 таблиц?

Сhannel это доменная модель - к бд не имеет ни какого отношения и бд ничего не знает про доменную модель ,поэтому еще раз - абстрагируйся от бд
...
Рейтинг: 0 / 0
Нов арх
    #40109776
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080,
Абстрагииоваться от бд не удавалось никому в java.
Но если просишь, можем попробовать.
))
...
Рейтинг: 0 / 0
Нов арх
    #40109777
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080,
Давай доменную модель СУЩНОСТЕЙ.
...
Рейтинг: 0 / 0
Нов арх
    #40109778
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080,
Вас читают новички.
Сущность - Канал и сущность Животное.
Дальше. Их связи. Что за сущность
ЖивотноеResponse?
...
Рейтинг: 0 / 0
Нов арх
    #40109779
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080,

Я могу сделать говнокодом таблицу Событие и потом героически маппить ее в 25 других сущностей на клиента.
Чем ты счас и занят.
Ошибаюсь?
...
Рейтинг: 0 / 0
Нов арх
    #40109784
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
localhost8080,
Абстрагииоваться от бд не удавалось никому в java.
Но если просишь, можем попробовать.
))

я могу тебе может глаза на открыть,но есть приложения вообще без БД
...
Рейтинг: 0 / 0
Нов арх
    #40109790
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080,
Мы бд уже проехали.
Зациклило?
Выше к тебе вопросы
...
Рейтинг: 0 / 0
Нов арх
    #40109812
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
localhost8080,
Мы бд уже проехали.
Зациклило?
Выше к тебе вопросы

я вижу вопросы про бд,на них я тебе ответил,все остальное есть выше во вводных данных,иерархия классов Animal и респонс
если интересует еще что то- возникает вопрос твоей проф пригодности ,ибо входящих данных достаточно даже для джуна,коим ты и являешься по сути )
...
Рейтинг: 0 / 0
Нов арх
    #40109822
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080
приложение медлленно работает

localhost8080
вообщем наше руководство пришло к выводу что нужно что то менять и решило поменять !внимание архитектуру)

localhost8080
складывается ощущение что оттуда пора уходить.

Джуном ты был, джуном и остался судя по тексту выше.
...
Рейтинг: 0 / 0
Нов арх
    #40109824
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
localhost8080
приложение медлленно работает

localhost8080
вообщем наше руководство пришло к выводу что нужно что то менять и решило поменять !внимание архитектуру)

localhost8080
складывается ощущение что оттуда пора уходить.

Джуном ты был, джуном и остался судя по тексту выше.
где код? пока одно балобольство от тебя джун!)
...
Рейтинг: 0 / 0
Нов арх
    #40109837
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080,
Какой код?
Все же видят, что ты сначала про скорость.
То что руководство "решило... Внимание! Архитектуру!" - это же ты написал?))) LOL.
Хочешь бегать за Петро - начинай. Опять ник будешь менять.
Твое право.
Я с тобой инженерным языком разговариваю.
Что такого если руководство решило сменить архитектуру? Ты спец в этом?
...
Рейтинг: 0 / 0
65 сообщений из 65, показаны все 3 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Нов арх
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]