• Android - MVP - RxJava. Лучшие практики или нет?

    Вообще Ханнес Дорфман достаточно толковый специалист, и предложенное им решение покрывает многие задачи, которые возникают в процессе разработки приложений. Поэтому можете смело использовать Mosby в своих проектах для реализации MVP. Можете еще Moxy попробовать)
    Ответ написан
    Комментировать
  • Зачем нужен Dependency Injection в Android разработке?

    artemgapchenko
    @artemgapchenko
    Начать неплохо бы с понимания того, что такое DI. Обратимся к википедии:

    Внедрение зависимости (англ. Dependency injection, DI) — процесс предоставления внешней зависимости программному компоненту.

    Если выражаться не канцеляритом, а обычным русским языком, то DI - это когда вы своему компоненту (например, классу) предоставляете нужные для него зависимости извне, а не создаете их сами в конструкторе, или через инициализацию в месте объявления поля. То есть не так:

    public class Api {
    	....
    	private final HttpClient client = new OkClient();
    }

    А, например, так:

    public class Api {
    	....
    	private final HttpClient client;
    
    	public Api(@NonNull HttpClient client) {
    		this.client = client;
    	}
    }


    И что нам это даёт?

    Ну, очевидно, нам теперь проще менять зависимости. Нужна вам другая реализация абстрактного класса HttpClient - взяли, и передали её через конструктор, или через метод-setter. В случае с первым куском кода, вам пришлось бы ещё и класс Api переписывать, что в случаях, отличных от тривиальных, может привести к ошибкам. Получается, что ваш класс теперь закрыт от изменений (смотрим Open/Closed Principle).

    Окей, а на практике-то какие бенефиты?

    Во-первых, вы теперь можете написать инициализацию вашей программы через конфигурационные файлы. Скажем, на старте будет читаться простенький текстовый файл, который определяет, какой httpclient использовать, какие настройки доступа к бд применять и так далее, и, исходя из этого, будут определяться зависимости.
    Во-вторых, вам теперь существенно проще писать тесты. Написали вы, скажем, какой-нибудь парсер, который принимает InputStream, содержащий в себе данные json-объекта, как-то хитро его парсит, и выдаёт вам объект вашей бизнес-модели. В приложении этот парсер будет принимать на вход реализацию InputStream'а, которая берёт данные из сети, а в тестах - реализацию, которая просто читает файл с диска (потому что тесты должны выполняться часто и быстро, и ваша задача в тесте - протестировать ваш парсер, а не скорость сетевого соединения).

    Вот, в общем-то, и всё. А Dagger - это просто библиотека, которая автоматизирует ручное внедрение зависимостей, равно как и другие DI-библиотеки.

    P.S. В некоторых случаях чрезмерное увлечение DI может привести к нежелательным эффектам, вроде чрезмерного усложнения кода, поэтому внедряйте аккуратно. Понимание приходит с опытом.
    Ответ написан
    Комментировать
  • Как разделить Android Activity или фрагменты и состояние приложения?

    VYakushev
    @VYakushev
    Разработчик Android в Nowtaxi
    Я использую для этого стейт-машину:
    1. Создаем обертку для стейт-машины, в которую есть возможность передать событие. ПРодумываем сохранение и восстановление состояния
    2. Используем Singleton или Dependecy Injection для получения ссылки на нашу обертку
    3. Прописываем состояния и события стейт-машины
    4. Создаем интерфейс для подписки на стейт-машину, в котором есть метод возвращающий фрагмент или интент
    5. Каждый фрагмент или активити наследуются от базового, который имплементирует интерфейс подписчика. В обработчики стартуем пришедший интент или фрагмент
    6. В самой активити и фраменте отправляем стейт-машине события
    Ответ написан
  • Как лучше писать if условия?

    mitaichik
    @mitaichik
    1. Согласен с тем что выходить нужно как можно быстрее. Поэтому лучше как-то так:
    if(foo != bar || foo < 1) {
      return false;
    }
    // логика
    return true;


    2. Деление условий должно быть осмысленно с точки зрения бизнес-логики. Если условие foo != bar || foo < 1 является целостным и неделимым с точки зрения бизнес логики, то лучше его не делить.

    Если же это 2 разных условия (две разных ситуции), просто скомпонованных в одно условие, то вполне допустимо их разделить для логического выделения (опять таки с точки зрения бизнес-логики). Например, если foo - кол-во товаров в заказе, a bar - кол-во товаров при котором дается скидка (не больше не меньше):

    // кол-во товара в корзине != кол-ву товара при котором делается скидка 
    if(foo != bar){
        return false;
    }
    
    // если корзина вообще пуста
    if(foo < 1){
      return false
    }
    
    // применение скидки к заказу
    
    return true;
    Ответ написан
    Комментировать
  • Как лучше писать if условия?

    gbg
    @gbg Куратор тега Программирование
    Любые ответы на любые вопросы
    Второе лучше, потому как в первом { можно { получить { миллиард { уровней { вложенности } } } } }
    Ответ написан
    6 комментариев
  • Как через приложение определить есть инет или нет?

    @sergiu3dmd
    public boolean isOnline() {
            ConnectivityManager cm =
                    (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            return netInfo != null && netInfo.isConnectedOrConnecting();
        }
    Ответ написан
    Комментировать