我有两种类似的方法,它们具有重复的条件和重复的else块。我想重构它以共享相同的逻辑和其他块,但调用不同的方法。我该怎么办?
public void entryPoint1(...)
{
if(nullCheckStuff) {}
method1(stuff);
method2(stuff);
} else {
//log error
}
}
public void entryPoint2(...)
{
if(nullCheckStuff) {
method2(stuff);
} else {
//log error
}
}
答案 0 :(得分:3)
如果您使用Java 8或更高版本,则可能的解决方案是使用lambda。 您可以使用通用逻辑定义内部函数,该逻辑以Runnable作为参数:
private void commonLogic(Runnable action)
{
if(nullCheckStuff) {
action.run();
} else {
//log error
}
}
然后您的原始功能看起来就像:
public void entryPoint1()
{
commonLogic(() -> { method1(); method2()});
}
public void entryPoint2()
{
commonLogic(() -> method2());
}
您可能还需要向commonLogic()
函数添加更多参数,以传递nullCheckStuff
表达式和错误处理块所需的数据。
答案 1 :(得分:0)
因此您的代码如下:
public void entryPoint1(...)
{
if(nullCheckStuff) {}
method1(stuff);
method2(stuff);
} else {
//log error
}
}
public void entryPoint2(...)
{
if(nullCheckStuff) {
method2(stuff);
} else {
//log error
}
}
您必须取出if块并将其放在另一个函数中,假设checkNullStuff()
:
public bool checkNullStuff(<object, string, whatever> condition, int entrypoint) {
bool everythingOk = true;
//checks if null
if(condition) {
return !everythingOk;
}
//executes common methods
method1(stuff);
//if not empty check what to do
switch(entrypoint) {
case 1:
method2(stuff);
break;
case 2:
method3(stuff);
break;
default:
everythingOk = false;
}
return everythingOk;
}
为什么我使用开关而不是if呢,如果您的入口点增加并且需要执行更常用的方法 和入口点功能:
public void entryPoint1(...)
{
// here we check if went wrong, otherwise the functions were executed
if(!checkNullStuff(nullCheckStuff, 1)) {}
// code for when nullCheckStuff was not what we exepected
}
}
答案 2 :(得分:0)
如果您的方法还没有太多参数,则可以采用这种方式进行重构:
public void commonEntryPoint(..., boolean m1Condition) {
if(nullCheckStuff) {
if (m1Condition) {
method1(stuff);
}
method2(stuff);
} else {
//log error
}
}
干杯!