java:我怎么能减少if(method1()&& method2()....&& method25())?

时间:2014-02-19 05:13:43

标签: java performance optimization if-statement

我是编程的新手。我需要写一个检查25个方法的if条件,如果所有方法都返回true,那么只有控制进入if块。

所以我尝试了

if(meth1()&&meth2()&&meth3()&&meth4() ....... meth25()){

 ..... .....
}
else {
print("in else");
}

boolean meth1(){
    if (valid){
        return true;
    }
    else return false;

}



boolean meth2(){
    if (valid){
        return true;
    }
    else return false;

}

...
...
...

boolean meth25(){
    if (valid){
        return true;
    }
    else return false;

}

还有其他办法吗?

编辑: 我在这里发布我的实际代码.....

if(v.isValidRecordType(recordType)&& v.isValidClientReferance(clientReferance)&&     v.isValidInitials(initials) && v.isValidPrefixes(prefixes)&& v.isValidLastname(lastname)&& v.isValidGender(gender)&& v.isValidDateOfBirth(dateOfBirth)
                    && v.isValidStreetName(streetName)&& v.isValidHouseNumber(houseNumber)&& v.isValidHNExtension(hnExtension)&& v.isValidPostalCode(postalCode)&& v.isValidTownName(townName)&& v.isValidTelephone1(telephone1)&& v.isValidTelephone2(telephone2)&& v.isValidEmail(email)

                    && v.isValidPrincipalDebit(principalDebit)&& v.isValidCollectionFee(collectionFee)&& v.isValidAdditionalFees(additionalFees)&& v.isValidTotalDebit(totalDebit)&& v.isValidDateOfInvoice(dateOfInvoice)&& v.isValidActivationDateCollectionFile(activationDateCollectionFile)
                    && v.isValidBranch(branch)&& v.isValidKnownOnAddress(knownOnAddress)&& v.isValidFilters(filters))
                {
                System.out.println("processed");
                continue;
                }
            else{
                System.out.println("in the record having clientReferance :"+clientReferance +"\n");
            }

和isValid * * *方法看起来像..

public boolean isValidClientReferance(String ClientReferance){
String pattern= "^[a-zA-Z0-9]*";
    if(ClientReferance.matches(pattern) && mandatory(ClientReferance) ){
        return true;
    }
    System.out.println("Invalid ClientReferance");
    return false;
}

6 个答案:

答案 0 :(得分:2)

也许没有直接相关但也许你可以将25个组成小组?

group1(){
   return method1() && method2...... method7();
}

..
...
..

if (group1() && group2() && group3()){

}else{

}

这会使代码更容易阅读(只要你将group命名为。这当然是方法适合这种风格,不要强迫它。

从另一个答案中公然窃取一个例子,这可以是一个小组的例子

IsUserValid(){
    return IsNameValid() && IsAddressValid() && IsPhoneNumberValid()..... 
}

答案 1 :(得分:2)

拥有25个条件本身就是一个不好的迹象。已经有人建议将它们分组,我会去做。如果你做不到,那就写点像

void allmightyCondition(....) {
    if (!method1()) return false;
    if (!method2()) return false;
    ...
    if (!method25()) return false;
    return true;
}

这使它更具可读性。它还留下了一些注释的位置,并允许更容易的条件重新排序(这可能对速度有用)。

缺乏函数指针的Java是一件相当好的事情(我不认为它们是值得的)。如果你真的需要一个循环,你可以创建25个Predicate的实现并使用它们。没有JDK8,它有点冗长。无论如何,在你的例子中没有任何意义,只有在你真正需要时才使用它。

答案 2 :(得分:1)

如果我必须在C中执行此操作,我可能会使用指向函数的指针数组,并在循环中对它们进行评估:

typedef bool (*func)();

func f[] = {meth1, meth2, meth3, /* ... */, meth25};

bool all_good = true;

for i=0; i<25 && all_good; i++)
    all_good &= f[i]();

if (all_good)
    // ...
else
    // ...

根据编辑过的问题,可能值得考虑另一种可能性。您可以根据每个字符串构造一个对象,而不是将其构造为if,如果字符串与其要求不匹配,则抛出该构造函数。然后你会得到类似的东西:

try { 
    ClientReference ref = new ClientReference(clientReference);
    Initial i = new Initial(initials);
    // and so on for 23 more...
}
catch(bad_input) {
    System.out.println("in the record having clientReferance :"+clientReferance +"\n");
}

显然,这些构造函数中的每一个都会调用(或包含)代码来验证有效性,如果输入不符合该类型的要求,则抛出异常。

[暂且不说:reference不包含a。]

答案 3 :(得分:1)

在您的上下文中对测试进行分组是否有意义?例如制作5个函数,一个用于覆盖测试1-5,另一个用于6-10等。不需要精确单位为5,但可能是isNameValid()isAddressValid()isPasswordValid()

答案 4 :(得分:0)

如果您的方法只做if (valid) { return true } else return false;,那么您可以在大if语句中使用条件(“如果有效1&amp;&amp; valid2&amp;&amp; ...&amp; ;&amp; valid25“)

否则,您无法真正减少AND'在一起的连续子句(您正在使用&amp;&amp;)。您可以提出的任何捷径都可以解决您已有的问题。

答案 5 :(得分:0)

我认为你的场景没有神奇之处。您必须以完全分离的方式重新设计数据/执行流程/用例。