如何避免Java中的重复?

如何避免Java中的重复?,java,variables,duplicates,return,code-duplication,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")

我有这样一个结构:

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”)外,其他参数都相同


谢谢大家!

要小心过度优化代码。如果计划有四个阶段,则需要添加这四个阶段。您可以添加一个循环,但这意味着您有一些循环值的来源,例如某种类型的列表。就我个人而言,我会坚持你所拥有的,直到你的需求导致你进行重构。

小心不要试图过度优化你的代码。如果计划有四个阶段,则需要添加这四个阶段。您可以添加一个循环,但这意味着您有一些循环值的来源,例如某种类型的列表。就我个人而言,我会坚持你所拥有的,直到你的需求引导你进行重构。

提取一个方法:

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"))
提取一种方法:

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

这假设函数stages将stages数组作为参数。创建一个阶段列表,然后将其转换为数组并传入

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
private Plan createPlan(){
List stagesList=new ArrayList();
对于(int i=1;i<5;i++){
阶段。添加(新阶段(“阶段”+i)
.jobs(新作业(“构建和运行”、“运行”)
.任务(
新建ScriptTask().inlineBody(“echo Hello!”))
}//结束
阶段[]阶段阵列=新阶段[阶段列表];
stagesArray=stagesList.toArray(stagesArray);
返回新计划(
项目(),
“计划名称”、“PLANKEY”)
.description(“从中创建的计划(输入您的
"计划")
.阶段(阶段阵列);
}//createPlan结束

这假设函数stages采用一个stages数组作为参数。创建一个stages列表,然后转换为数组并传入

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
private Plan createPlan(){
List stagesList=new ArrayList();
对于(int i=1;i<5;i++){
阶段。添加(新阶段(“阶段”+i)
.jobs(新作业(“构建和运行”、“运行”)
.任务(
新建ScriptTask().inlineBody(“echo Hello!”))
}//结束
阶段[]阶段阵列=新阶段[阶段列表];
stagesArray=stagesList.toArray(stagesArray);
返回新计划(
项目(),
“计划名称”、“PLANKEY”)
.description(“从中创建的计划(输入您的
"计划")
.阶段(阶段阵列);
}//createPlan结束
(这是一个漫长而艰难的解决方案(但以后会让您受益)) 一种解决方案是使用Factory设计模式隐藏实例创建:

如果您不想编写长类安装,这通常是解决方案

(简单快捷的解决方案): 您还可以创建一个名为CreateStage(String stageName)的方法,该方法接受字符串输入,即阶段名称,并返回一个新创建的阶段对象:

public Stage CreateStage(String stageName){
    return new Stage(stageName)
                    .jobs(new Job("Build & run", "RUN")
                            .tasks(
                                    new ScriptTask().inlineBody("echo Hello!”)));
}
只需为您的stages系列中想要的每个阶段调用它即可。:-)

关于更多提示,谷歌:如何避免代码重复。

(这是一个漫长而艰难的解决方案(但以后会让你受益)) 一种解决方案是使用Factory设计模式隐藏实例创建:

如果您不想编写长类安装,这通常是解决方案

(简单快捷的解决方案): 您还可以创建一个名为CreateStage(String stageName)的方法,该方法接受字符串输入,即阶段名称,并返回一个新创建的阶段对象:

public Stage CreateStage(String stageName){
    return new Stage(stageName)
                    .jobs(new Job("Build & run", "RUN")
                            .tasks(
                                    new ScriptTask().inlineBody("echo Hello!”)));
}
只需为您的stages系列中想要的每个阶段调用它即可。:-)


有关更多提示,谷歌:如何避免代码重复。

您将同一对象添加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循环

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

将同一对象添加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循环

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

打个循环怎么样?我还建议不要向构造函数传递太多的参数。这要视情况而定。您真的需要这些对象成为独立的实例吗?如果这些是不可变的数据持有者,您可能只需要实例化其中一个,然后可以将引用传递给该对象四次。如果stages将数组或集合作为输入,则可以在方法调用之外使用循环创建这些数据结构。缺少一些信息。我们不知道
阶段的签名。它是否总是接收4个参数?您可以传递数组或列表吗?for循环如何?我还建议不要向构造函数传递太多的参数。这要视情况而定。您真的需要这些对象成为独立的实例吗?如果这些是不可变的数据持有者,您可能只需要实例化其中一个,然后可以将引用传递给该对象四次。如果stages将数组或集合作为输入,则可以在方法调用之外使用循环创建这些数据结构。缺少一些信息。我们不知道
阶段的签名。它是否总是接收4个参数?您可以传递数组或列表吗?