我是编程的新手。我需要写一个检查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;
}
答案 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)
我认为你的场景没有神奇之处。您必须以完全分离的方式重新设计数据/执行流程/用例。