Официальный Android SDK содержит в себе достаточный набор классов для создания полноценного приложения. Но будет ли оно лучшим? Сложно с нуля написать одновременно красивое, стабильное и полезное приложение. Иногда ловишь себя на мысли, что метод findViewById ты вызываешь уже в сотый раз и это тебе уже порядком надоело. Благодаря энтузиастам появляются библиотеки, которые существенно упрощают создание сложных конструкций или избавляют от однотипных действий. Сегодня мы разберемся, в чем именно они нам могут помочь.

WARNING


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

Внедрение зависимостей

Паттерны в ООП

Паттерны в ООП — это рекомендации, как писать код, чтобы получился гибкий и масштабируемый проект: уменьшать зависимость объектов друг от друга, создавать универсальные классы и так далее. Рекомендую ближе познакомиться с паттернами, прочитав книгу Эрика и Элизабет Фримен «Паттерны проектирования».

Построение многих популярных библиотек основано на использовании ООП-паттерна «Внедрение зависимостей» (Dependecy Injection). Довольно часто требуется создать объект A, для функционирования которого нужен какой-то другой объект B. Возникшая ситуация называется зависимостью, она приводит к дублированию кода и усложняет разработку: как поменять объект B так, чтобы объект A работал?

Решить проблему можно, используя DI-паттерн. В этом случае объекты связываются с помощью графа зависимостей уже в процессе компиляции программы. От нас же требуется создать абстракции таких классов и указать с помощью аннотаций, куда именно объекты этих классов должны быть добавлены. Рассмотрим все это на практике.

Рис. 1. Подключение библиотек в Android Studio
Рис. 1. Подключение библиотек в Android Studio
 

Dagger 2

Библиотека Dagger 2 предоставляет инструменты для самостоятельной реализации DI-паттерна. Создадим приложение, которое будет загружать из сети какие-либо данные, а затем их обрабатывать.
За загрузку будет отвечать класс ImgLoader:

public class ImgLoader {
  Bitmap image;
  public ImgLoader(String url)
    {loadImage(url);}
  public Bitmap getImage()
  {return image;}
  ...
}

Теперь создадим класс ImgModifier для дальнейшей обработки данных:

public class ImgModifier {
  private Bitmap image;
  @Inject
  public ImgModifier(ImgLoader loader)
    {image=loader.getImage();}
  public String perfomModify()
    {return "modify made";}}

У нас получилась классическая ситуация, когда объекту ImgModifier для работы требуется другой объект. Аннотацией @Inject мы запрашиваем (то есть добавляем в граф новую зависимость) у библиотеки объект ImgLoader. Где же мы его возьмем? Он будет создан в классе с аннотацией @Module:

@Module
public class ImgModule {
  private String urlInt;
  public ImgModule(String urlInt)
    {this.urlInt=urlInt;}

Следующими аннотациями говорим библиотеке, что для графа зависимостей требуется создать (@Provide) по одному экземпляру (@Singletone) объектов ImgLoader и ImgModifier.

Продолжение статьи доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все статьи на сайте

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

Вариант 2. Купи одну статью

Заинтересовала статья, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для статей, опубликованных более двух месяцев назад.


Комментарии

Подпишитесь на ][, чтобы участвовать в обсуждении

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

Check Also

Windows 10 против шифровальщиков. Как устроена защита в обновленной Windows 10

Этой осенью Windows 10 обновилась до версии 1709 с кодовым названием Fall Creators Update …