带有checkcustomer的“if”块在这个类的其他方法中使用完全正确,因此对于相同的检查有很多代码发布。但我也不能直接将这种检查方法提取到一个方法,因为它们有返回值。
重构此代码的一些好主意?我刚刚修改了这段代码以简化这里,所以不要抓住这段代码中的小问题(如果有的话),基本上问题是如何将一段代码提取到一个方法(因为它在其他方法上被公开)当有当前方法中的许多回报。
public Details getCustomerDetails(){
if(checkifcustomerhasnoboobs){
..worry about it..
return new Details("no");
}
if(checkifcustomerplaytenniswell){
..do find a tennis teacher
return new Details("no cantplay");
}
//...ok now if customer passed the test, now do the some real stuff
//
//
CustomerDetails details= getCustomerDetailsFromSomewhere();
return details;
}
答案 0 :(得分:2)
这个怎么样?
public Result checkSomethings() {
if ( checksomething1 ) {
return ResultCheckSomething1;
}
if ( checksomething2 ) {
return ResultCheckSomething2;
}
return ResultCheckNone;
}
public Details getCustomerDetails(){
Result result = checkSomethings();
switch ( result ) {
case ResultCheckSomething1:
return new Details("message1");
case ResultCheckSomething2:
return new Details("message2");
default:
return getCustomerDetailsFromSomewhere();
}
}
Result...
代码将在枚举中。
答案 1 :(得分:1)
也许是这样的?
public Details getCustomerDetails(){
boolean isError = checksomething1() || checksomething2();
String message = checksomething1() ? "message1" : "message2";
return isError ? new Details(message) : getCustomerDetailsFromSomewhere();
}
如果您尝试避免两次通话检查功能,请保持结果
public Details getCustomerDetails(){
boolean check1 = checksomething1();
boolean check2 = checksomething2();
String message = check1 ? "message1" : "message2";
return (check1 || check2) ? new Details(message) : getCustomerDetailsFromSomewhere();
}
答案 2 :(得分:1)
将带有赋值的返回值替换为结果变量,该变量在第一次赋值之前保持为null。如果用于更改结果的条件为false,则每个块都可以由返回null的函数替换。
正如herman的评论所指出的,只有当null不是其中一个调用的可能结果时,这才有效。
public Details getCustomerDetails(){
Details result = null;
if(checksomething1){
..error
result = new Details("message1");
}
if(result == null) {
if(checksomething2){
..error
result = new Details("message2");
}
if(result == null){
result = getCustomerDetailsFromSomewhere();
}
return result;
}
答案 3 :(得分:0)
我会这样做:
public Details getCustomerDetails(){
Details invalidDetails = checkForInvalidCustomer();
if (invalidDetails !=null) {
return (invalidDetails);
}
//...ok now if customer passed the test, now do the some real stuff
//
//
CustomerDetails details= getCustomerDetailsFromSomewhere();
return details;
}
public Details checkForInvalidCustomer() {
if(checkifcustomerhasnoboobs){
..worry about it..
return new Details("no");
}
if(checkifcustomerplaytenniswell){
..do find a tennis teacher
return new Details("no cantplay");
}
// nulls means valid customer
return (null);
}
基本上,对于您的具体示例,我使用null,以便我可以区分没有条件匹配的情况,与任一条件匹配。这样我可以使用单个if语句。现在,如果你想返回null,你需要稍微修改这个解决方案,也许使用一些常量来标记大小写,而不是使用null。
答案 4 :(得分:0)
使用Java 8,您可以重构为返回Optional<...>
值的方法。
像return x;
这样的语句将被return Optional.of(x)
替换(假设x不能为空)。最后的默认return语句为return Optional.empty()
。
然后,您可以使用return optional.orElseGet(() -> ...))
计算未达到原始返回语句的情况的值。