Как избежать дублирования в Java? - PullRequest
0 голосов
/ 02 октября 2018

У меня такая конструкция:

private Plan createPlan() {
  return new Plan(
        project(),
        "Plan Name", "PLANKEY")
        .description("Plan created from (enter repository url of your 
         plan)")
        .stages(
                new Stage("Stage 1")
                        .jobs(new Job("Build & run", "RUN")
                                .tasks(
                                        new ScriptTask().inlineBody("echo Hello!”))),

                new Stage("Stage 2”)
                        .jobs(new Job("Build & run", "RUN")
                                .tasks(
                                        new ScriptTask().inlineBody("echo Hello!”))),

                new Stage("Stage 3”)
                        .jobs(new Job("Build & run", "RUN")
                                .tasks(
                                        new ScriptTask().inlineBody("echo Hello!”))),

                new Stage("Stage 4”)
                        .jobs(new Job("Build & run", "RUN")
                                .tasks(
                                        new ScriptTask().inlineBody("echo Hello!”))),

);
}

Как избежать дублирования кода?Куски кода внутри «новой стадии» идентичны, с такими же параметрами, кроме названия новой стадии («Этап 1», «Этап 2», «Этап 3» ...).

Спасибо!

Ответы [ 5 ]

0 голосов
/ 02 октября 2018

Вы добавляете один и тот же объект 4 раза:

Job commonJob = new Job("Build & run", "RUN").tasks(
                     new ScriptTask().inlineBody("echo Hello!”));

Почему бы не присвоить его переменной и просто использовать вместо этого?

new Stage("Stage 1").jobs(commonJob),
new Stage("Stage 2").jobs(commonJob),
...

Что по-прежнему не идеально, потому что у вас естьStage создавать объекты "вручную".Если Plan#stages имеет подпись var-args Plan.stages(Stage ... stages), вы можете использовать for-loop.

Stage[] stages = new Stage[4]; 
for(int i = 0; i < stages.length; i ++) {
    stages[i] = new Stage("Stage " + (i + 1)).jobs(commonJob);
}

и позже new Plan().stages(stages);

Или вы можете сделать это даже функционально, если хотите использовать метод java-9 IntStream.interate:

new Plan().stages(
                  IntStream.iterate(1, i -> i < 5, i -> i + 1)
                            .mapToObj(i -> new Stage("Stage " + i).jobs(commonJob))
                           .toArray()
         );
0 голосов
/ 02 октября 2018

(Долгое и сложное решение (но оно пригодится вам позже)). Одним из решений может быть скрытие создания экземпляра с помощью шаблона проектирования Factory: https://www.youtube.com/watch?v=ub0DXaeV6hA

Обычно это решение, если вы нене хотите писать длинные установки классов.

(простое и быстрое решение): вы также можете просто создать метод CreateStage (String stageName), который принимает входные данные String, а именно имя рабочей области, ивозвращает новый созданный объект Stage:

public Stage CreateStage(String stageName){
    return new Stage(stageName)
                    .jobs(new Job("Build & run", "RUN")
                            .tasks(
                                    new ScriptTask().inlineBody("echo Hello!”)));
}

И просто вызывайте его для каждого этапа, который вы хотите в своей коллекции этапов.: -)

Дополнительные советы, Google: как избежать дублирования кода.

0 голосов
/ 02 октября 2018

Извлеките метод:

private Stage createStage(String name) {
    return new Stage(name)
                    .jobs(new Job("Build & run", "RUN")
                            .tasks(
                                    new ScriptTask().inlineBody("echo Hello!”))
}

и просто передайте имена этапов

...
.stages(createStage("Stage 1"), createStage("Stage 2"), createStage("Stage 3"), createStage("Stage 4"))
0 голосов
/ 02 октября 2018

Это предполагает, что функция stage принимает массив ступеней в качестве параметра.Создайте список этапов, затем преобразуйте его в массив и передайте его.

private Plan createPlan() {

  List<Stage> stagesList = new ArrayList<>();
  for(int i = 1; i < 5; i++) {
      stages.add(new Stage("Stage " + i)
                        .jobs(new Job("Build & run", "RUN")
                                .tasks(
                                        new ScriptTask().inlineBody("echo Hello!”)))
  } // end of for

  Stage[] stagesArray = new Stage[stagesList];
  stagesArray = stagesList.toArray(stagesArray);

  return new Plan(
        project(),
        "Plan Name", "PLANKEY")
        .description("Plan created from (enter repository url of your 
         plan)")
        .stages(stagesArray);
} // end of createPlan
0 голосов
/ 02 октября 2018

Будьте осторожны при попытке чрезмерной оптимизации вашего кода.Если план состоит из четырех этапов, вам необходимо добавить четыре этапа.Вы можете добавить цикл, но это подразумевает, что у вас есть некоторый источник значений для вашего цикла, такой как какой-то список.Лично я буду придерживаться того, что у вас есть, пока ваши требования не приведут вас к рефакторингу.

...