[英]Reduce The Boolean Expression Complexity of this method?
此isValid()方法最多可以設置6個屬性以進行驗證。 如果未設置特定屬性,則無需驗證。 邏輯似乎按照我希望的方式工作。 如何降低此方法的布爾表達式復雜度?
import java.util.ArrayList;
import java.util.List;
public class Valid {
private int foo;
private int bar;
private int foobar;
private String foofoo;
private String barbar;
private String foobarfoobar;
private int myfoo;
private int mybar;
private int myfoobar;
private String myfoofoo;
private List<String> mybarbarlist = new ArrayList<String>();
private String myfoobarfoobar;
private boolean validate;
public boolean isValid() {
validate = false;
if ((((foo > 0) && (foo == myfoo)) || (foo == 0))
&& (((bar > 0) && (bar == mybar)) || (bar == 0))
&& (((foobar > 0) && (foobar == myfoobar)) || (foobar == 0))
&& (((foofoo != null) && (foofoo.equals(myfoofoo))) || (foofoo == null))
&& (((barbar != null) && (mybarbarlist.contains(barbar))) || (barbar == null))
&& (((foobarfoobar != null) && (foobarfoobar
.equals(myfoobarfoobar))) || (foobarfoobar == null)))
validate = true;
return validate;
}
public static void main(String[] args) {
Valid valid = new Valid();
// valid.foo = 1;
// valid.bar = 1;
// valid.foobar = 1;
// valid.foofoo = "1";
// valid.barbar = "1";
// valid.foobarfoobar = "1";
// valid.myfoo = 1;
// valid.mybar = 1;
// valid.myfoobar = 1;
// valid.myfoofoo = "1";
// valid.mybarbarlist.add("1");
// valid.myfoobarfoobar = "1";
System.out.println(valid.isValid());
}
}
首先,給每個子表達式賦予有意義的名稱,然后將結果分配給變量,然后在變量之間進行&&檢查。 這將大大提高可讀性。
而且您的條件似乎都具有以下形式
(X != null && X == value) || X == null
使用短路評估可以簡化
X == null || X == value
因為如果X == null
true,那么它不需要檢查右側,或者如果X == null
false,並且它需要檢查右側,那么您已經知道其不為null,因此您不需要檢查在右側的表達式中為null。
將兩者結合起來,您將獲得如下內容:
public boolean isValid() {
validate = false;
boolean fooCond = (foo == 0) || (foo == myfoo);
boolean barCond = (bar == 0) || (bar == mybar);
boolean foobarCond = (foobar == 0) || (foobar == myfoobar);
boolean foofooCond = (foofoo == null) || foofoo.equals(myfoofoo);
boolean barbarCond = (barbar == null) || mybarbarlist.contains(barbar);
boolean foobarfoobarCond = (foobarfoobar == null) || foobarfoobar.equals(myfoobarfoobar);
if (fooCond
&& barCond
&& foobarCond
&& foofooCond;
&& barbarCond
&& foobarfoobarCond) {
validate = true;
}
return validate;
}
編輯
這並不完全為你的表情工作,你正在檢查
((foo > 0) && (foo == myfoo)) || (foo == 0)
因為如果foo < 0
則返回false。 如果真的
((foo > 0) && (foo == myfoo)) || (foo <= 0)
然后此方法按書面方式工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.