我们正在将对象持久存储在数据库中,但是在需要检查少数条件之前,我正在使用if-else来执行这些操作,这是消除if-else语句的最佳方法。我们还在每个语句中设置一个映射的响应对象。
此外,将来我们必须在创建或更新之前检查其他条件。
Callable<Response> callableObj = () -> {
if(isNew){
if(checkCreatePermission()){
if(checkDuplicate()) {
return foundObejct();
} else {
persistNewObject();
}
} else {
throw new Exception();
}
} else {
if(checkUpdatePermission()){
udapteObject();
} else {
throw new Exception();
}
}
};
答案 0 :(得分:2)
您可以使用一些早期的回报/投掷。使代码更具可读性。
if(isNew){
if(!checkCreatePermission()){
throw new Exception();
}
if (checkDuplicate()) {
return foundObejct();
}
persistNewObject();
} else {
if(!checkUpdatePermission()){
throw new Exception();
}
udapteObject();
}
答案 1 :(得分:1)
消除许多if-else条件的最佳方法...
一种更好的代码的方法是反转if条件,然后将条件代码分解为单独的方法。
下面的代码在功能上与您编写的代码等效。
public ... originalMethod() {
if(isNew) handleNewObject();
else handleExistingObject();
}
private ... handleExistingObject() {
if (!checkUpdatePermission()) throw new Exception();
updateObject();
}
private ... handleNewObject() {
if (!checkCreatePermission()) throw new Exception();
if (checkDuplicate()) return foundObject();
persistNewObject();
//... other steps.
}
答案 2 :(得分:0)
我建议将其分解为几种方法。不知道我是否能得到您所需的东西,但是可能是
createOrUpdate() {
if(isNew()){
create();
} else {
update();
}
}
create() {
if(checkCreatePermission()){
if(checkDuplicate()) {
return foundObejct();
} else {
persistNewObject();
}
} else {
throw new Exception();
}
}
update() {
if(checkCreatePermission()){
udapteObject();
} else {
throw new Exception();
}
}
答案 3 :(得分:0)
您可以从CoR design pattern中获得启发。在下面的代码中,我假设要运行Callable
,请调用其apply()
方法:
Callable<Response> cError = () -> { throw new Exception(); };
Callable<Response> cUpdateObject = () ->
!isNew && checkUpdatePermission() ? updateObject() : cError.apply();
Callable<Response> cPersistNewObject = () ->
isNew && checkCreatePermission() && !checkDuplicate() ? persistNewObject() : cUpdateObject.apply();
Callable<Response> callableObj = () ->
isNew && checkCreatePermission() && checkDuplicate() ? foundObject() : cPersistNewObject.apply();
通过这种方法,很容易看到导致每个响应的条件。
P / S:您可以在必要时将对checkCreatePermission()
,checkUpdatePermission()
和checkDuplicate()
的呼叫缓存。