如何避免Java中的重复项?

时间:2018-10-02 14:25:03

标签: java variables duplicates return code-duplication

我有这样的构造:

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!”))),

);
}

如何避免重复代码?除了新阶段的名称(“第一阶段”,“第二阶段”,“第三阶段” ...)外,“新阶段”中的代码段是相同的,具有相同的参数。

谢谢!

5 个答案:

答案 0 :(得分:1)

提取方法:

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"))

答案 1 :(得分:1)

(漫长而艰难的解决方案(但以后会为您带来好处)) 一种解决方案是使用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!”)));
}

只需在您的stage集合中为每个阶段调用它即可。 :-)

有关更多提示,请参阅Google:如何避免代码重复。

答案 2 :(得分:0)

在尝试过度优化代码时要小心。如果计划有四个阶段,那么您将需要添加四个阶段。您可以添加一个循环,但这意味着您有一些循环值的来源,例如某种列表。就个人而言,我会坚持使用您拥有的东西,直到您的要求导致您重构为止。

答案 3 :(得分:0)

这假定功能阶段将阶段数组作为参数。创建阶段列表,然后转换为数组并将其传递。

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

答案 4 :(得分:0)

您将同一对象添加4次:

idDataStore.lookupSegments(id)

为什么不将其分配给变量,而只是使用它呢?

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具有var-args签名Plan#stages,则可以使用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