Тёмный

Пример Android приложения с Clean Architecture 

Таверна Андроид
Подписаться 171
Просмотров 3,3 тыс.
50% 1

Пример андроид приложения с чистой архитектурой.
Ссылка на проект:
github.com/Dan...
Телеграм сообщество Таверна Андроид, присоединяйся!
t.me/androidta...
#android #androiddev #androiddevelopers #андроид #тавернаандроид #androidtavern #cleanarchitecture #чистаяархитектура

Опубликовано:

 

28 сен 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 58   
@sardoramanov8960
@sardoramanov8960 2 года назад
Огромное, прям огромное спасибо автору. Наконец-то нашел нормальный разбор чистой архитектуры на реальном примере.
@alexandralban5682
@alexandralban5682 2 года назад
Спасибо большое за видео! Печально что больше нет видео на канале.
@androidtavern
@androidtavern 2 года назад
Благодарю, видео будут :)
@Petrosannn
@Petrosannn 2 года назад
А контент, в таверне андроид - моё почтение
@Ditto_Head
@Ditto_Head Год назад
ты же вообще не понимаешь ничего в программировании , пошел вон, это не для тебя
@Petrosannn
@Petrosannn Год назад
@@Ditto_Head Вот пожалуйста - скуф буллит порядочного человека, позор тебе. А я напоминаю, что на этом канале против буллинга, хуюлинга и борисаюлинга
@AKAghost27
@AKAghost27 2 года назад
хорошее видео, без воды, все по полочкам, спасибо.
@nevdatny
@nevdatny 2 года назад
спасибо за видео. неплохой контент с шикарной подачей. у вас есть одна проблемка в коде: суть интерфейса репозитория в том, что бы отделить юзкейсы от дата слоя, чтобы домен не зависел от даты, а дата зависела от домена путем реализации этого интерфейса. это у вас сделано, но использование модельки из дата слоя в юзкейсе весь этот замысел портит. и ещё одно: вы сказали, что бизнес-логика должна быть в дата слое, а в домене находятся просто дополнительные функции, но это неверно. в домене как раз таки и должна находиться бизнес-логика. домен - центр всей системы.
@androidtavern
@androidtavern 2 года назад
спасибо за комментарий :) "использование модельки из дата слоя в юзкейсе весь этот замысел портит" - каким образом? Если домейн слой знает про существование дата слоя, тем самым он знает про его сущности "бизнес-логика должна быть в дата слое, а в домене находятся просто дополнительные функции, но это неверно. в домене как раз таки и должна находиться бизнес-логика. домен - центр всей системы" - домейн это необязательный слой, если его не будет в проекте, то где будет бизнес логика?) гуглы сами у себя в статье пишут, что домейн слой способствует переиспользованию шаблонной логики. юзкейс так же может включать в себя юзкейсы ) по сути да, проект в видео это абстракция чистой архитектуры. писать код нужно нужно головой )
@nevdatny
@nevdatny 2 года назад
​@@androidtavern у вас домен общается с датой через интерфейс репозитория, который является частью домена, а дата с доменом - путем реализации этого интерфеса. из-за модельки получается, что дата зависит от домена потому что знает о интерфейсе репозитория, а домен зависит от даты потому что знает о модельке. получается циклическая зависимость. то есть вы не можете без изменений в коде поместить домен и дату в разные gradle-модули. да, домен - необязательный слой, но он у вас есть и в нем стоит соблюдать правил зависимостей. представьте, что у вас поменялась схема json, и вместо поля id прилетает $id. и вам придется подсказать gson'у название поля, добавлением анотации SerializedName. и теперь ваш домен знает о том, что данные приходят в формате json, а это уже и зависимость от библиотеки, и детали реализации, которые должны быть в слое с фреймворками и библиотеками. прошу прощения, если надоедаю, просто хочу помочь (или понять, что я неправ), так как формат мне понравился и я все еще жду новых видео )
@androidtavern
@androidtavern 2 года назад
@@nevdatny а, понял. спасибо за замечание. по естеству конечно интерфейс из домейна в дата слое портит малину. я не помню почему так сделал, но оно выглядит неправильным и нелогичным. Вы абсолютно правы в этом замечании. только с json не совсем понял, домейн ничего все равно знать не будет о схеме, ведь наша область видимости объект а не его данные. к примеру если мы и добавим аннотацию, то во всем проекте ничего не изменится, кроме самого класса объекта
@nevdatny
@nevdatny 2 года назад
@@androidtavern попробуйте поместить каждый слой в отдельный модуль. тогда все станет очевидно.
@MrZiko1975
@MrZiko1975 2 месяца назад
Domain знает только о домене, и сущности в домене должны быть только доменные. Дата может иметь свои сущности, зависящие от датасорсов, но в имплементации репозов обязательно нужно мапить в доменные сущности, так как репозы в интерфейсах должны отдавать только доменные сущности. Тоже самое и эксепшены. Необходимо мапить все нетворк/парсинг/датабейс эксепшены в доменные кастомные эксепшены, чтобы Ui слой получал только доменные сущности и никаких эксепшенов слоя дата.
@mihailpalminschi
@mihailpalminschi 2 года назад
Удачи каналу!
@PavelStr-x5w
@PavelStr-x5w 5 месяцев назад
Большое спасибо за подробное объяснение на примере!!!
@androidtavern
@androidtavern 4 месяца назад
И Вам спасибо за комментарий! Рад помочь :)
@kimoterru503
@kimoterru503 2 года назад
Годный видос. Пожалуй подпишусь и поставлю лайк!
@ВладиславСоболь-ш6и
В useCase видно, что происходит довольно большое кол-во маппингов. Я понимаю, что это чистая архитектура и в идеале каждый слой должен иметь свою модель. Но если представить, что приходит какой-нибудь очень большой json, то это довольно плохо скажется на производительности. Есть идеи как можно избежать этого?
@Xname00
@Xname00 Год назад
Не мапить domain в UI. Использовать только domain model. Ну, а если совсем большой json мапить что надо. Мне кажется отдельная UI model нужна редко
@androidtavern
@androidtavern 10 месяцев назад
признаюсь не сталкивался с проблемами с производительностью в целом, по этому не могу ответить как можно избежать. самому стало интересно, пошел гуглить :)
@PavelStr-x5w
@PavelStr-x5w 5 месяцев назад
@@androidtavern к какому выводу в итоге пришли ? :) интересно же :)
@androidtavern
@androidtavern 4 месяца назад
@@PavelStr-x5w Честно, не разбирался, но перечитав сообщение могу сказать что это очень плохо, если будет большой джейсон парсится. Есть решение как пагинация
@mishaeliseev
@mishaeliseev 2 года назад
Мне понравилось, лайк !!! и подписка, надеюсь здесь будет еще что-дь интересное )
@papa_kottt
@papa_kottt 2 года назад
Отдельное спасибо за ссылку на Гитхаб ) Новичку очень важно "проваливаться" в зависимости между частями программы чтобы лучше понять логику )
@IhorBilous-z5x
@IhorBilous-z5x 10 месяцев назад
хм, это вроде больше похоже на слоеную архитектуру, а не на чистый код, как вы думаете?
@androidtavern
@androidtavern 10 месяцев назад
в целом чистая архитектура выглядит как луковица со слоями, или вы можете вкратце объяснить примером как вы видите чистый код?
@IhorBilous-z5x
@IhorBilous-z5x 10 месяцев назад
ну, пока самое хорошее объяснение я нашел в этом видео: "Clean Architecture. Простое объяснение за 10 минут" от канала StringConcat@@androidtavern
@sovaz1997
@sovaz1997 10 месяцев назад
​@@androidtavernмне лично зашло объяснение Тимофея Коваленко Только тогда паззл сложился и пришло понимание, зачем конкретно это нужно Вот например я пока не очень понимаю, зачем нам нужны мапперы, особенно на начальном этапе развития проекта. Преобразования можно делать в репозитории. А если будет видно, что есть какая-то часть которая повторяется, выделить для нее маппер
@androidtavern
@androidtavern 10 месяцев назад
это хорошо смотреть разную подачу материала с разных источников :)@@IhorBilous-z5x
@androidtavern
@androidtavern 10 месяцев назад
преобразовывать в репозитории из дата сущности в юай? дата слой не знает про верхнии слои так сказать, так что это плохой подход в целом никто не заставляет вас иметь разные сущности в разных слоях, на видео пример чистой архитектуры как это по идее выглядит. но я не давал и не даю гарант что это верное решение для реализации чистой архитектуры. как по мне, нужно исходить из ситуации (как вы заметили).@@sovaz1997
@mikhaillazarev5378
@mikhaillazarev5378 Год назад
Спасибо большое что выложил на гитхаб.
@sovaz1997
@sovaz1997 10 месяцев назад
Всё-таки тут что-то не то Доменный слой же не должен зависеть от моделей data, но почему-то репозиторий возвращает модель из data. Хотя по идее должен возвращать доменные бизнес-сущности (поэтому его имплементация и находится в дате, а интерфейс в моделей). В таком виде домен будет не зависимым
@androidtavern
@androidtavern 10 месяцев назад
давайте так, представим цепочку: UI >> DOMAIN >> DATA получается что юай слой зависит от домейн, а домейн в это время от дата слоя. дата возвращает нам результат требования, в виде сущности, которую домейн слой принимает и может обернуть в свою сущность и вернуть на юай. юай не знает про дата слой (если существует домейн), и идет к домейну с требованиям: мне нужны данные для отображения домейн мол - ок, сейчас будут и сам идет к дата слою за данными. юай слой ждет и не знает и не хочет знать откуда домейн слой возьмет эти данные. теперь мы понимаем что юай слой не знает про дата слой, но знает про домейн. мы таким образом не сможем вернуть юай слою сущность дата слоя. так как дата слоя не существует для юая. но он знает про домейн и сможет работать с его сущностями.
@sovaz1997
@sovaz1997 10 месяцев назад
@@androidtavern но всё-таки цель архитектуры же сделать домен независимым) Домен никак не относится к данным (к способу их получения). Репозитории используются как раз, чтобы убрать зависимость от даты Или я Вас неправильно понял?
@androidtavern
@androidtavern 10 месяцев назад
Домен независимый слой от юай, но зависим от даты. По другому никак не получается (см. док. от гуглов по чистой архитектуры). Домен это прослойка между юай и датой, если на то требуется в архитектуры, как доп. условие для бизнес логики Репозитории относятся к дате, верно, но их задача это хендлить бизнес логику (в себя принимает источники данных/другие репозитории с которыми взаимодействует)@@sovaz1997
@sovaz1997
@sovaz1997 10 месяцев назад
​@@androidtavern так по сути Вам нужно мапить данные в репозитории и все Вроде как будет полная отвязка от даты в таком случае. А сейчас получается, что Вы на уровне домена мапите данные маппером. UseCase ничего не должен знать о том, как выглядят реальные данные - взаимодействие должно идти с моделями уровня домена
@MrZiko1975
@MrZiko1975 2 месяца назад
@@sovaz1997 вот именно. Домен ничего не знает о дата моделях, только доменные сущности. И мапинг должен быть либо в дата либо в презентейшен слоях.
@andreilukin5281
@andreilukin5281 7 месяцев назад
Мне не понятно в каком слое и классе происходит работа с многопоточностью, или ее вообще тут нет?
@andreilukin5281
@andreilukin5281 7 месяцев назад
Ведь она нужна вроде как для запросов в сеть
@androidtavern
@androidtavern 6 месяцев назад
если стандартно, то ваша многопоточность должна быть привязана к жизненному циклу экрана. соответственно это будет в viewmodel/presenter. задачи разные бывают, и в зависимости от них многопоточность может быть и в другом месте.
@MrZiko1975
@MrZiko1975 2 месяца назад
Data слой отвечает за бизнес - логику?!
@androidtavern
@androidtavern 2 месяца назад
Конечно
@MrZiko1975
@MrZiko1975 2 месяца назад
@@androidtavern нет. Дата слой отвечает за доступ к данным приложения. Если мы говорим о клин архитектуре. Дата слой отвечает на вопрос "где взять данные?", домен слой отвечает на вопрос "что с этими данными делает наше приложение". Бизнес логики не должно быть в дата слое в клине.
@androidtavern
@androidtavern 2 месяца назад
@@MrZiko1975 Вы говорите про data source. Не забывайте что data слой имеет так же repository. Так же если нету промежуточного слоя domain, то где будет бизнес логика?..
@MrZiko1975
@MrZiko1975 2 месяца назад
Дата слой - имплементит репозитория. Определяет репозитория - домен слой. Домен слой ничего не знает про дата слой и кто и как его имплементит. Этот принцип хорошо видно на уровне модулей и зависимости модулей. Домен градл не содержит других implementation, один чистый котлин. Дата модуль как раз содержит implementation (":domain")
@Ditto_Head
@Ditto_Head 2 года назад
Союз нерушимый республик свободных, видос годный, смотреть саветую!
@Ditto_Head
@Ditto_Head Год назад
начал заниматься программированием, автор отвечает на сообщения и помогает, главное что очень доходчиво
@РустемАширмаметов
Все гениально и просто, спасибо за видео!!!
@halu055
@halu055 Год назад
брат ты где расскажи про DI
@androidtavern
@androidtavern Год назад
Привет Видео будут после нового года, возможно раньше получится :)
@halu055
@halu055 Год назад
@@androidtavern очень жду, ты красава
@Ditto_Head
@Ditto_Head Год назад
@@halu055 брат, альхамдуллиа1х у тебя все получится на твоем пути
@serg888fert4
@serg888fert4 2 года назад
Спасибо за заботу о коленах на Котлин. Они все такие тупые, что сами не могут себе включить музыку. Поэтому должны слушать эту тягомотину. Ты реально думаешь, что всем нра музыка такая как тебе?
@androidtavern
@androidtavern 2 года назад
Хотел сделать атмосфернее видео, но учту, спасибо
Далее
MVI в Android на практике
19:20
Просмотров 15 тыс.
Qalpoq - Amakivachcha (hajviy ko'rsatuv)
41:44
Просмотров 176 тыс.
ДЕНЬ УЧИТЕЛЯ В ШКОЛЕ
01:00
Просмотров 910 тыс.
Все тайны MVI
1:30:52
Просмотров 14 тыс.
Чистая архитектура ASP.NET Core 7
25:20