我编写了下面的代码来评估一个布尔表达式。表达式以对象的形式编码。
在我查看代码并思考时,其中一个时刻:我确定有更好的方法来编写代码,使用较少的布尔变量但无法看到正确的方法。有帮助吗?已经编写了单元测试,并且正在通过各种输入。
try...
答案 0 :(得分:3)
您可以在循环中设置tempBool = false
第一件事,并忽略else
和最后else if
:
foreach (var condition in filter.ConditionNodes.Where(a => a.IsActive))
{
tempBool = false;
if (!string.IsNullOrWhiteSpace(condition.FieldName) && values.ContainsKey(condition.FieldName))
{
var value = values[condition.FieldName];
if (filter.LogicalOperator == LogicalOperator.Or && ApplyCondition(condition.ConditionOperator, value, condition.FieldValue))
{
tempBool = true;
break;
}
else if (filter.LogicalOperator == LogicalOperator.And)
{
tempBool = ApplyCondition(condition.ConditionOperator, value, condition.FieldValue);
if (!tempBool)
{
break;
}
}
}
}
修改强>
它变得更简单:
foreach (var condition in filter.ConditionNodes.Where(a => a.IsActive))
{
tempBool = false;
if (!string.IsNullOrWhiteSpace(condition.FieldName) && values.ContainsKey(condition.FieldName))
{
var value = values[condition.FieldName];
tempBool == ApplyCondition(condition.ConditionOperator, value, condition.FieldValue);
if ((filter.LogicalOperator == LogicalOperator.And && !tempBool) || (filter.LogicalOperator == LogicalOperator.Or && tempBool))
{
break;
}
}
}
如果您需要ApplyCondition
为真,然后将tempBool
设置为true
(也是ApplyCondition
的结果)。如果您将tempBool
设置为ApplyCondition
的结果,请使用其他内容。这意味着您可以首先将tempBool
设置为ApplyCondition
的结果。现在你只需要决定是否需要休息。
答案 1 :(得分:1)
采用更多o-o方法,我认为您的运算符需要由继承自基类的类定义。基类将具有运算符实现的抽象Evaluate方法。然后,您可以使用o-o多态来评估您的运算符,而无需担心内部细节。实际上,你有一个简单的解释器的开头。
答案 2 :(得分:0)
一种更正式的编码布尔解释器的方法是考虑由形式语法生成的布尔表达式,并编写解析器和解释器为了它。解释器可以实现为抽象语法树。
我创建了一个开源库来实现这一目标,如果您愿意,可以查看GitHub。