Передача частично завершенных экземпляров компоновщика - PullRequest
0 голосов
/ 07 января 2019

Допустимо ли передавать экземпляры компоновщика из одного объекта в другой для добавления различных значений поля?

В приведенном ниже примере детали для создания экземпляра VacationPlan должны быть получены из нескольких мест (DateAdder и PlaceAdder). Организатор создает экземпляр компоновщика и передает его в качестве аргументов этим экземплярам «appender» и, наконец, выполняет вызов build ().

Пример:

public class Organizer {

        private final DateAdder dateAdder;
        private final PlaceAdder placeAdder;
        private final VacationProviderSearch vacationProviderSearch;

        public void organizeVacation() {
            VacationPlan.Builder vacationPlanBuilder = VacationPlan.newBuilder();
            vacationPlanBuilder = dateAdder.addDate(vacationPlanBuilder);
            vacationPlanBuilder = placeAdder.addPlace(vacationPlanBuilder);
            VacationPlan vacationPlan = vacationPlanBuilder.build();
            List<Provider> providers = vacationProviderSearch.getProviders(vacationPlan);
            // use providers to get the best vacation provider
        }

    }

Мы обсуждали этот подход на работе, и я утверждал, что этим индивидуальным дополнителям лучше принимать экземпляр не-строителя в качестве аргументов и возвращать соответствующий вывод в виде POJO.

Примерно так:

public void organizeVacation() {
    VacationDateRange dateRange = dateProvider.getDateRange(userRequestJson);
    String location = locationProvider.getLocation(userRequestJson);
    VacationPlan vacationPlan = vacationPlanBuilder.newBuilder()
            .startDate(dateRange.getStartDate())
            .endDate(dateRange.getEndDate())
            .location(location)
            .build();
    List<Provider> providers = vacationProviderSearch.getProviders(vacationPlan);
    // use providers to get the best vacation provider
}

Это гарантирует, что в системе не будет изменчивых экземпляров. Какой из этих подходов лучше?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Я бы предложил вам сначала добавить интерфейс Adder, который будет реализован DateAdder и PlaceAdder. Этот интерфейс Adder может иметь один метод с именем getData().

Создайте объект List of Adder в Организаторе, передав его в конструктор или другим способом.

Создайте метод в VacationPlan.Builder с именем withAdder(), который будет принимать Adder в качестве аргумента и считывать его данные для обновления объекта построителя.

Внутри organizeVacation() метода, переберите список Adder и вызовите withAdder() метод VacationPlan.Builder, передав Adder этому методу. Внутри withAdder() метода вы можете вызвать метод интерфейса Adder для получения данных Adder.

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

0 голосов
/ 08 января 2019

Второй подход более понятен, поскольку устраняет ненужную связь поставщиков данных / местоположения с компоновщиком или типом VacationPlan. Это также облегчает модульное тестирование провайдеров (тестирование в первом подходе потребует выставления геттеров на компоновщике или насмешки над компоновщиком, ни один из которых не является предпочтительным).

...