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

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

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

22 ответов

11 просмотров
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, оттуда и подходы. Если есть лучше, то я только рад увидеть

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

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

@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Подобного рода ;Следующие три строки это директивы ассемблера, ;которые можно не задавать, т.к.работаем в Visual Studio. ;Символ ";" - это начало однострочного комментария ...
Егор Анелькин
3
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
еще вопрос, допустим мы создадим char массив из 10 элементов и присвоим ему через сканф 10 символов. и выведем все символы. Хотел спросить последний элемент /0 будет включать...
Anthem
11
открыть папку в проводнике: 1 - ShellExecute 2 - ExecuteProcess 3 - OpenDocument что лучше выбрать?
Alexey Kulakov
12
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
Карта сайта