214 похожих чатов

Здравствуйте, друзья, подскажите, пожалуйста, по архитектуре Есть класс ContactDomain, который должен

мапиться к двум другим UI классам: ContactUi и ContactDetailsUi. Проблема в том, что ContactDomain у меня описан так:
data class ContactDomain(...) : Abstract.Object<ContactUi, ContactDomainToUiMapper>, где ContactUi то к чему мапится и ContactDomainToUiMapper сам маппер. Прописать еще раз такой интерфейс котлин мне не позволяет по понятным причинам, но не создавать же еще один идентичный интерфейс для еще одного маппера? Как это делается по умному?

22 ответов

31 просмотр
Savva-Mirzoyan Автор вопроса

было бы хорошо, но там разные данные лежат в каждой, обьединить нельзя

Почему доменный класс вообще знает про свои ui аналоги и мапперы?

Savva-Mirzoyan Автор вопроса
Алексей Ершов
Почему доменный класс вообще знает про свои ui ана...

Правильно понимаю, что тогда домен должен мапиться к общему юи, а потом этот юи во вьюможельке сам мапиться нужной субмоделиЮи?

Savva Mirzoyan
Правильно понимаю, что тогда домен должен мапиться...

Доменной вообще не важно, во что она маппится. Она и знать не должна, что её маппить будут) Это тупо данные, усе.

Savva-Mirzoyan Автор вопроса
Artem Shirokov
Доменной вообще не важно, во что она маппится. Она...

наверное моя проблема, что не уточнил, что использую мапперы в своих дата классах. СЕйчас сделал так, что если хочу сделать ContactUi, то передаю маппер в map(mapper: DomainToUiMapper): ContactUi, если нужны COntactDetailsUi, то map(mapper: DomainToDetailsUiMapper): ContactDetailsUi

Savva Mirzoyan
наверное моя проблема, что не уточнил, что использ...

в общем, без примера кода понять сложно, но суть в том, что ваш домен вообще ничего не должен знать про UI модели, и один и тот же domain класс может мапиться хоть в один UI класс, хоть в 10, и в нём не будет храниться об этом информации, потому что UI зависит от домена, но домен на зависит от UI

Savva-Mirzoyan Автор вопроса
Алексей Ершов
в общем, без примера кода понять сложно, но суть в...

Спасибо, вроде проясняется. Но тогда, если у меня все поля приватны, то у слоя (в данном случае домен), должен быть метод map(Mapper<T>): T, который принимает какой либо маппер и отдает ему все свои данные, верно понимаю логику?

Savva Mirzoyan
Спасибо, вроде проясняется. Но тогда, если у меня ...

если я правильно понимаю проблему - то делают наоборот, маппер в presentation слое принимает domain модель и внутри преобразует domain модель в UI

Savva-Mirzoyan Автор вопроса
Alex Sebo
если я правильно понимаю проблему - то делают наоб...

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

Savva Mirzoyan
А как он ее преобразует, если поля у модели домена...

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

Savva-Mirzoyan Автор вопроса
Alex Sebo
domain модель - обычный класс, насколько я понимаю...

Дата класс с приватными полями, чтобы они наружу не вылезали. Ответствннность маппинг одного слоя к другому предоставлена мапперам и исаолняется исалючительно ими

Savva Mirzoyan
Дата класс с приватными полями, чтобы они наружу н...

Если это дата класс и поля неизменяемые, то их нечего скрывать

Savva Mirzoyan
Дата класс с приватными полями, чтобы они наружу н...

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

Savva-Mirzoyan Автор вопроса
Дмитрий
Если это дата класс и поля неизменяемые, то их неч...

Поля то неизменяемые, но это не мешает вам в любом месте заменить один объект другим, где изменилось поле на ваш выбор

Savva Mirzoyan
Поля то неизменяемые, но это не мешает вам в любом...

если честно, вообще не понял, что это означает и также не понял, чем помогут приватные поля в таком случае

Savva Mirzoyan
Поля то неизменяемые, но это не мешает вам в любом...

у вас какое-то интересное видение архитектуры, и чтобы помочь вам с проблемой, нужно посмотреть на какой-то её микро-пример, так что запилите gist и можно будет предметно обсуждать)

Savva Mirzoyan
Дата класс с приватными полями, чтобы они наружу н...

Если что-то не должно вылезать наружу, то и никакой маппер не должен отдавать эти данные наружу. Кажется вы не правильно понимаете смысл приватных полей. Как сказали выше — по клину именно внешние слои подготавливают данные для себя, а не внутренние. Соответственно маппер у вас должен быть в UI\Presentation, а не в Domain.

Savva-Mirzoyan Автор вопроса
Алексей Ершов
у вас какое-то интересное видение архитектуры, и ч...

https://gist.github.com/savvasenok/0c3c3b55dc37fb2a0745edf1e8efd8e9 вот пример того, как я сейчас сделал. Имея доменный обьект я могу сделать из него нужный мне юи, просто передав необходимый маппер в метод мап map()

Savva-Mirzoyan Автор вопроса
Savva Mirzoyan
https://gist.github.com/savvasenok/0c3c3b55dc37fb2...

домен так то не знает во что он превращается с маппером. Он просто знает, что в маппер нужно положить некоторые/все свои данные, а он уже вернет обьект другого слоя Может не там и не так научился, если у вас есть учебные материалы, то я с удовольствием почитаю

Savva Mirzoyan
https://gist.github.com/savvasenok/0c3c3b55dc37fb2...

Во, отлично, пошли вопросы: 1) в чём смысл класса ContactDetailsUi? Им никто никак не может воспользоваться, как и ContactDomain, и ContactUi, никто не может работать с их пропертями. 2) ContactDomain зависит от ContactDomainToUiMapper и ContactUi, это нарушение направления зависимостей. Зато ContactDomainToDetailsUiMapper как будто не зависит от ContactDomain, но зачем-то дублирует весь его набор полей 3) Зачем доменному объекту передавать маппер только чтобы он вызвал на нём какую-то функцию и вернул результат? 4) Зачем ContactDomainToDetailsUiMapper интерфейс если это простейший класс с одним методом, и у этого интерфейса никогда не будет второй реализации? Чего вы пытаетесь добиться таким витиеватым кодом, в которым смысл несут только три сущности и две чистые функции map?

Savva-Mirzoyan Автор вопроса
Алексей Ершов
Во, отлично, пошли вопросы: 1) в чём смысл класса ...

Я для упрощения примера опустил некоторые вещи. Могу скидывать по необходимости, либо менять исходный гист 1) Для упрощения примера Юи не маппился, но вообще он реализует интерфейс(для каждого Юи обьекта разный), внутри которого метод map с нужными параметрами. Например, чтоб замапить ContactUi к визуалу, то используется следующий код contactUi.map(object : ContactUi.ContactUiMapper { override fun map(id: Int, name: String, photoUrl: String) { button.setOnClickListener { clickListener.click(id) } userFullName.text = name loadPhotoWithGlide(photoUrl) } }) 2-4 и концовка) Я не знаю как ответить. Вероятно, вы правы. Начал изучать архитектуру по примерам из @easyCodeRu, оттуда и подходы. Если есть лучше, то я только рад увидеть

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта