#NullSafety #Rave #Uber
How Uber Engineering Verifies Data at Runtime with the Annotations You Already UseСталкивались ли вы с проблемой, что данные, присылаемые сервером, отличается от ожидаемых вами в описанных вами моделей (классов)? Например, поле которое у вас объявлено как
@NonNull
вдруг пришло
null
? Или значение одного из полей моделей должно быть в пределах от
0
до
1
, но сервер прислал
1.5
?
Не будьте уверены в своем сервере на 100%, так как может что-то поменяться в любой момент и вы начнете ловить странные баги из-за изменений возможных значений в полях. Как итог - трата большого количества времени на поиск проблемы.
Для того чтобы избежать такого рода проблем, в Uber разработали библиотеку
Rave. Она генерирует класс, который на основе аннотаций модели, позволяет проверять, что все данные соответствуют вашим ожиданиям, а в противном случае выбрасывает исключение.
Поддерживаютс
я следующие аннотации:
👉
@NonNull
и
@Nullable
👉
TypeDef аннотации:
@StringDef
,
@IntDef
и
@LongDef
👉
Аннотации ограничений на значения:
@IntRange
,
@FloatRange
,
@Size
и др.
👉 Собственные аннотации
@MustBeFalse и
@MustBeTrue, которыми могут быть аннотированы методы, проверяющие более сложные условия для данных внутри модели.
Валидация кода выглядет следующим образом:
void validateMyModel(SimpleModel myModel) {
try {
Rave.getInstance().validate(myModel);
} catch (UnsupportedObjectException e) {
// handle unsupported error case.
} catch (RaveException e) {
// handle rave validation error.
}
}
Rave эффективна для интеграции с библиотеками, которые предоставляют сериализованые данные (например JSON), а вы их на стороне клиента парсите в объекты языка. Яркий пример REST сервис, с которым вся работа в Android приложения осуществляется на основе библиотеки
Retrofit, причем уже есть готовый конвертер -
RaveConverterFactory.