Clean Architecture Android на практике - применяем Use Case

แชร์
ฝัง
  • เผยแพร่เมื่อ 11 ก.ค. 2024
  • Показываю реальный пример на пальцах для "чайников" :) с применением Android и Kotlin. Рассказываю про Clean Architecture Android на практике (Чистая архитектура).
    Тема супер важная для разработки приложений под Android.
    Предыдущее видео с теорией про Use Case: • Clean architecture And...
    Я веду курсы программирования по разработке мобильных приложений для Android с менторингом 1 на 1. Записаться на курсы можно по ссылке: ✅ kiparo.com.
    СОДЕРЖАНИЕ:
    00:00:00 - краткое содержание к видео
    00:00:55 - Clean Architecture на диаграмме
    00:04:57 - Чистая архитектура Android на практике с реальным примером
    00:22:20 - краткий обзор выполненного примера на Kotlin
    00:24:26 - подводим итоги
    Найти меня можно вот тут:
    ✅ Linkedin: / timofeykovalenko
    ✅ Instagram: / ttimofey
    ✅ На моем сайте: kiparo.com/teacher/timofey-ko...
    ✅ FB: / kiparocom
    #чистаяархитектура #сleanarchitecture #kiparo

ความคิดเห็น • 123

  • @TimofeyKovalenko
    @TimofeyKovalenko  3 ปีที่แล้ว +7

    Предыдущее видео с теорией про Use Case: th-cam.com/video/Ao3d1R1TCYc/w-d-xo.html
    СОДЕРЖАНИЕ:
    00:00:00 - краткое содержание к видео
    00:00:55 - Clean Architecture на диаграмме
    00:04:57 - Чистая архитектура Android на практике с реальным примером
    00:22:20 - краткий обзор выполненного примера на Kotlin
    00:24:26 - подводим итоги

  • @Arman_127
    @Arman_127 2 ปีที่แล้ว +3

    Огромное спасибо.
    Вам реально дано объяснять сложные вещи простыми словами.
    Рад что наткнулся на ваш канал

  • @MrOnlineCoder
    @MrOnlineCoder 2 ปีที่แล้ว +11

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

  • @GriNAME
    @GriNAME 2 ปีที่แล้ว +2

    Просто огромнейшее человеческое спасибо! Очень полезные видео! Очень мне сейчас они помогают!

  • @user-my3ku3rp2q
    @user-my3ku3rp2q 2 ปีที่แล้ว +1

    До этого я смотрел много видео , но после ваших видео я начал понимать что к чему, молодец ! Теперь скоро собираюсь купить ваш курс! Супер!

  • @arthurtargonsky9952
    @arthurtargonsky9952 3 ปีที่แล้ว +4

    Спасибо! Очень ясно и доступно :)

  • @chriswaytt6009
    @chriswaytt6009 2 ปีที่แล้ว

    Больше уроков пожалуйста ) отлично обьясняете!!!

  • @stasleonov5196
    @stasleonov5196 ปีที่แล้ว

    Потрясающе просто о сложных вещах. Огромное спасибо вам за труд.

  • @Revakovskyi
    @Revakovskyi ปีที่แล้ว +1

    Очень крутые уроки!!! Спасибо вам за детальное разъяснение!

  • @speedrages
    @speedrages ปีที่แล้ว +2

    Благодарю, процветания каналу!

  • @RomkinVideo
    @RomkinVideo 2 ปีที่แล้ว

    Очень понятное видео. Прям я пока лучше не видел. Для чайников самое то! Спасибо!

  • @user-iu6yz6ck6h
    @user-iu6yz6ck6h 3 ปีที่แล้ว +2

    Спасибо за видео! Очень круто

  • @artlinestudio6735
    @artlinestudio6735 หลายเดือนก่อน +1

    Большое, огромное спасибо за науку учитель. Очень интересно смотреть. Спасибо.

  • @annadanilenko3600
    @annadanilenko3600 2 ปีที่แล้ว

    Спасибо большое, Тимофей! Все сверх понятно!

  • @romanstirskyi
    @romanstirskyi 2 ปีที่แล้ว +1

    Очень все понятно! Спасибо!

  • @jkronz
    @jkronz 10 หลายเดือนก่อน

    Спасибо огромное!! Как бы я жил без твоих видео без чистой архитектуре.

  • @armangukasian
    @armangukasian 2 ปีที่แล้ว

    спасибо большое, отлично передана информация!)

  • @89Razin
    @89Razin 9 หลายเดือนก่อน

    Наконец-то я нашел достойные уроки по архитектуре приложения!!!Спасибо Вам!!!❤

    • @user-hu8uw3fr6m
      @user-hu8uw3fr6m 7 หลายเดือนก่อน

      сходи в гости к Roman Andrushchenko, будет полезно.

  • @sovrinfo
    @sovrinfo 2 ปีที่แล้ว +1

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

  • @dervanowsky
    @dervanowsky 2 ปีที่แล้ว

    класс! смотрим остальные уроки!

  • @samuilzhumakhanov6056
    @samuilzhumakhanov6056 2 ปีที่แล้ว

    Все просто и понятно, спасибо!

  • @codemachine19
    @codemachine19 ปีที่แล้ว

    Очень понятно объясняешь, спасибо за урок

  • @user-lx1sp4ju3e
    @user-lx1sp4ju3e 2 ปีที่แล้ว

    Спасибо за видео!!!! Очень хорошо объясняете!

  • @AkramAzizmurodov
    @AkramAzizmurodov 2 ปีที่แล้ว

    Огромное спасибо Тимофей! Мне очень нравится. Пожалуйста, делайте видео о Room SQLite.

  • @OCEH6
    @OCEH6 ปีที่แล้ว

    Видео огонь! Спасибо!

  • @KingDev6363
    @KingDev6363 5 หลายเดือนก่อน

    Доброго времени суток! Уроки очень полезные, недавно только закончил курсы, но там мне не было понятно по clean Architecture. Сейчас, по вашим урокам заново перепрохожу и все доходчиво понятно. Спасибо огромное!!!🤝🥳

  • @user-ke3jt3uh3m
    @user-ke3jt3uh3m 3 ปีที่แล้ว +1

    Ееееее, очень крутое видео, жду некст!)

    • @TimofeyKovalenko
      @TimofeyKovalenko  3 ปีที่แล้ว

      Продолжение уже доступно ;)
      th-cam.com/video/zt07bObIpSk/w-d-xo.html

  • @denissavast
    @denissavast ปีที่แล้ว

    Благожарю за отличный материал !

  • @AlexFromKiev
    @AlexFromKiev 5 หลายเดือนก่อน +1

    Ув. Тимофей! Вы - настоящий Профессор. Без шуток. Зашел в тупик с этими тремя слоями. Без них приложение работает, а с ними нет. Интуитивно искал то, что Вы преподнесли. Спасибо большое!

  • @user-sq5cr5uq8i
    @user-sq5cr5uq8i 2 ปีที่แล้ว +1

    Отличный урок!!!!

  • @ohjelmistokehittaja4446
    @ohjelmistokehittaja4446 2 ปีที่แล้ว +1

    Отличный материал. Были бы ещё strarter/final проекты c кодом, как почти у всех остальных, было бы круто.

  • @olegkovalenko5708
    @olegkovalenko5708 2 ปีที่แล้ว

    Спасибо большое за труды

  • @user-hx9ur3qr2q
    @user-hx9ur3qr2q 8 หลายเดือนก่อน

    Больше спасибо!

  • @itbcompany7625
    @itbcompany7625 2 ปีที่แล้ว

    Однозначно лайк и подписка )))

  • @user-pu5je3uy4q
    @user-pu5je3uy4q 2 ปีที่แล้ว

    Спасибо за видео!

  • @user-pe5cm1ks7b
    @user-pe5cm1ks7b 10 หลายเดือนก่อน

    Полезное видео, спасибо

  • @user-tj2ho2ml2f
    @user-tj2ho2ml2f 2 ปีที่แล้ว

    Мега спасибо!

  • @user-il4ow8rp3n
    @user-il4ow8rp3n ปีที่แล้ว

    Супер!

  • @ArtemSamoshkin
    @ArtemSamoshkin 6 หลายเดือนก่อน

    Благодарю!

  • @user-ed3hm2lt4h
    @user-ed3hm2lt4h ปีที่แล้ว

    Супер бомба 🎉

  • @serious_psychologist
    @serious_psychologist 2 ปีที่แล้ว +8

    очень очень хорошо объясняете. Не знаю почему это назвали чистой архитектурой )) но ладно. Но пожалуйста продолжайте тенденцию, как объяснять вещи вот таким вот образом. Такого в рускоязычном компьюнити мало на самом деле. Многие прям все заворачивают сразу в сложные конструкции, как будто так и надо. В англоязычном объясняют сначала на пальцах, типа Couter простейший, чтобы было понятно с чего все начинается. Вот в этом видео я вижу тоже самое и мне это очень нравится. Отличное видео. Спасибо!

    • @luckydevil1601
      @luckydevil1601 ปีที่แล้ว

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

    • @bunnyrin
      @bunnyrin ปีที่แล้ว

      @@luckydevil1601 можете посоветовать хорошие каналы по Андроиду? Конечно. можно англоязычные) Знаю парочку, но всегда хочется узнавать еще больше от классных спецов.

  • @user-tc4db8su3b
    @user-tc4db8su3b 2 ปีที่แล้ว +1

    Я просто в восторге. Очень подробно!

  • @hackim2554
    @hackim2554 2 ปีที่แล้ว

    Благодаря вашему видео я начал изучать Kotlin. Хотелось бы увидеть реализацию на java. Может дальше есть, пока что смотрю лишь второй урок. Но даже не зная Kotlin, смог написать подобный ваше реализации код на Java

    • @TimofeyKovalenko
      @TimofeyKovalenko  2 ปีที่แล้ว

      Сейчас уже все на Kotlin на Android, поэтому реализации на Java не будет (.

  • @kafychannel
    @kafychannel 3 ปีที่แล้ว +3

    Видео крутое, информативно, голос приятный, большое спасибо. Какой у вас опыт в разработке под анлроид?

    • @TimofeyKovalenko
      @TimofeyKovalenko  3 ปีที่แล้ว

      Под андроид начал писать в 2011, почти 12 лет уже.

  • @motohiker3435
    @motohiker3435 ปีที่แล้ว

    Благодарю

  • @user-bj6kn4yo6k
    @user-bj6kn4yo6k 2 ปีที่แล้ว

    Огромное спасибо. Жаль нельзя поставить несколько лайков.

  • @Ucozar
    @Ucozar 2 ปีที่แล้ว

    Спасибо!

  • @muhammadkurbonov4779
    @muhammadkurbonov4779 หลายเดือนก่อน

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

  • @user-nc5kd9qv5f
    @user-nc5kd9qv5f ปีที่แล้ว

    чувак, как же ты крут

  • @kovshichek5933
    @kovshichek5933 10 หลายเดือนก่อน +1

    Еще можно у UseCase классов вместо execute воспользоваться фишкой Kotlin, назвав метод invoke, тем самым переопределив вызывание через (), например UseCase()

  • @cinderellarouge
    @cinderellarouge 2 ปีที่แล้ว

    Вы такой классный!!!

  • @MxMayers
    @MxMayers 2 ปีที่แล้ว

    Отличное видео спасибо! Подскажите как человек работающий в Android Studio уже долго (я полагаю) если у меня класс состоит из 10ти полей допустим класс "фильма" как в андройд студии настроить так что бы при печатании названии класса (при создании где нибудь переменной) что бы он автоматически вставлял все эти поля типа:
    val film = Film(title=,year=, genre=,actors= .... ) а не пустой класс Film() то есть что бы не приходилось вбивать 10 полей вручную. Это как нибудь настраивается? все разрбрался плагин для студии "Kotlin Function Arguments Helper"!

  • @Silveryization
    @Silveryization 4 หลายเดือนก่อน

    Спасибо

  • @yura.kuznetsov
    @yura.kuznetsov 2 ปีที่แล้ว

    Ранее работал в Android Studio, ваши уроки проходят в IntelliJ IDEA.
    Может есть инструкция, как правильно подключить Genymotion к этой среде разработки?

  • @_Iovan_
    @_Iovan_ 2 ปีที่แล้ว

    Спасибо за видео, супер доходчиво! На просторах гугла вычитал что UseCase === Interactor, так ли это?

  • @speedrages
    @speedrages ปีที่แล้ว

    Вопрос: если юзкейс представляет собой гет запрос к апи, и в этом запросе есть параметр @Path который может меняться, то нужно ли создавать три юзкейса под каждый возможный path или можно через параметры в execute передавать?

    • @TimofeyKovalenko
      @TimofeyKovalenko  ปีที่แล้ว

      Это не верный вопрос. Создавая юз кейсы вы не должны опираться на API. Вы создаете юз кейсы из необходимости в том или ином функционале, а уже затем смотрите, какие API и как нужно вызвать. То есть это вы решаете, какие юз кейсы создать, а не бекенд разработчик, который создал для вас API.
      Но добавлю пример, что-бы прояснить конкретно ваш вопрос: зависит от того, что вы отсылаете в @Path и относится ли это к одному функционалу. Например, если через @Path вы делаете поиск данных или фильтрацию, то тут понятное дело будет один юз кейс. А если через @Path вы получаете 3 совершенно разные функциональности, то есть по хорошему это должно быть 3-мя разными API, то тут логично разделить это на разные юз кейсы.

  • @oleg12395
    @oleg12395 2 ปีที่แล้ว

    Скажите пожалуйста, а логика кнопок копировать, вставить и поделиться где Клин архитектуре должна быть размещена ? У меня сейчас в майн активити. Или надо бы ее по юс кейсам распихать ?

    • @TimofeyKovalenko
      @TimofeyKovalenko  2 ปีที่แล้ว

      Domain не может содержать платформенно зависимые вещи, то есть в домене вы такое размещать нельзя. Идеальнее всего пробрасывать это в ViewModel, которая дальше раздаст нужные команды что делать.

  • @user-ey6ze3zm9j
    @user-ey6ze3zm9j 2 ปีที่แล้ว

    Для SaveUserNameUseCase я бы использовал data class. Так как он больше подходит под логику временного сохранения в памяти, как мне кажется.

    • @TimofeyKovalenko
      @TimofeyKovalenko  2 ปีที่แล้ว +5

      Да, но если вы не используете методы, которые создает дата класс, то нет никакого смысла его использовать. Например, в видео про юнит тесты, мы меняем их на дата класс, потому, что нам нужно сравнивать объекты. Но в задаче данного видео, нам дата класс не нужны.
      Я бы рекомендовал никогда не делать лишний код из расчета, что когда-то понадобится, лучше делать все по факту, иначе будет копиться не нужны мусор.

  • @user-uf5mr2xv9f
    @user-uf5mr2xv9f 3 ปีที่แล้ว

    Можно ли UseCase с Mapper как то использовать? Ведь не всегда нужно использовать все данные которые приходят с сервера/бд. Спасибо

    • @TimofeyKovalenko
      @TimofeyKovalenko  3 ปีที่แล้ว +1

      В UseCase мапперы не нужны, все ненужное можно обрезать еще в data слое, в момент когда делаете маппинг в domain модели.

  • @berspoland5667
    @berspoland5667 ปีที่แล้ว

    Подскажите Тимофей, а следует ли нам наши модельки также на диаграмку набрасать?! Если да, то как это более понятно и стандартизировано должно выглядеть?! Спасибо.

    • @TimofeyKovalenko
      @TimofeyKovalenko  ปีที่แล้ว +1

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

  • @Majjabee-np9nq
    @Majjabee-np9nq 2 ปีที่แล้ว

    Я с помощью твоих видосов только начал понимать, что такое клин архитектура.

  • @motohiker3435
    @motohiker3435 ปีที่แล้ว

    Я так понял, что „Clean Architecture“ это не есть альтернатива патерну MVVM. Скажите пожалуйста. Если использовать совместно с MVVM то нужно каждый Use Case в отдельный класс ViewModel выносить?

    • @TimofeyKovalenko
      @TimofeyKovalenko  ปีที่แล้ว +1

      Конечно не альтернатива, задачи у них совершенно разные. Каждый Use Case в отдельный класс ViewModel выносить не нужно. ViewModel контролирует состояние конкретного экрана или части экрана, сколько там юз кейсов нужно, столько и подключайте.

    • @motohiker3435
      @motohiker3435 ปีที่แล้ว

      @@TimofeyKovalenko благодарю

  • @antonselitskiy8143
    @antonselitskiy8143 2 ปีที่แล้ว

    Так всё же - а когда будем проходить Room? Не совсем понятно как без интерфейсов будет выглядеть управление через UseCase

    • @TimofeyKovalenko
      @TimofeyKovalenko  2 ปีที่แล้ว

      А причем тут UseCase к Room? UseCase ничего не знает про то как и откуда получаем данные(как правило не знает). Room пройдем но буквально чуть чуть, я все же считаю это сильно простой темой, и не хочется на нее много времени уделять.

  • @MarchenkoAnton
    @MarchenkoAnton 2 ปีที่แล้ว

    А могут один и тот же UseCase использовать к примеру два или более активити?

  • @spam397
    @spam397 2 ปีที่แล้ว

    А модельки тоже надо было в диаграмме делать ? Или это не важно ?

  • @senya_tall
    @senya_tall ปีที่แล้ว

    10:11 почему мы тут используем не data class ?

  • @devit4910
    @devit4910 2 ปีที่แล้ว

    Спасибо за урок! Есть вопрос, у меня при создании package usecase, когда я хотел поместить его в package domain, получалось вместо отдельных пакетов один общий.
    Тоесть, грубо говоря, такой результат - domain.usecase и я сюда уже use case помещал свои.
    Это ведь неправильно, можете подсказать в чём может быть проблема?)

    • @TimofeyKovalenko
      @TimofeyKovalenko  2 ปีที่แล้ว +1

      Это просто Android Studio так отображает, если пакеты пустые то склеивает вместе, в настройках можно поменять.

    • @devit4910
      @devit4910 2 ปีที่แล้ว

      @@TimofeyKovalenko подскажите, а как это поменять, чтобы сделать как у вас в уроке?)

    • @devit4910
      @devit4910 2 ปีที่แล้ว +2

      может кому будет полезно, compact middle packages нужно убрать галочку.
      нужно нажать на шестерёнку, прямо над project

  • @user-oo4dx8zg3n
    @user-oo4dx8zg3n ปีที่แล้ว

    можно ваш телеграмм, у меня есть несколько вопросов ?

  • @dopamine5071
    @dopamine5071 2 ปีที่แล้ว

    А почему models располагаете в domain, а не в data-слое?

    • @TimofeyKovalenko
      @TimofeyKovalenko  2 ปีที่แล้ว

      Потому, что там им и место. Посмотрите подробнее диаграмму, если модель будет в дата, то как с ней работать юз кейсам?

  • @jarjaju9524
    @jarjaju9524 9 หลายเดือนก่อน

    Можно ли модели делать на абстрактных классах?

    • @TimofeyKovalenko
      @TimofeyKovalenko  8 หลายเดือนก่อน

      Технически можно, но зачем так усложнять все?

  • @berspoland5667
    @berspoland5667 ปีที่แล้ว

    А модельки должны только общую информацию содержать или внутри правильнот иметь содержания какой-то доп. логики?! Или же если это доп логика то как-то выносится в абстракцию?!

    • @TimofeyKovalenko
      @TimofeyKovalenko  ปีที่แล้ว +1

      Модельки лучше держать чистыми без какой-либо логики.

  • @DenisBezrukov-jr1tp
    @DenisBezrukov-jr1tp 3 หลายเดือนก่อน

    Я тоже бэкендер. Не знаю почему, у нас большинстве случаев топят за 3х слойную архитектуру. Хотя в ней есть много минусов.
    Поэтому тоже было интересно посмотреть как в андройде вы используете Clean Architecture и подобное.
    По поводу SOLID. DIP - игнорируется в вашем случае для useCase. По хорошему через интерфейс стоит их сделать, как считаете?
    Как минимум для мок тестирования? Я бы так сильно не придирался, но вы сами упомянули solid))

    • @user-ns8qh2en9u
      @user-ns8qh2en9u 3 หลายเดือนก่อน

      Т.е. вы предлагаете сделать интерфейс, в нём объявить один метод execute и имплементить его в каждом UseCase? Я просто сам начинающий только, и хочу убедиться, что правильно вас понял)

    • @DenisBezrukov-jr1tp
      @DenisBezrukov-jr1tp 3 หลายเดือนก่อน

      @@user-ns8qh2en9u Да всё, верно. Плюсом мы получаем то, что интерфейс ещё и функциональным становиться.
      Ну и для написания тестов мы сможем "мокать" наши интерфейсы.

    • @TimofeyKovalenko
      @TimofeyKovalenko  3 หลายเดือนก่อน

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

    • @TimofeyKovalenko
      @TimofeyKovalenko  3 หลายเดือนก่อน

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

  • @user-xz5jt3wt8s
    @user-xz5jt3wt8s 2 ปีที่แล้ว

    Насчёт 10 use case в активити(фрагменте) не совсем согласен. Я в своём рабочем проекте использовал Interactor класс, как фасад над несколькими логически взаимосвязанными use case. За счёт этого уменьшается размер конструктора ViewModel твоего активити(фрагмента) и код становится чище и понятнее.

    • @TimofeyKovalenko
      @TimofeyKovalenko  2 ปีที่แล้ว

      Да это хороший вариант.

  • @papirka33
    @papirka33 ปีที่แล้ว

    entities и models это одно и то же?

    • @TimofeyKovalenko
      @TimofeyKovalenko  ปีที่แล้ว

      Можно сказать, что одно и тоже, сейчас эти понятие смешались, но entities изначально были моделями для базы данных именно

  • @nikson9334
    @nikson9334 3 หลายเดือนก่อน +1

    Сейчас уже пишут Data Domain Ui

    • @TimofeyKovalenko
      @TimofeyKovalenko  3 หลายเดือนก่อน

      Ну.. пусть пишут ;)

  • @user-bg3nm3hw2b
    @user-bg3nm3hw2b 11 หลายเดือนก่อน

    Видео классные, многое становится понятно. Но объяснять конечно clean architecture начинающим разработчикам сомнительное удовольствие 😂

    • @TimofeyKovalenko
      @TimofeyKovalenko  10 หลายเดือนก่อน

      Такие уж времена, если не объяснить, то сожрут студента на собеседовании ;)))

  • @ddsdcww434-wi4fo
    @ddsdcww434-wi4fo 2 ปีที่แล้ว

    класс SaveUserNameParam назван странно( Просто UserNameParam нужно

    • @TimofeyKovalenko
      @TimofeyKovalenko  2 ปีที่แล้ว

      Это что-бы более четко понимать для чего он, так как юз кейсов связанных с UserName несколько.

    • @ddsdcww434-wi4fo
      @ddsdcww434-wi4fo 2 ปีที่แล้ว

      ​@@TimofeyKovalenko все равно не убедили. Убирать Save(к тому же это "Save" - это действие, а имя класса лучше начинать с существительного)

    • @TimofeyKovalenko
      @TimofeyKovalenko  2 ปีที่แล้ว

      😉

  • @marknoyanzin6108
    @marknoyanzin6108 2 ปีที่แล้ว

    Если я правильно понимаю, в Activity не должно быть никакой логики, а выражение типа dataTextView.text = "${userName.firstName} ${userName.lastName}" и dataTextView.text = "Save result: $result" это же уже логика? Я делаю все в C#. Если бы я это делал в C#, то я бы переопределил методы ToString в UseCase и ничего в Activities не выносил из логики. И ещё. Пример корявый. Вводим одни данные, а получаем совершенно не в тему данные. Хотя общий смысл ясен более менее. Можно было продумать пример, конечно, получше.

    • @TimofeyKovalenko
      @TimofeyKovalenko  2 ปีที่แล้ว

      Да, все верно. Но мы еще в этом видео не дошли до создания ViewModel ;). В этом видео показываю общую концепцию, детали презентации разбираем в следующих видео, уже выложены на канале.

  • @tpov_oleg
    @tpov_oleg 2 ปีที่แล้ว

    У меня например в активити 50 функций, да мне проще будет разобраться в коду, чем щелкать эти юзкейсы и открывать. Жесть

    • @TimofeyKovalenko
      @TimofeyKovalenko  2 ปีที่แล้ว +4

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

  • @break8090
    @break8090 2 ปีที่แล้ว

    Спасибо

  • @mikhailgureev218
    @mikhailgureev218 2 ปีที่แล้ว

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