Уроки по Android Clean Architecture, слой DATA на практике

Sdílet
Vložit

Komentáře • 143

  • @TimofeyKovalenko
    @TimofeyKovalenko  Před 3 lety +7

    СОДЕРЖАНИЕ:
    00:00:00 - что такое слой DATA
    00:00:33 - кратко про предыдущий урок
    00:03:17 - диаграмма Clean Architecture
    00:05:09 - паттерн Repository на практике
    00:09:19 - правильная связь Domain c Data
    00:22:09 - пишем внутрянку для Repository
    00:33:18 - кратко о том, что мы сделали в уроке
    00:35:17 - подводим итоги и ставим лайки :)
    На канале также есть и другие уроки по Android Clean Architecture.

  • @f.uckeng
    @f.uckeng Před rokem +18

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

  • @artlinestudio6735
    @artlinestudio6735 Před měsícem

    Тимофей, уважаемый Тимофей. Огромное вам спасибо. Вы великолепный преподаватель! Потрясающе интересные уроки. Желаю вам и вашим родным, крепкого здоровья и настоящего счастья!

  • @user-ke3jt3uh3m
    @user-ke3jt3uh3m Před 3 lety +8

    Оуууууу еееее! Ну наконец-то дядю Боба кто-то доходчиво объясняет в ютубе!!! Жду модульность, тесты, маппинг, асинхронщину и MVVM :D

    • @kafychannel
      @kafychannel Před 3 lety

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

    • @user-ke3jt3uh3m
      @user-ke3jt3uh3m Před 2 lety

      @bitmap Да, Боб Мартин. У него помимо "Clean code" есть статьи по архитектуре, собственно откуда все эти слои и пошли а также его книга "Clean architecture". Также есть адаптированный вариант для андроида у Фернандо Седжаса.

  • @b.shpanchuk
    @b.shpanchuk Před 3 lety +2

    Уроки просто супер!!! Лайк и ждем продолжение :)

  • @user-be2cy2fb9u
    @user-be2cy2fb9u Před 2 lety +3

    мало лайков, поднажмите! это одно из лучших описаний чистой архитектуры :)

  • @oleg12395
    @oleg12395 Před 2 lety +3

    Большое спасибо ! С интерфейсом и двумя репозиториями, от души !!! Очень ценный материал !

  • @samuilzhumakhanov6056
    @samuilzhumakhanov6056 Před 2 lety

    Все подробно и понятно, благодарю!

  • @sao-sao3557
    @sao-sao3557 Před 2 lety +1

    Отличный видеоурок и вообще курс, понятно и интересно, большое спасибо!😀

  • @user-kl3wn2lb5y
    @user-kl3wn2lb5y Před 2 lety +1

    Ваши уроки просто замечательные, пожайлуйста продолжайте радовать нас=)

  • @dervanowsky
    @dervanowsky Před 2 lety +1

    Очень классно разжевано! Продолжайте еще!

  • @user-wc1hl4qn1y
    @user-wc1hl4qn1y Před 2 lety

    Бесподобные примеры и объяснения. От души благодарю!

  • @user-gq6ni6ys1h
    @user-gq6ni6ys1h Před 3 lety +9

    Тимофей, как обычно, Ваши видео просто супер. Для начинающих разработчиков Clean Architecture одна из самых тяжёлых и непонятных тем. Жду продолжения. Удачи!

  • @stasleonov5196
    @stasleonov5196 Před rokem

    Очень, очень большое спасибо. Прям всё разжевано до мелочей. Большое спасибо

  • @sergeyorlovskiy3537
    @sergeyorlovskiy3537 Před 2 lety +1

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

  • @Revakovskyi
    @Revakovskyi Před rokem +1

    Ну очень круто!!!! Тимофей, спасибо вам за шикарные и очень понятные для новичка уроки!!!

  • @beckaksel8783
    @beckaksel8783 Před rokem +1

    Спасибо большое за такое понятное объяснение!)

  • @javist1318
    @javist1318 Před 2 lety

    Очень доходчиво объясняете , диаграммы сильно помогают, очень рад что попал на этот канал

  • @mikhaillazarev5378
    @mikhaillazarev5378 Před rokem

    Большое спасибо за информацию, все очень доступно и по полочкам, безумно благодарен.

  • @UZEXCEL
    @UZEXCEL Před rokem

    Спасибо, отличная подача материала.

  • @user-hx9ur3qr2q
    @user-hx9ur3qr2q Před 8 měsíci

    Как глоток свежего воздуха. Честно. Спасибо!

  • @yauheniprakapenka8095
    @yauheniprakapenka8095 Před 2 lety

    Спасибо за видео и грамотную подачу

  • @lirjarmuhametova8516
    @lirjarmuhametova8516 Před rokem

    Это оказывается так легко и просто 🤗👍 спасибо большое за отличные материал. Продолжаю обучение

  • @user-ph7wi3cg7t
    @user-ph7wi3cg7t Před rokem

    Это божественно, спасибо)

  • @spyro2008
    @spyro2008 Před 3 měsíci

    Спасибо Вам огромное! Вы лучший!

  • @user-sq5cr5uq8i
    @user-sq5cr5uq8i Před 2 lety

    Шикарные уроки!!!

  • @mraleks4474
    @mraleks4474 Před rokem

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

  • @Onitsura12
    @Onitsura12 Před rokem

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

  • @muhammadkurbonov4779
    @muhammadkurbonov4779 Před měsícem

    Спасибо большое

  • @sovrinfo
    @sovrinfo Před 2 lety

    Спасибо за видео.Коммент в поддержку!

  • @kraduschiisyatigrinc3207

    Лайк! Хотим больше разных видео! У вас талант объяснять.

  • @antonfcss
    @antonfcss Před 2 lety +1

    Спасибо большое за ваша видео, очень помогает! В начинаниях в Android Development

  • @azatsabirov863
    @azatsabirov863 Před 2 lety +2

    Спасибо. Лучшего ресурса по архитектуре я еще не встречал

    • @neuralnetwork2811
      @neuralnetwork2811 Před 2 lety

      +++ Плюсую. Все остальные видео которые я смотрел по архитектуре андроид приложений, там просто авторы говорили "Бла-бла-бла, тут короче Domain в Domain-е хранится вот это и там короче кроме Domain есть Presentation и Data. Конец". А в видеоуроках от Тимофея, именно создаешь вместе с автором, приложения используя Clean Architect на практике и после уроков откладывается в голове, что, как работает и что вообще такое Clean Architect

  • @roustamdev
    @roustamdev Před rokem

    Супер

  • @komronbekm4450
    @komronbekm4450 Před 2 lety +1

    Искал в ютубе видосы другого Тимофея, и нашёл вас. Но рад этому, у вас всё тут так классно объясняется, спасибо вам!

  • @kafychannel
    @kafychannel Před 3 lety +5

    Продолжайте пожалуйста делать видео по clean architecture with Android, очень полезные видео

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 3 lety +1

      спасибо, приятно что видео помогают вам. Конечно буду продолжать ).

  • @grigorechebac2247
    @grigorechebac2247 Před 2 lety

    Thank you for this very nice video. It helped me. I think that it is one from better explanation

  • @user-xw3ek8sf9t
    @user-xw3ek8sf9t Před 2 lety +2

    И хотелось бы увидеть как правильно реализовать синхронизацию данных между web api (или firebase) и room)))

  • @Arman_127
    @Arman_127 Před 2 lety

    Спасибо мне это очень помогло

  • @user-nr4dg3fu7p
    @user-nr4dg3fu7p Před 2 lety

    БОМБАА

  • @isagamach1
    @isagamach1 Před rokem

    Спасибо за объяснение! Давно хотел узнать, как грамотно сделать архитектуру приложения. А то чем больше оно растет, тем больше беспорядка :D

  • @luckydevil1601
    @luckydevil1601 Před rokem

    Очень здорово! Спасибо большое! Жаль, что Вы перестали выпускать видео..((

  • @Serjoo88
    @Serjoo88 Před 2 lety

    Тимофей, это блестящий урок!

  • @OCEH6
    @OCEH6 Před rokem

    Огромное спасибо за урок. В моменте с объяснением элвис оператора 28:10 используется строка с firstName и параметр DEFAULT_NAME который создан для lastName. (Лично мне понятно, но тем кто видит ?: первый раз может показаться что-то искаженное =)
    Извиняюсь если уже подсвечивали ранее или если это избыточный комментарий. В любом случае урок потрясающий!

  • @speedrages
    @speedrages Před rokem

    И благодарю

  • @user-kk1yi2sz1d
    @user-kk1yi2sz1d Před 2 lety

    спасибо

  • @armangukasian
    @armangukasian Před 2 lety +3

    класс, спасибо вам большое!) Лайк и подписка однозначно!)
    Скажите, а планируются уроки по таким темам как ретрофит, корутины, рум? Думаю очень полезным был бы ролик с практикой на каком-то маленьком демо-проекте, но где бы сочетался такой стек ?)

  • @sonerrika
    @sonerrika Před 2 lety

    Очень понравилась серия видео, доходчиво и наглядно! Одно только смутило, если слой domain ни про кого не знает, почему от него идут стрелки зависимостей? Разве не другое направление у них должно быть, от data и presentation к domain.

  • @Mecenatt
    @Mecenatt Před 2 lety

    ставлю лайк . Надеюсь автор не забьет на канал .

  • @valentinkulagin515
    @valentinkulagin515 Před rokem

    господи, спасибо ВАМ за эти шикарные и понятные, составленные на русском (а не девелоперском) языке объяснения. Мне кажется, что по вашим урокам можно аутиста клин архитектуре научить

  • @CaptainBuldog
    @CaptainBuldog Před rokem

    До просмотра этого видео в голове была каша. Разложил по полочкам. Огромное спасибо!

  • @abuiman5251
    @abuiman5251 Před 2 lety

    👍🏻👍🏻👍🏻

  • @juneuniversum
    @juneuniversum Před 2 lety +1

    Юзкейсы позволяют переиспользовать логику работы с репозиториями в UI слое. Т.е. когда у вас вызовы репозиториев - это например сложные цепочки и используются в разных местах.
    Это мне кажется первая причина, почему не используются репозитории в UI.

  • @Mecenatt
    @Mecenatt Před 2 lety

    подскажите с контекстом в jetpack compose . Все работает без by lazy . Правильно ли делать так:
    val context = LocalContext.current

  • @islammagomedov3700
    @islammagomedov3700 Před 3 lety +4

    Спасибо за урок, все очень доходчиво и понятно ! По твоим видео понял суть чистой архитектуры на практике
    У меня вопрос: Нужно ли помешать логику в отдельный usecase если usecase не взаимодействует с датой через интерфейс, а возвращает некий объект описанный в слое domen ?
    Было бы отлично если бы уроки по чистой архитектуры выходили и дальше, которые затрагивали бы и другие примеры которые очень часто встречаются на практике например: использование mvvm, recyclerView, взаимодействие с бэком в чистой архитектуре.
    Также не совсем по теме, нигде не смог найти внятное объяснение и пример использования DI (Dagger 2) в MVVM (Передача зависимостей во ViewModel + зависимости с контекстом)
    P.S спасибо еще раз, прошел собес -_-

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 3 lety +3

      Спасибо за отзыв! Конечно буду продолжать, еще много планов на новые видео по архитектуре.
      По поводу помещения логики в usecase, нет таких правил что бы usecase обязательно зависел от даты, в домен выносится вся логика, даже та которая просто что-то делает но не общается в data слоем.

  • @alexkoty5877
    @alexkoty5877 Před 2 lety

    Очень круто!
    А скажи пожалуйста, вот у нас в домене есть модели и есть юзкейсы которые их берут на вход или выход. Нужно ли использовать для них интерфейсы или это избыточно?
    Спасибо

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 2 lety

      Избыточно.
      Но тут на вкус и цвет, кто как делает. Лично я считаю, что стоит делать только если это реально решает, какую-то проблему. Делать просто для красоты или потому, что так написано в умной книжке нет никакого смысла.

  • @ArtemSamoshkin
    @ArtemSamoshkin Před 5 měsíci

    Все здорово! Спасибо!
    Помогите, плз, понять, почему на схеме Presentation знает про Data напрямую? В коде данного видео Activity знает только про UseCases. Разве в клин архитектуре можно "обходить" домен слой?

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 5 měsíci +1

      Да, presentation сам по себе не должен иметь доступ к data, только к use cases. Но, presentation в нашем случае находится внутри модуля app, а app занимается конфигурированием приложения и должен знать о всех, поэтому технически доступ к data возможен. Что бы избежать можно вынести presentation в отдельный модуль, а лучше разделять его на feature модули, про них планирую рассказать.

  • @user-xw3ek8sf9t
    @user-xw3ek8sf9t Před 2 lety

    Спасибо за доходчивый разбор данной темы, в ру сегменте я такого еще не встречал. Вопрос у меня возник такой, пишу приложение в котом есть большое количество фоновой работы, WorkManager который запускает foreground сервисы, в каком из слоев будет правильно размещать подобный функционал? Мне вот кажется, что нужно выносить в совершенно отдельный модуль или в presentaition , но интересно мнение профессионала.

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 2 lety +1

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

  • @dordzhiev
    @dordzhiev Před rokem

    А пример со связью можно? Интересно узнать про вложенность объектов.

  • @alexrr7087
    @alexrr7087 Před rokem +1

    16:55 сделайте пожалуйста видео с примером несколько реализаций

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před rokem +1

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

  • @AkramAzizmurodov
    @AkramAzizmurodov Před 2 lety

    Здравствуйте. Спасибо за видео и труда.
    У меня есть вопрос по поводу applicationContext. Сначала вы запустили программу. Там написал, что applicationContext on a null object reference. А когда вы писали by lazy он работал. Это означает, что applicationContext создаётся внутри функции onCreate?

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 2 lety +1

      Да, с этой активити стартует приложение и applicationContext просто еще не успел создаться.

  • @looee4462
    @looee4462 Před 10 měsíci

    Спасибо больше за видео, очень интересно и понятно рассказана тема!
    Подскажите пожалуйста, что означает фраза "это класс, который делает корут операции" по отношению к репозиторию? Что такое корут операции?

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 10 měsíci

      Возможно корутину имел ввиду. Напишите в каком конкретно месте такое говорил.

  • @user-pb8bb7dk9p
    @user-pb8bb7dk9p Před 2 lety

    Здравствуйте Тимофей, хотел спросить, GetUserNameUseCase и SaveUserNameUseCase принимают объект интерфейса UserRepository, но в MainActivity вы передали объект UserRepositoryImpl

  • @kafychannel
    @kafychannel Před 3 lety +2

    Тимофей, замечательное объяснение, вы случайно не читали статью на медиум по этой теме?

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 3 lety +1

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

  • @user-wd4fr8rn2h
    @user-wd4fr8rn2h Před 2 lety

    Тимофей здравствуйте, вот вы говорите что в data не может быть никакой логики, у меня тогда вопрос может ли репозиторий управлять источником данных, а конкретно может ли быть там логика выбора источника данных в зависимости например от наличия интернет подключения? Или например из UseCase дергаем список фильмов а репозиторий решает какой из методов апи дернуть для получения списка фильмов, например если их несколько но есть условия их получения?

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 2 lety +1

      Может, так как смысл data это как раз таки и работа с данными. Но тут сильно зависит от ваших потребностей в бизнес логике, можно и так и так делать.

  • @user-xi9vl7tw7m
    @user-xi9vl7tw7m Před 2 lety

    Отличное видео! Однако возник вопрос каким образом можно реализовать получение данных из различных источников? Например, мне в проекте нужно получить свежие данные с API, но если это не получилось необходимо отобразить данные из локального хранилища. На сколько я понял, в репозитории я должен создать два метода, например getUserFromAPI в котором происходит получение данных с API и getUserFromDb в котором происходит получение данных из Db. А саму логику с
    if(getUserFromAPI == null){
    getUserFromDb
    }
    я должен реализовать в Use Case. Поправьте пожалуйста если что-то не так.

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 2 lety +1

      UseCase такое не должен делать, это логика получения данных. Тут все очень просто, в репозитории у вас должно быть 2 storage (api и локальная база), и дальше уже в зависимости от задач делаете логику того из какого источника брать данные. Обычно вы дергаете API и если ошибка или данных нет, то идете в локальную базу, либо сначала проверяете локальную базу и если нет данных, то идете в api.
      "getUserFromAPI" - такие методы делать нельзя, так как UseCase не стоит знать конкретику реализации и откуда пришли данные. Дергая метод в репе нам просто нужны данные, все равно откуда они.

  • @readmeandanswer8142
    @readmeandanswer8142 Před 2 lety +1

    Здравствуйте, очень хотелось бы получить объяснение касательно presentation слоя. В видео вы сказали что presentation слой может знать и об domain и о data.
    Тогда как все мои знакомые это отвергли и сказали что напрямую presentation слой не должен знать о data.
    Так как на этом видео можно писать только в случае ну крайне быстрой и ленивой реализации, в очень простой бизнес логике.
    Presentation работает только через domain с data и друг о друге они знать не должны.
    Можно только подцепить даггерчкий элемент, но не более того, так как в видео делать - все сказали что нельзя, это нарушает принцип инверсии зависимости.

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 2 lety +5

      Во первых я в видео много раз говорю, что я даю вам фундаментальные принципы, на основе которых, вы уже дальше развиваете свой проект. Если бы я давал сложный пример сходу со всем функционалом, то мало кто разобрался бы с этим. Мои видео все же делаются для моих студентов, которые только начинают изучать программирование.
      Во вторых: "презентейшен" слой не знает о "дата", это правда, но "app" знает, так как этот модуль является точкой входа в приложение и нам просто больше негде инициализировать все зависимости: "домен" и "дата". И, "app" внутри себя содержит "presentation", соответственно "presentation", технически имеет доступ к этим зависимостям, но логически мы используем только домен.
      Решается это путем разделения "app" и "презентейшен" на разные модули, либо использование фича модулей.
      Так же посмотрите видео, где разбирается DI, тогда станет понятно.

  • @kiparisov1480
    @kiparisov1480 Před 10 měsíci

    Может ли репозиторий хранить в себе методы генерации данных, например генерация вопроса generateQuestion, реализацию этого метода из репозитория я добавляю в RepositoryImpl в data слое и генерирую вопрос на основе числа, которое ввел пользователь, будет ли это ошибкой? Возможно в GenerateQuestionUseCase даже не нужно передавать репозиторий, а можно сразу написать генерацию вопроса, это же вроде как бизнес логика, не требующая доступ к БД.

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 10 měsíci

      Эти вопросы ведь генерируются из какого-то списка? Откуда они берутся? Соответственно данные, на основе которых происходит генерация, где-то хранятся. Я бы в репозитории это делал.

    • @kiparisov1480
      @kiparisov1480 Před 10 měsíci

      @@TimofeyKovalenko эти вопросы генерируется во время работы приложения на основе данных, которые подает пользователь прямо во время работы приложения, затем выводятся на экран, после перезапуска забываются и генерируется снова

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 10 měsíci

      Репозиторий хорошее место тогда.

  • @wannadancee
    @wannadancee Před rokem

    Тимофей привет!
    У меня такой вопрос:
    Как прогнать LiveData через domain, если в этом слое нельзя импортировать данную библиотеку?
    Просто у меня есть usecase: getMoviesFromApiUseCase. В app и в data я сохраняю всё и использую в виде LiveData, но сделать прогон через usecase в domain слое я не могу. Как поступить, если сохранять Clean Architecture?

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před rokem +1

      Никак). Либо смириться с тем, что у тебя в domain будет подключен LiveData. Если используешь корутины, то советую поменять LiveData на Flow.

  • @user-sq2nl9xr2h
    @user-sq2nl9xr2h Před 2 lety

    Спасибо, очень интересно. Но вот урок с MVVM бы очень хорошо, чтобы было понятнее. И что делать, если UserRepositoryImpl данные берет из сети. У Вас он хардкодом

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 2 lety +2

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

  • @LockedIp
    @LockedIp Před 2 lety

    Можно ли использовать flow в domain модуле?

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 2 lety +2

      Конечно, корутины, как и RX - глобальные либы, которые пронизывают все слои.

  • @scorkSH
    @scorkSH Před 3 měsíci

    я вот или понял или нет) не могу понять)....... я так понял, это все "фокусы", посути, все даные храняться в одной компосибл функции (хмл не знаю, юзаю компос), я долго пытался понять, как даные куда передаються, но в этоге пришол к мнению, что не чего не куда не передаеться, а храниться тут:
    val userRepository = UserRepositoryImpl(context = LocalContext.current )
    val usecaseGetName = UserCaseGETname(userRepository)
    val useCaseSaveName = UseCaseSaveName(userRepository)
    я прав?

  • @robertto921
    @robertto921 Před 2 lety

    27:01 Если всё равно ставите элвиса, тогда делайте дефолтовое значение в параметрах null и не надо будет два раза указывать дефолтное значение.

  • @ilgarm4370
    @ilgarm4370 Před 2 lety

    Не понял, репозиторий только для для получения и сохранения данных? А отправка данных это не в репозитории?

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 2 lety

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

  • @garifzyanovrr
    @garifzyanovrr Před rokem

    Тимофей привет!
    Есть ли у тебя сейчас возможность взять на обучение?
    Оставил на твоем сайте заявку, но без ответа.

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před rokem +1

      Привет! Все заявки есть, но не все еще обработал. В этом году обучение не проводиться, есть планы на начало следующего года.

    • @garifzyanovrr
      @garifzyanovrr Před rokem

      @@TimofeyKovalenko отлично жду!
      Благодарю за видео, просто💣

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před rokem

      Всем кого смог найти в мессенджерах отметил, если вам не ответил, то наверно у вас номер телефона скрыт от поиска оп нему. В этом случае оставьте ваш ник в телеграме.

    • @garifzyanovrr
      @garifzyanovrr Před rokem

      @@TimofeyKovalenko Тимофей, спасибо, уже добавили в чат ждунов😄

  • @Nidvoraich
    @Nidvoraich Před 11 měsíci

    Очень сильно бьёт по глазкам смена тёмной темы студии на белый лист дровио(
    Может, в дровио тоже можно тему потемнее выбрать?)

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 10 měsíci

      Возможно есть темная тема, посмотрю.

  • @sasharobson
    @sasharobson Před 10 měsíci

    Тимофей, при использовании UseCases, может ли репозиторий иметь методы обновления данных в репозитории, например поход в локалку, проверка наличия данных и в случае их отсутствия поход на удаленный источник, с сохранением полученных данных в локалке? Или все таки репозиторий должен строго иметь тупые методы сохранения и извлечения данных, а вся логика походов в источники данных уже в UseCases?

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 10 měsíci

      То, что вы описали, как раз и является тупыми методами репозитория). То есть это ответственность репозитория откуда и как брать данные. Но в зависимости от ситуации, иногда этим управляют и из UseCase

    • @sasharobson
      @sasharobson Před 10 měsíci

      @@TimofeyKovalenko спасибо за ответ Тимофей!

  • @videoss6258
    @videoss6258 Před 2 lety

    Спасибо за урок! Но не очень понятно зачем выносить константы из класса, это сделано осмысленно или для удобства чтения? (25 минута)

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 2 lety

      Потому что это котлин, в классе особо вариантов и нет что бы сделать константу.

  • @deo5686
    @deo5686 Před 2 lety

    Правильно ли я понял, что репозиторий выступает неким юзеркейсом для получения данных. В нем нет конкретного процесса получения но есть логика "условий" почему, откуда и зачем. Конкретное решение получения данных должно быть в сторедже. Вопрос, как определить абстракцию для репозитория, ведь он может раздутая до многих десятков функций. И когда надо создавать другие репозитории и надо ли. Спасибо большое.

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 2 lety +1

      Получение данных можно сделать как в репозитории, так и в сторадже, все зависит от того насколько у вас большое приложение. По поводу определения абстракции, как правило репозиторий делает CRUD операции с конкретной моделью. Например, у вас есть модель User, значит у вас будет UserRepository, который делает различные манипуляции с User. Или например для процесса авторизации у вас может быть AuthRepository с методами login, register, forgot password и logout. Один репозиторий под конкретную задачу.

    • @deo5686
      @deo5686 Před 2 lety

      @@TimofeyKovalenko Спасибо большое

  • @developerdeveloper4816
    @developerdeveloper4816 Před 3 lety +1

    Please show mvvm + clean architecture with Koin

  • @jarjaju9524
    @jarjaju9524 Před 9 měsíci

    Сначала подумал какой смысл от модуля data, если данные (models) хранятся не в нем а в domain. А потом снял ручник и вспомнил что models это не данные а типы данных.
    Получается что domain предоставляет логику взаимодействия модулю data с другими модулями, то есть domain, не зная о других, говорит как им взаимодействовать.
    Presentation показывает что-то, используя логику предоставляемую domain.
    Data отдает и получает данные, используя логику предоставляемую domain.
    Так или не так?

  • @k.barabass
    @k.barabass Před 2 lety

    С чего вдруг presentation может знать о data слое? У вас тем самым образуются горизонтальные связи. Presentation может знать в лучшем случае о интерфейсе репозитория который лежит в domain слое.
    Так же у вас почему-то в domain слое логика синхронизации данных - когда вы сначала получаете данные, проверяете изменились ли они и если нет, то ничего не сохраняете. Это не бизнес логика, чтобы она была в domain слое. Логично будет вынести ее в репозиторий, и там уже настраивать политики синхронизации. В domain слое должна быть бизнес логика и только.

  • @MxMayers
    @MxMayers Před 2 lety

    как тут поставить 200 лайков 🤔

  • @MrSuperRenat
    @MrSuperRenat Před 2 lety

    Странно что модели на уровне domain, вроде как они должны быть на уровне data

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 2 lety +1

      Ничего странного, есть модели на уровне domain и есть модели на уровне data, это разные вещи.

    • @MrSuperRenat
      @MrSuperRenat Před 2 lety

      @@TimofeyKovalenko ну да, просто на уровне data я привык что это entities . Но сути не мешает :) я посмотрел потом след. Видео понял что ты имел ввиду.

  • @ljlj
    @ljlj Před rokem

    почему все слои в одном модуле, а не в отдельных?

    • @kavelquu
      @kavelquu Před rokem

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

  • @user-rc3lu1nf4t
    @user-rc3lu1nf4t Před 2 lety

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

    • @TimofeyKovalenko
      @TimofeyKovalenko  Před 2 lety

      Так в этом же и смысл), пока пишешь, набиваешь руку и становится все понятнее. Вообще не представляю даже, как можно научиться просто посмотрев ролик без написания кода.

  • @olegnikolaev3008
    @olegnikolaev3008 Před 4 měsíci

    Тимофей добрый день.
    override fun saveName(saveParam:SaveUserNameParam):Boolean{
    Log.d("MyLog", "Save Param - ${saveParam.name}")
    sharedPreferences.edit().putString(KEY_FIRST_NAME, saveParam.name).apply()
    Log.d("MyLog", "Saved - ${sharedPreferences.getString("KEY_FIRST_NAME", "")?:""}")
    return true
    }
    В первом логе name отображается, но при вызове второго лога getString ничего не отображает.
    Попробовал реализовать тоже самое в новом проекте, но только, просто в активити, все работает.
    Подскажите, пожалуйста, в чем может быть проблема?

  • @user-we6si4mi3x
    @user-we6si4mi3x Před 3 měsíci

    Большое спасибо за подробное объяснение!!!

  • @denissavast
    @denissavast Před rokem

    Отличнейший материал ! Благодарю