如何避免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个参数?您可以传递数组或列表吗?