Где и зачем нужно использовать Dagger2

Сегодня на работе дали проект, Dagger там везде и повсюду! Ранее с этим не сталкивался, так как ни разу в этом не было необходимости. Я почитал интернет и понял, что это якобы сахар для тестирования и как бы в проекте все должно быть ровно и чисто.

Я очень долго всматривался в код и понимал, что это каша без сахара. И что все то, что там написано, можно написать без Dagger гораздо компактнее, понятнее для всех и ведь чем меньше площадь огорода - тем быстрее его можно пропахать, это я про быстродействие приложения.

Приложение работает с апи, хранит данные в базе и там очень мало сложного ui с анимациями. Но везде есть Rx! Прям везде, даже там где этого не требуется... зачем!? Этот проект во-первых долго собирается, как бы я не гуглил на эту тему, все безуспешно. Абсолютно никакущая структура приложения, вообще далекая от clean. Непонятные injectы activity - зачем? Android уже имеет все инструменты для старта активности. Класс Application уже singleton и непонятно зачем Dagger предлагает делать тоже самое.

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

Я точно уверен, что Dagger был лишним в том проекте и я его переписал без его использования. Код стал гораздо чище и приложение стало в разы быстрее.


Ответы (1 шт):

Автор решения: Alex_Skvortsov

В комментариях я несколько погорячился на счет "нереально" написать приложение на 30+ экранов без DI библиотеки. Хороший тому пример - телеграмм, в их приложении под Android нет никакого стороннего DI. Возможно, есть что-то самописное, не изучал код сколько-нибудь тщательно.

Однако DI библиотеки все еще остаются чрезвычайно важной штукой, потому что:

  1. Понятность. Любой Android-разработчик с опытом работы более двух лет имеет опыт работы со сторонним DI. Причем абсолютное большинство знакомо с Dagger. Сегодня над проектом работаете Вы. Завтра Вы уволитесь и работать будет другой человек. С Dagger'ом он разберется точно (и найдет тысячи подсказок в интернете). А с Вашим решением?
  2. Тестирование. То о чем Вы читали в интернете. Тестировать с DI на порядок проще, чем без него. А если Вы не пишете тесты, то это плохо. Ну либо Ваши приложения достаточно простые. Либо Вы гений, который не ошибается.
  3. Clean. Та самая чистая архитектура, которую Вы упомянули в вопросе. Для ее построения нужно использование принципа Dependency Inversion. Для использования которого, в свою очередь, есть только один действительно распространенный подход - Dependency Injection. А дальше у Вас выбор: изобрести велосипед, или взять готовый. И Dagger относительно терпимый готовый вариант. (Личное мнение: На мой взгляд только мазохист выберет Dagger, если он ранее использовал Koin или Toothpick и выбор вообще есть)

Теперь немножко сбоку от темы вопроса.

  • По поводу быстродействия приложения. Это не главное. И даже не второе. И даже не третье по степени важности. Приложение должно быть достаточно быстрым, чтобы не доставлять дискомфорт. Не более. Потому что куда важнее, например, чтобы приложение было как можно более быстрым в разработке и модификации. В том числе силами разработчиков, которые это приложение раньше никогда не видели. А еще важнее, чтобы приложение было красивым. А еще важно, чтобы оно не падало почти совсем никогда. И вот только потом идет быстродействие приложения. И то не факт. Поэтому нужно избегать изобретения велосипедов. В Вашей быстрой системе кому-то потом разбираться (и, вероятно, переписывать с нуля).

    Нужно понимать, что сказанное в абзаце выше не касается сверхкрупных приложений, разрабатываемых сотнями разработчиков. Там вообще все важно.

  • Вот этот момент остался мне несколько непонятным:

    Приложение работает с апи, хранит данные в базе и там очень мало сложного ui с анимациями. Но везде есть Rx!

    Я использую Rx во всех проектах почти два года. И вообще ни разу не использовал его для работы с анимациями. Либо я, либо Вы что-то не знаем об Rx. Но я точно знаю, где отлично работает RX: это работа с сетью, с базой данных, обработка данных и многое другое. А еще он очень удобен для работы с ui (от самого простого до сложного без ограничений). Да, он значительно медленнее, чем работа без него. Но божечки, какой же он удобный!

  • Вот это

    проект во-первых долго собирается

    Конечно, проблема. Но не большая. Пример с работы. Приложение около 70 сложных разнообразных экранов, нетривиальная логика работы с данными, множество связей между экранами во все стороны (такая логика затребована бизнесом). Проект на холодную собирается минут 5-7. На горячую - от 5 секунд, в зависимости от количества изменений с последней сборки. И да, у нас все в Rx. И все на DI.

  • А это уже просто вина предыдущего разработчика. DI должен помогать создавать Clean, у кого-то просто руки были из одного места, не повезло Вам с наследием.

    Абсолютно никакущая структура приложения, вообще далекая от clean.

  • А вот тут бы я поспорил.

    Класс Application уже singleton и непонятно зачем Dagger предлагает делать тоже самое.

    Количество проблем, полученных в результате неправильной работы с Application, не сосчитать. Да хоть те же утечки памяти от сохраненных в нем ссылок на Activity. Вы, вполне возможно, не совершили ни одной такой ошибки. Но зачем рисковать?

  • Вот тут

    очередная фишка, которую впихнули в проект в погоне за модными штучками?

    Вы несколько неправы. Хотя, это, конечно, зависит от времени написания проекта. Но сейчас Dagger скорее выходит из моды будучи уже отработавшим своё старым-добрым другом. Его популярность снижается.

  • Ну и постараюсь ответить на, наверное, главный вопрос:

    Какой проект обязательно должен быть построен с его [Dagger] использованием?

    Ответ: никакой. Пять минут на гугление и Вы найдете десяток достойных замен. Но Вы не построите нормальный проект без DI. Пусть он будет самописный, но в крупном проекте он будет. Либо проект не случится. Либо Вы гений и изобрели то, до чего никто из разработчиков за 50 лет не додумался.

Ну и некоторая информация к размышлению. Для того, чтобы понять смысл DI и Rx с ними надо поработать. Минимум пол года. Каждый день в полноформатном 8 - часовом режиме. Это чисто из личного опыта и бесед с коллегами. Где-то после этого начинаешь что-то понимать. Быстрее из моих знакомых никто не освоил. Но это те знания, которые действительно нужны. И это не новомодные вещи. Это, в сущности, инструменты для создания действительно Clean проектов. Есть и другие инструменты. Но на сегодняшний день почти все используют DI и почти половина - Rx. И так далеко не первый год. Так что вещи проверенные.

Что-то слишком простыня получилась, ну и ладно. Постараюсь отвечать на доп вопросы, если Вы зададите их в комментариях в меру своих знаний и сил.

P.s.

Схожий вопрос уже задавался на ruSO Зачем-нужен-dependency-injection-контейнер?

А еще есть небольшая, но полезная статься на Хабре

→ Ссылка