既に存在する可能性が高いデザイン パターンを見つけるために (スタック オーバーフローまたは 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)");
}
}