Java, повторный логический блок с разными объектами, код очистки

66
5

Я хочу очистить код, который заставляет мою голову болеть:

    activityStandardAttributeValue
.setProduct((standardAttributeForm != null && standardAttributeForm
.getProduct() != null) ? standardAttributeForm
.getProduct()
: (groupedStandardAttributeForm != null ? groupedStandardAttributeForm
.getProduct() : null));
activityStandardAttributeValue
.setProject((standardAttributeForm != null && standardAttributeForm
.getProject() != null) ? standardAttributeForm
.getProject()
: (groupedStandardAttributeForm != null ? groupedStandardAttributeForm
.getProject() : null));

Я мог бы просто изменить его на более легкую для чтения форму:

    Product product = null;
if(standardAttributeForm != null && standardAttributeForm.getProduct() != null) {
product = standardAttributeForm.getProduct();
} else if (groupedStandardAttributeForm != null && groupedStandardAttributeForm.getProduct() != null) {
product = groupedStandardAttributeForm.getProduct();
}
activityStandardAttributeValue.setProduct(product);

Project project = null;
if(standardAttributeForm != null && standardAttributeForm.getProduct() != null) {
project = standardAttributeForm.getProject();
} else if (groupedStandardAttributeForm != null && groupedStandardAttributeForm.getProject() != null) {
project = groupedStandardAttributeForm.getProject();
}

Проблема в том, что эта же основная логика повторяется примерно 16 раз для разных свойств, и на самом деле она не намного чище. Я хотел бы создать общий способ сделать это, не повторяя одну и ту же основную логику. Сложная часть состоит в том, что standartAtributeForm или groupedStandardAttributeForm может быть нулевым.

Любая помощь приветствуется.

спросил(а) 2020-04-04T00:18:05+03:00 3 месяца назад
1
Решение
77

На самом деле это не ответ, но он слишком велик, чтобы опубликовать комментарий (и полагается на форматирование):

Простое использование форматирования упрощает чтение. Вот ваш код, пройденный через google-java-формат:

activityStandardAttributeValue.setProduct(
(standardAttributeForm != null && standardAttributeForm.getProduct() != null)
? standardAttributeForm.getProduct()
: (groupedStandardAttributeForm != null
? groupedStandardAttributeForm.getProduct()
: null));
activityStandardAttributeValue.setProject(
(standardAttributeForm != null && standardAttributeForm.getProject() != null)
? standardAttributeForm.getProject()
: (groupedStandardAttributeForm != null
? groupedStandardAttributeForm.getProject()
: null));

Я полагаю, вы могли бы сделать что-то вроде этого:

<T> getThing(Function<Form, T> extractor, T... forms) {
for (T form : forms) {
if (form != null) {
T thing = extractor.apply(form);
if (thing != null) return thing;
}
}
return null;
}

Затем:

activityStandardAttributeValue.setProduct(
getThing(Form::getProduct, standardAttributeForm, groupedStandardAttributeForm));
activityStandardAttributeValue.setProject(
getThing(Form::getProject, standardAttributeForm, groupedStandardAttributeForm));

ответил(а) 2020-04-04T00:32:32.663214+03:00 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема