2014-02-19 24 views
0

我是一些编程新手。我需要编写一个if条件来检查25个方法,如果所有方法都返回true,那么只有控制进入if块。java:如何减少if(method1()&& method2().... && method25())?

,所以我试图像

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; 

} 

是否有任何其他方式做到这一点?

编辑: IM张贴在这里我的实际代码.....

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; 
} 
+7

这似乎是非常糟糕的设计。 –

+2

在你遇到的问题上展示更多的背景,也许有更好的方法,但我们无法读懂头脑。 – Pedantic

+0

布尔方法有多复杂?还是他们是你描述的? – xlm

回答

2

带25分的条件本身就是一个不好的迹象。已经有一个建议来分组他们,我会为此而努力。如果你不能,那就写点类似

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

这使得它更具可读性。它也留下了一些评论的地方,并允许更容易的条件重新排序(这可能对速度有用)。我不认为他们是值得的。如果你确实需要一个循环,你可以创建Predicate的25个实现并使用它们。没有JDK8,它有点冗长。无论如何,在你的例子中没有任何意义,只有当你真的需要它时才使用它。

0

如果唯一的东西你的方法这就是说if (valid) { return true } else return false;那么你可以使用你的大if声明中的条件(“if valid1 & & valid2 & & ...... & & valid25" )

否则,你不能真正减少是AND关系结合在一起(你使用& &)针对连续的条款。任何你能想到的捷径都会解决你已有的问题。

+0

我的回答中没有AND子句 –

+0

您正在使用&&将“AND”子句放在一起。编辑我的答案,使其更清楚。 –

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]

+0

c标记现在已被删除 –

+0

+1完全是我处理这个问题的方式(在*之后,我首先抨击了设计它的那个人)。我没有想到按位分配;不确定这是故意的。 – WhozCraig

1

难道让你的背景下任何意义亚群的测试?例如使5个功能,一个覆盖测试1-5,另一个用于6-10等不需要为5确切单位,但也许isNameValid()isAddressValid()isPasswordValid()

+0

酷炫,同一时间相同的想法 –

2

也许没有直接关系,但也许你可以将25个结构分组?

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

.. 
... 
.. 

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

}else{ 

} 

这使代码更易于阅读(只要你命名group一报还一,这是当然的,如果方法适合这种风格,不要强迫它。

招摇从一个不同的答案偷例如,这可以是一组例子

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

+1为公然偷窃,这是一个伟大的程序员的标志。 – user949300

0

我认为你的方案没有什么魔力。您必须以完全解耦的方式重新设计您的数据/执行流程/用例。