簡體   English   中英

降低此方法的布爾表達式復雜度?

[英]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)

然后此方法按書面方式工作。

我建議閱讀有關布爾代數和簡化布爾表達式的文章。 有多種實現方式,無論是卡諾圖還是簡單地使用代數定律。

您可以檢查一下, 將使您對它的內容有一個基本的了解。 關於您的代碼,我建議記下一個真值表,並為您的方法返回true時計算真值。 從那里獲取當前方程式,並盡可能簡化它


還給您一個簡化的示例: 在此處輸入圖片說明

A XOR B = A&!B OR!A&B

如果是右側的簡化表達,則為左側


有關絕對可以幫助您的法律列表,請查看布爾代數定律

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM