Ниже приведен список зависимостей, на которые полагалась эта версия приложения Medium.

Общая Java

Специально для Android

Это довольно типичный список с интенсивным использованием предложений JakeWharton и Square, а также некоторых библиотек Google.

Также стоит отметить, что в этом списке есть Dagger. Внедрение зависимостей пронизывает все приложение модулями и компонентами для приложения, действий, докладчиков представлений, хранилищ и кешей уровня данных, экземпляров Picasso / Retrofit / Glide и многого другого.

Также интересно, что в этой сборке они используют Dagger 1 (поддерживаемый Square) вместо нового и значительно улучшенного Dagger 2 (поддерживаемого Google).

Глубокое погружение

Заводы и строительство намерений

Как разработчик Android, мы постоянно используем намерения. Мы используем их для запуска Действия, Приемники трансляций и Услуги.

Но, как и многие другие API Android, работать с ними не очень приятно. У намерения могут быть дополнения, действие и данные. И когда мы запускаем действие (или другой компонент системы), нам нужно не забыть установить намерение со всеми дополнительными функциями, действием и данными, которые будет ожидать последующий компонент.

Приложение Medium справляется с обоими этими неприятностями с помощью простых и понятных решений.

Проблема создания и настройки намерений решается с помощью их класса IntentBuilder. Этот класс следует паттерну Строителя, чтобы сделать создание и настройку намерения невероятно простым и понятным.

IntentBuilder (или как улучшить посредственный API)

Класс IntentBuilder имеет два статических фабричных метода в качестве точек входа.

После инициализации построителя вы можете выполнять множество операций по настройке.

Обработка дополнительных функций выполняется с помощью нескольких именованных методов для Strings, JsonSerializables и Serializables.

Различные приложения будут иметь несколько разных операций в методе сборки, но такое разделение процесса построения дает вам большую гибкость, валидацию, сухость и лаконичность (не говоря уже о более удобочитаемом, защищенном от идиотов API для создание намерений).

Потребители IntentBuilder в дикой природе

Вот несколько примеров в приложении, которые подключаются к IntentBuilder.

Это в целом отличный шаблон. Хотя у Activity не может быть параметризованных конструкторов (поскольку их создание и жизненный цикл обрабатывается ОС), наличие фабрики намерений (или нескольких именованных) дает понять, чего ожидает эта деятельность.

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

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

Это отличный маленький шаблон, который следует рассмотреть в любом многофункциональном приложении. Особенно, если у них есть сложные схемы URI с глубокими ссылками или полностью декорированные намерения.

Дополнительно

Давайте посмотрим на несколько советов, приемов, похвалы или тонкостей.

Относительно Guava и количества методов 64k

Хотя счетчик методов в 64К не обязательно является непроходимой стеной, мульти-дексинг - это не то, с чем не хотят иметь дело большинство разработчиков Android.

Сообщество Java приняло Google Guava, но это огромная библиотека с огромным количеством методов. Приложение Medium включает только те части Guava, которые они используют, что значительно снижает размер файла и влияние библиотеки на методы.

У нас тоже могут быть варианты!

В Kotlin и Swift опциональность встроена в систему типов и встроена в их языковую механику, что прекрасно. Однако мы не должны забывать, что мы все еще можем использовать Optionals в Java, даже если они не встроены в сам язык.

Приложение Medium очень эффективно использует Необязательную реализацию Guava. Для полей, которые редко или никогда должны иметь значение NULL, они просто используют тип. Но для данных, которые часто имеют значение NULL, они используют Optionals.

Несколько примеров:

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

  1. Семантический и самодокументированный. Сделав тип возвращаемого значения поля / метода необязательным, это способ документирования без комментариев, засоряющих аксессоры или методы. Он говорит: «Эта вещь часто бывает нулевой. Это не исключение или что-то странное, чтобы быть нулевым, вполне ожидаемо, что его там не будет ".
  2. Это безопасно. Правильное использование опций означает, что вам не нужно беспокоиться о том, что другой разработчик (или вы сами через 2 месяца) ожидает, что ценность появится и взорвется.
  3. Это не одна из аннотаций Android, допускающих значение NULL. Давайте будем реальными, хотя @Nullable и @NonNull могут иметь значение, но это не так семантически, документировано или безопасно, как правильное использование Optionals.
  4. Этим не злоупотребляют. Варианты есть, но даже не в каждом классе они есть. Это не загромождает кодовую базу, но дает ясность в отношении реальных возможностей.

Заворачивать

В коде Medium происходит несколько замечательных вещей, и было интересно пройти через это. Хотя DI на мой вкус немного чрезмерен (особенно с DAG Dagger 1, сгенерированным во время выполнения), из кода можно сделать множество замечательных выводов.

Изменить: JakeWharton поправил меня по поводу генерации DAG при генерации во время выполнения. «Dagger 1 - это не группа DAG, созданная во время выполнения. Это Guice. DAG создается во время компиляции, но связывается во время выполнения ».

Их код, связанный с намерениями, фантастичен, подход Почему не оба? Для Guava и разумного количества методов великолепен, а использование Optionals делает их классы более безопасными и легкими для анализа.

Далее в серии Android Decompile-Deepdive:

Мы проверяем Android-приложение TED.

Наслаждайтесь фрагментами?

Не согласны с моим анализом?

Есть горячие пламенные мнения о каком-то случайном предложении выше?

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