Дизайн для ошибок, сообщать о дефектах

Есть два вида исключений.

  • Ошибки - ожидаемые состояния, которые мы можем разработать для
    - например: устройство не подключено к Интернету
    - например: пользователь ввел неверные учетные данные
  • Дефекты - неожиданное состояние, что приложение не умеет обращаться. Это ошибки, которые разработчики не смогли учесть. Сообщите о них или, еще лучше, завершите работу приложения, чтобы увеличить шансы, что этот дефект не попадет в рабочую среду. Операторы журнала легко пропустить, когда ваш пользовательский интерфейс не работает тихо.

Создавайте ошибки, встраивая их в возвращаемые значения наших API (методов)

Наивный API

Давайте воспользуемся нашим NaiveApi!

Сюрприз! .login(credentials) вызвал исключение, потому что мы предоставили неправильные учетные данные. Как мы можем улучшить это?

Лучший API

Что такое LoginResponse? Он представляет все возможные результаты запроса на вход. Давайте копнем глубже:

Теперь использование становится:

Обработка различных типов ошибок

Давайте посмотрим, что на самом деле представляет собой объект Error.

Приложение могло:

  • попробуйте еще раз, когда устройство восстановит подключение
  • предложить пользователю ввести правильные учетные данные.

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

Разработчик передает error.handle() следующее:

  • 3 отдельные функции, способные обрабатывать каждый из 3 типов ошибок
  • Будет вызвана только функция, которая соответствует фактическому типу ошибки. Если ошибка является экземпляром invalidCredentials, то будет вызвана только его функция (первый параметр error.handle).

Статический метод расширения error.handle() также обеспечивает безопасность типов. На что это похоже?

Дополнительное преимущество: дополнительная устойчивость к добавлению новых реализаций Error реализаций.

Бонусные баллы: Запечатанные классы Котлина

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

Теперь использование становится:

Больше бонусных баллов: Rx

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

Заключение

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

Привет Пако Эстевесу, который заставил меня серьезно задуматься об этом.

Исходный код доступен на GitHub.

Поймайте разговор на Reddit

Часть 1: Api Design - Temporal Coupling

Подпишись на меня в Твиттере! @Zaktaccardi