Посмотрел все видео по архитектуре и хочу сказать, что, Тимофей, ты настоящий мужик и просто красавчик!) Без воды, без всякой нудятины и разглагольствований, без дурацких картинок с мемами, все четко и по делу. Жму руку!)
просто титанический труд, видно, что человеку по кайфу то, что он делает. мало того, что учишься, еще и заряжаешься позитивным настроением от автора =)
Добрый день, уважаемый Тимофей! У меня вопрос: функции ViewModel.save() и ViewModel.load() модуля App обращаются к функциям UseCase.execute() модуля Domain, а так же напрямую к моделям модуля domain. Не нарушает ли это принципы чистой архитектуры? Быть может для модуля App нужно было создать свою модель и репозиторий по аналогии с модулем Data?
В большинстве случаев это уже избыточно. App в любом случае получит именно домейн ентити к себе, а дальше можно их замапить в UI ентити, которую вы уже доставите во view, но это необходимо только что-бы дополнительно подготовить данные для UI, например если там сложная ентити и вы хотите ее упросить, что бы View могла просто брать данные и отображать их. Про репозиторий не понял, как вы его собираетесь использовать из ViewModel?
Тимофей, сделайте пожалуйста урок по MVI паттерну с использованием ViewModel и с обработкой side эффектов без использования сторонних библиотек типа Orbit. В сети отсутствуют хорошие туториалы, а на русском языке тем более.
Тимофей, спасибо большое за объяснения! Особенно важным показался нюанс, что нельзя использовать константы из кода приложения в тестах 👍 В документациях про это не пишут 😁 Однако есть вопрос не теме. Почему публичные методы ViewModel-и названы конкретными действиями (save, load), а не событиями (onSaveButtonClicked, onLoadButtonClicked)? ViewModel же должна реализовать события с View и управлять View, а с конкретными названиями методов ViewModel не реализует события, а предоставляет интерфейс для выполнения конкретных действий. И тогда, если потребуется поменять действие, вызываемое при событии, то придется отредактировать как ViewModel, так и реализацию View (вызывать другой метод ViewModel-и), что является нарушением принципа единственной ответственности у View. У её реализации теперь есть две причины для изменения - при смене дизайна, при смене бизнес-логики. Это так же потребует отредактировать существующие тесты у View. А если называть методы ViewModel-и абстрактно, то при изменении действия, которое должно вызываться при событии, придется редактировать только ViewModel. А если реализация View и затронется, то только для добавления нового кода, а не для смены старого.
Да, к сожалению временно (весна 2022) студентов новых не беру. Но вы можете оставить заявку, я всех помечаю и как только, есть возможность, со всеми связываюсь.
Продолжаете ли вы набор на ваш курс потому что на сайте написанно что мест нет. Это вы уже набрали людей и через какое то время места появятся или набор вообще закрыт?
К сожалению в этом году технически не получается заниматься преподаванием (((. Есть группа для тех, кто хочет пойти на обучение: t.me/+ecDWHDUu9ak2N2I6 Там будет информация, как только старт будет.
Видео интересное, случайно наткнулся на него, но... Я один не понимал и не понимаю смысла этих тестов? Ведь простым дебагом или, на крайняк, логом, можно это все сделать. Да и как-то всё очень очевидно. Мне уже несколько лет никто толково не может объяснить их смысл. Кодинг ради кодинга? Чтоб обосновать свою зарплату? Зачем эти бессмысленные телодвижения?
Как вы собрались использовать дебаг или логи для этого? :) Эти тесты как правило запускаются в автоматическом режиме, перед релизом приложения, после реализацию нового функционала или при каждом мердж реквесте. То есть, вы написали эти тесты и забыли про них), работаете дальше с другими задачами. Но, если случайно испортился старый код, то об этом быстро станет известно, когда тесты на сервере упадут.
@@TimofeyKovalenko как это как? Вы не можете отследить записалось в шэйрдпреференс что-то или нет? Ну ок, тест сломается, если кто-то куда полезет и что-то сломает в плане логики. Но почему кто-то должен что-то ломать? Я работаю в крупном проекте и мы прекрасно обходимся без тестов. Я представляю сколько моего драгоценного времени было бы потрачено впустую, если бы я ещё и тестами занимался...
Кому нужны варианты с разными параметрами вот код @ParameterizedTest @ValueSource(booleans = [true, false]) fun `should try to save and return success status`(saveResult: Boolean){...}
СОДЕРЖАНИЕ:
00:00:00 - введение
00:0:54 - разбираем ViewModel (MVVM)
00:03:20 - пишем Юнит тест
00:06:37 - применяем Mockito
00:08:05 - Unit тест
00:25:39 - заключение
Здравствуйте , как к вам в курсы записаться?
пытался по сайту записаться на курсы, вы работаете еще?
Посмотрел все видео по архитектуре и хочу сказать, что, Тимофей, ты настоящий мужик и просто красавчик!) Без воды, без всякой нудятины и разглагольствований, без дурацких картинок с мемами, все четко и по делу. Жму руку!)
просто титанический труд, видно, что человеку по кайфу то, что он делает. мало того, что учишься, еще и заряжаешься позитивным настроением от автора =)
Великолепно 🤩 Спасибо за бесплатный курс Тимофей, огромная благодарность 🙌
Большое спасибо за такое полезное видео ! :)
Хорошо, что продолжается публикация видео. Спасибо за информацию.
Долгожданное видео.
Конечно лайк, все на уровне!
Тимофей шикарно объясняешь давай больше уроков, очень нравится, жаль что так мало видео.
О наконец-то, обожаю ваши видосы
Крутое видео!Очень понятно и информативно!
Спасибо!
Один из лучших каналов
Эх, а хотелось бы посмотреть тесты с suspend функциями и корутинами во ViewModel
Используй mockk для suspend функций вместо mockito. Этого будет достаточно
Тимофей жалко что пропали, очень годный, интересный и качественный контент снимаете
Спасибо!! ты крутой 🥰
Здравствуйте,спксиьо за видео! 9:16 - тогда вы будете нарушать принцип DRY
Далеко не всегда стоит гнаться за переиспользованием кода. Часто лучше сделать незначительный копипаст, но зато иметь независимый код.
Добрый день, подскажите, новые видео собираетесь записывать, если да, то на какую тему, спасибо
Добрый день, уважаемый Тимофей! У меня вопрос: функции ViewModel.save() и ViewModel.load() модуля App обращаются к функциям UseCase.execute() модуля Domain, а так же напрямую к моделям модуля domain. Не нарушает ли это принципы чистой архитектуры? Быть может для модуля App нужно было создать свою модель и репозиторий по аналогии с модулем Data?
В большинстве случаев это уже избыточно. App в любом случае получит именно домейн ентити к себе, а дальше можно их замапить в UI ентити, которую вы уже доставите во view, но это необходимо только что-бы дополнительно подготовить данные для UI, например если там сложная ентити и вы хотите ее упросить, что бы View могла просто брать данные и отображать их.
Про репозиторий не понял, как вы его собираетесь использовать из ViewModel?
Тимофей, сделайте пожалуйста урок по MVI паттерну с использованием ViewModel и с обработкой side эффектов без использования сторонних библиотек типа Orbit. В сети отсутствуют хорошие туториалы, а на русском языке тем более.
Тимофей, спасибо большое за объяснения! Особенно важным показался нюанс, что нельзя использовать константы из кода приложения в тестах 👍 В документациях про это не пишут 😁
Однако есть вопрос не теме. Почему публичные методы ViewModel-и названы конкретными действиями (save, load), а не событиями (onSaveButtonClicked, onLoadButtonClicked)? ViewModel же должна реализовать события с View и управлять View, а с конкретными названиями методов ViewModel не реализует события, а предоставляет интерфейс для выполнения конкретных действий. И тогда, если потребуется поменять действие, вызываемое при событии, то придется отредактировать как ViewModel, так и реализацию View (вызывать другой метод ViewModel-и), что является нарушением принципа единственной ответственности у View. У её реализации теперь есть две причины для изменения - при смене дизайна, при смене бизнес-логики. Это так же потребует отредактировать существующие тесты у View. А если называть методы ViewModel-и абстрактно, то при изменении действия, которое должно вызываться при событии, придется редактировать только ViewModel. А если реализация View и затронется, то только для добавления нового кода, а не для смены старого.
Да, все верно говорите. В примере просто упростил, что-бы не писать длинное название, но по хорошему так и нужно их называть.
@@TimofeyKovalenko спасибо! 👍
Спасибо за уроки, хотел бы записаться на ваши курсы, но на сайте написано что мест нету. Когда будет возможно записаться?
Да, к сожалению временно (весна 2022) студентов новых не беру. Но вы можете оставить заявку, я всех помечаю и как только, есть возможность, со всеми связываюсь.
Продолжаете ли вы набор на ваш курс потому что на сайте написанно что мест нет. Это вы уже набрали людей и через какое то время места появятся или набор вообще закрыт?
Время от времени появляются места. Очень много желающих, физически не могу столько принять (((.
Добрый день! Будет ли ещё набор на курс "Комплексный курс по Java, Kotlin и Android".
К сожалению в этом году технически не получается заниматься преподаванием (((. Есть группа для тех, кто хочет пойти на обучение:
t.me/+ecDWHDUu9ak2N2I6
Там будет информация, как только старт будет.
Здравствуйте. Как вас найти на GitHub ?
Вы работаете андроид разработчиком? Или андроид для вас хобби, давно смотрю вас и хотелось всё время узнать)
Конечно работаю) откуда же все это можно узнать, если не из опыта)). А преподавание - это как раз таки хобби.
Привет. Сделаешь видео по модуляризации не по слоям, а по фичам? и по навигации между модулями фичей? где-то писал, что планировал такое видео
Да, на вкладке сообщество, там как раз голосование идет, какие темы дальше разобрать.
Привет. На эти тесты получаю Test events were not received, а тесты для domain модуля прошли успешно. Почему эти тесты не работают?
Убедитесь, что вы прописали в build.gradle
test {
useJUnitPlatform()
}
Видео интересное, случайно наткнулся на него, но... Я один не понимал и не понимаю смысла этих тестов? Ведь простым дебагом или, на крайняк, логом, можно это все сделать. Да и как-то всё очень очевидно. Мне уже несколько лет никто толково не может объяснить их смысл. Кодинг ради кодинга? Чтоб обосновать свою зарплату? Зачем эти бессмысленные телодвижения?
Как вы собрались использовать дебаг или логи для этого? :)
Эти тесты как правило запускаются в автоматическом режиме, перед релизом приложения, после реализацию нового функционала или при каждом мердж реквесте. То есть, вы написали эти тесты и забыли про них), работаете дальше с другими задачами. Но, если случайно испортился старый код, то об этом быстро станет известно, когда тесты на сервере упадут.
@@TimofeyKovalenko как это как? Вы не можете отследить записалось в шэйрдпреференс что-то или нет? Ну ок, тест сломается, если кто-то куда полезет и что-то сломает в плане логики. Но почему кто-то должен что-то ломать? Я работаю в крупном проекте и мы прекрасно обходимся без тестов. Я представляю сколько моего драгоценного времени было бы потрачено впустую, если бы я ещё и тестами занимался...
@@beeline09 Если проект крупный то на деле тесты сэкономят больше времени чем уйдет на их написание.
очень жаль, что нет ссылки на гитхаб
эх думал тут с корутинками:(
Пока еще нет, тут только базовые вещи.
Кому нужны варианты с разными параметрами вот код
@ParameterizedTest
@ValueSource(booleans = [true, false])
fun `should try to save and return success status`(saveResult: Boolean){...}