1

既に存在する可能性が高いデザイン パターンを見つけるために (スタック オーバーフローまたは Google の) 適切な質問をするのに苦労しています。機能するソリューションはありますが、複雑すぎるようです。答えを探す場所、または同様の問題の良い例についてのヘルプを探しています。たとえば、クエリで複数の式を処理する GUI のように。

問題を説明する試みは次のとおりです。

最終的に解決される問題は、複数の式と複数の論理演算の処理であり、db から式を読み取ることによってそれを行います。

左辺、演算子、右辺を持つ式を定義します。あなたが声明で見るように:

(a==b)

したがって、複数の式は次のようになります。

((a==b) && (c==d))

あるいは

(((a==b) && (c==d)) || (e==f))

左、演算子、右をデータベースに簡単に保存できます。

EXPID   LEFTID  RIGHTID LEFT    OPERATOR    RIGHT
1                       'STATE' ==          'NH'
2                       'TYPE'  ==          'FUEL'
3       1       2               &&

これは次のように読み戻されます

((STATE==NH) && (TYPE==FUEL))

完全。ただし、すぐに複雑になります。たとえば、次のとおりです。

(ZIPCODE=='84770') AND (DEALER==NULL) AND (CAR_MODEL=='GTI') AND (CAR_BRAND=='VW') AND (LEGAL_OWNER==329778) AND (CAR_OWNER==459) AND ((STATE==UT) || (STATE==UT))

次のようなクレイジーなものが必要になります

EXPID   LEFTID  RIGHTID LEFT        OPERATOR    RIGHT
1                       ZIP         ==          84770
2                       DEALER      ==          NULL
3                       CAR_MODEL   ==          VW
4                       CAR_BRAND   ==          GTI
5                       STATE       ==          UT
6                       STATE       ==          NH
7       1       2                   &&
8       3       4                   &&
9       5       6                   ||
10      7       8                   &&
11      9       10                  &&

これらすべてを GUI にマッピングしようとすると、問題はさらに悪化します。

質問に役立つかどうかはわかりませんが、複数の式のロジックを処理する出力とコードを次に示します。

Output:
$ javac Expression.java & java Expression
exp1: Expression [(A EQ A)]   evaluates to [true]
exp2: Expression [(C EQ D)]   evaluates to [false]
expOr (exp1 or exp2): Expression [((A EQ A) OR (C EQ D))]   evaluates to [true]
expAnd (exp1 and exp2): Expression [((A EQ A) AND (C EQ D))]   evaluates to [false]
complex (exp1 NEQ expAnd): Expression [((A EQ A) NEQ ((A EQ A) AND (C EQ D)))]   evaluates to [true]
n1: Expression [(5 EQ 5)]   evaluates to [true]
n2: Expression [(6 NEQ 5)]   evaluates to [true]
n3: Expression [(5 NEQ 5)]   evaluates to [false]
n4 (n1 EQ complex): Expression [((5 EQ 5) EQ ((A EQ A) NEQ ((A EQ A) AND (C EQ D))))]   evaluates to [true]



public class Expression
{
    enum Op {EQ,NEQ,OR,AND};
    Object left;
    Object right;
    Op op;

    public Expression(Object l,Op o,Object r)
    {
        left = l;
        right = r;
        op = o;
    }

    public void test()
    {
        test("");
    }

    public void test(String msg)
    {
        System.out.println(msg + ": Expression ["+toString()+"]   evaluates to ["+evaluate()+"]");
    }

    public boolean evaluate()
    {
        if(Op.EQ == op) return equals();
        if(Op.NEQ == op) return !equals();
        if(Op.OR == op) return or();
        if(Op.AND == op) return and();
        return false;
    }

    //logical equals of expression with passed in expression
    public boolean equals(Object o)
    {
        if(o instanceof Expression)
        {
            Expression exp = (Expression)o;
            return evaluate() && exp.evaluate();
        }
        return false;
    }

    //compaire left and right for equality
    public boolean equals()
    {
        return left.equals(right);
    }

    //logical OR between left and right Expressions
    public boolean or()
    {
        if(left instanceof Expression && right instanceof Expression)
        {
            Expression expLeft = (Expression)left;
            Expression expRight = (Expression)right;
            return expLeft.evaluate() || expRight.evaluate();
        }
        return false;
    }

    //logical AND between left and right Expressions
    public boolean and()
    {
        if(left instanceof Expression && right instanceof Expression)
        {
            Expression expLeft = (Expression)left;
            Expression expRight = (Expression)right;
            return expLeft.evaluate() && expRight.evaluate();
        }
        return false;
    }

    public String toString()
    {
        StringBuilder sb = new StringBuilder();
        sb.append("("+left.toString() + " " + op.toString() + " " + right.toString()+")");
        return sb.toString();
    }


    public static void main(String[] args) throws Exception
    {
        //compare some strings
        Expression exp1 = new Expression("A",Op.EQ,"A");
        exp1.test("exp1");

        Expression exp2 = new Expression("C",Op.EQ,"D");
        exp2.test("exp2");

        Expression expOr = new Expression(exp1,Op.OR,exp2);
        expOr.test("expOr (exp1 or exp2)");

        Expression expAnd = new Expression(exp1,Op.AND,exp2);
        expAnd.test("expAnd (exp1 and exp2)");

        Expression complex = new Expression(exp1,Op.NEQ,expAnd);
        complex.test("complex (exp1 NEQ expAnd)");


        //numeric comparisons
        Expression n1 = new Expression(5,Op.EQ,5);
        n1.test("n1");

        Expression n2 = new Expression(6,Op.NEQ,5);
        n2.test("n2");

        Expression n3 = new Expression(5,Op.NEQ,5);
        n3.test("n3");

        //numeric and strings
        Expression n4 = new Expression(n1,Op.EQ,complex);
        n4.test("n4 (n1 EQ complex)");
    }
}
4

0 に答える 0