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

Итак, по поводу интерактора. В принципе я согласен с тем,

что он должен просто возвращать свою бизнесовую модельку в презентер, а презентер пускай сам там мапит.
Но. Еще одна модель и маппинг. Практически всегда вы не переиспользуете интерактор таким образом, чтобы подцепить его к абсолютно другой вьюшке. Максимум - вы просто делаете другую имплементацию. Да, есть интеракторы, которые могут понадобиться в нескольких местах приложения. Но обычно они просто заиспользуются другими интеракторами, которые уже работают с вьюшкой.
Проанализировав все это, я понял, что еще одни модели в принципе не нужны.
Кроме того, если мы делаем еще один модельки, то маппинг достается презентеру. А мне его стало жалко. Ну как-то преобразование моделей к UI слою не очень то по мне (а в UI слое у меня View and Presenter), но это мое субъективное ощущение. Я решил вопрос маппинга максимально делегировать интерактору. Понятное дело, Интерактор это делегирует специальному классу.
Поэтому да, я тут чуть уклонился от канонов. Но это я сделал для большего удобства и уменьшения оверхеда.
Вообще тут боль большая с этими модельками и маппингом их. Иногда это раздражает)
@xanderblinov @senneco вы вроде говорили, что у вас как-то автоматом это делается? Вообщем у кого какие идеи, как минимизировать эту боль?
@mansonheart Киньте, пожалуйста, ссылки, где сказано, что domain ничего не должен знать о других слоях. Помечу у себя.

3 ответов

12 просмотров

ок, я вам соберу материал тогда и скину пачкой, в одной книге автор даже описывает процесс рефакторинга в эту сторону, немного времени нужно)

Я согласен с вашими доводами, сам ищу компромиссы сейчас, так как приложение становится сложнее, возможно в какой то момент станет невыгодным делать абстракции на все, чтобы это можно было использовать в слое бизнес-логики, возможно еще какие проблемы всплывут, то что я написал выше, не факт, что хорошо и удобно использовать на Android в таком виде. Особенно порадовала issue у Фернандо с заголовком Can I use this architecture in real project? Вопрос странный конечно, но волнение человека понятно, но Фернандо на практике показал, что вроде как все норм. 1. Там про интерфейсы говорится в разделе с описанием принципа инверсии зависимостей. Принципы, паттерны и методики гибкой разработки на языке C#, https://www.ozon.ru/context/detail/id/5800704/ (могу сфоткать нужные страницы, если что) 2. https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html 3. http://alistair.cockburn.us/Hexagonal+architecture 4. https://martinfowler.com/bliki/PresentationDomainDataLayering.html 5. https://www.ozon.ru/context/detail/id/35161137/ (в русском издании часть 1, глава 2, могу сфоткать нужные страницы, если что) 6. https://github.com/android10/Android-CleanArchitecture 7. https://github.com/android10/Android-CleanArchitecture/issues/55

Повспоминал немного инфы на этот счет. Начну с рассказа почему считаю, что репозитории и их интерфейсы не должны храниться вместе в слое данных. Некоторое время назад, у меня была задача на новом проекте использовать Realm вместо привычного Sqlite. При этом была вероятность, что где в середине проекта мне захочется вернуться назад к Sqlite. Архитектура, которая позволяла менять дата слой, незатрагивая других выглядела выгодно. Кoнечно, нужно было бы перпеписать большой объем кода, сопастовимый с объемом кода, если интерфейсы репозиториеев хранить в дате слое. Но в случае, если хранить интерфейсы репозиторий в дате, то получается, что бизнес логика знает о деталях реализции моей БД. Возможно даже это означает, что мне придется как то в эти детали вникать, например, мы иногда в моделе дата слоя можем сохранить сложную структуру прям json'ом и парсить при необходимости в объекты. Поместив интерфейс репозитория в слой с бизнес-логикой я смогу гарантировать, что мне никогда не придется вникать в подобные вещи, так как в слой с бизнес-логикой мне зайдут уже модели бизнес-логики. Стоит отметить, что это был мой первый проект с такой архитектурой и я некоторых вещей не понимал еще и на всякий случай, чтобы не сбится с пути и чтобы точно с Realm ничего не заскочило в логику, сделал по примеру Фернандо слой с бизнес-логикой java модулем (кстати так поступаю до сих пор). Таким образом, действительно поменять Realm на что то другое стало проще. Правда, я сразу лишился некоторых фичей реалма, заперев его в слое данных. Дядюшка Боб, кстати, говорит о том, что интерфейсы и их реализации не должны лежать в одном пакете, несмотря на то что у них сильная физическая связь. Он считает правильным, когда интерфейс принадлежит клиенту, который его использует [1]. Так же он об этом писал в своей статье по архитектруре, там же про то, что логика не должна зависисеть от дата слоя. "Independent of Database. You can swap out Oracle or SQL Server, for Mongo, BigTable, CouchDB, or something else. Your business rules are not bound to the database." [2] Собстенно он же пишет, что ничто не должно влиять на слой с бизнес правилами: "We do not expect changes in this layer to affect the entities. We also do not expect this layer to be affected by changes to externalities such as the database, the UI, or any of the common frameworks. This layer is isolated from such concerns." [2] В целом получается, что такую схему зависимостей я выбрал потому, что в теории она позволяла мне с минимальными усилями мигрировать на другую БД и она была описана в статьях и книжках, что сводило к минимуму вероятность ошибок с моей стороны. Фаулер, кстати, такую архитектуру называет Hexagonal architecture [3]. Он считает, что в разделенной на слои архитектуре, зависимости должны быть направлены сверху вниз, представление зависит от бизнес-логики, бизнес-логика от дата слоя. Но также говорит о том, что возможен такой вариант, когда бизнес-логика не зависит ни от одного слоя. При этом дополнительно выделяет слой "Data Mapper" [4]. Точнее не он сам выделяет, просто рассказывает об этом. Есть еще одна замечательная книга от Марка Симана (работал в Microsoft), посвященная DI в .NET. Из .NET там только конкретные примеры и описания IoC-контейнеров, в остальном там много хорошего теоретического материала, по DI лучше литературы вы не найдете, кстати, так что очень советую. Так вот, он там рассматривает простенькое приложение на ASP.NET MVC. Подробно рассматривает каждый из трех слоев, рассказывает, что в каком слое у него есть. Сначала он рассматривает неверную, на его взгяд реализацию, аргументирует и рефакторит в сторону независимого слоя с бизнес-логикой.[5] По поводу связи слоя презентации и бизнес-логики, то у меня сейчас презентеры в основном используют модели бизнес-логики. И не всегда даже маппят их в модели UI, хотя конечно такое приходится делать в некоторых случаях, но мапперы в слое презентации свои.

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
Подскажите, а есть vault lite или ченить такое?) А то нужен вольт для похода в вольт, но весит он ~500 мб) как-то многовато для парочки запросов ))
Alexandr Orloff
17
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Карта сайта