首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java:如何减少if(method1()&&method2 2()....&&method25())?

java:如何减少if(method1()&&method2 2()....&&method25())?
EN

Stack Overflow用户
提问于 2014-02-19 05:13:42
回答 6查看 88关注 0票数 0

我对编程有些新鲜感。我需要编写一个if条件来检查这25个方法,如果所有方法都返回true,那么只有控件进入if块。

所以我试着

代码语言:javascript
运行
复制
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;

}

还有别的办法吗?

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

代码语言:javascript
运行
复制
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*方法看起来像..。

代码语言:javascript
运行
复制
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;
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-02-19 05:55:58

有25个条件本身就是个坏兆头。他们已经有了一个分组的建议,我会去做的。如果你做不到,那就写点什么

代码语言:javascript
运行
复制
void allmightyCondition(....) {
    if (!method1()) return false;
    if (!method2()) return false;
    ...
    if (!method25()) return false;
    return true;
}

这使得它更易读。它还为注释留出了一些位置,并允许更容易地重新排序(这对于速度来说可能是有用的)。

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

票数 2
EN

Stack Overflow用户

发布于 2014-02-19 05:26:24

也许不是直接相关的,但也许你可以把25分成几个组呢?

代码语言:javascript
运行
复制
group1(){
   return method1() && method2...... method7();
}

..
...
..

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

}else{

}

这将使代码更容易阅读(只要您很好地命名group)。这当然是如果方法符合这种风格,不要强迫它。

要从另一个答案中盗取一个例子,这可以是一个组示例。

代码语言:javascript
运行
复制
IsUserValid(){
    return IsNameValid() && IsAddressValid() && IsPhoneNumberValid()..... 
}
票数 2
EN

Stack Overflow用户

发布于 2014-02-19 05:19:10

如果我必须在C中这样做,我可能会使用指向函数的指针数组,并在一个循环中对它们进行评估:

代码语言:javascript
运行
复制
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,不如从每个字符串构造一个对象,如果该字符串不符合其要求,则使用该构造函数抛出。然后你就会得到这样的结果:

代码语言:javascript
运行
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21871639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档