0

我需要一个将操作数/运算符作为参数并提供评估结果的函数。我面临的问题是如何优雅地解析运算符。

示例代码如下

internal static bool Evaluator(double operand1, double operand2, string operation)
{
    bool evaluation = false;
    switch (operation)
    {
        case "<":
            evaluation = operand1 < operand2;
            break;

        case ">":
            evaluation = operand1 > operand2;
            break;

        case "<=":
            evaluation = operand1 <= operand2;
            break;

        default:
            break;
    }

    return evaluation;
}

我可以将运算符放在枚举(或可扩展枚举)中,并使用策略模式来删除开关盒。问题仍然存在,我无法解析运算符。例子

     op1="<";
     var operation = Operation.Parse(op1);
     var result = operand1 <--  operation should come here --> operand2.

请建议如何优雅地重构上面的代码(Evaluator 函数)。

4

2 回答 2

1

我想你可能正在寻找这样的东西:

public static Func<double, double, bool> ParseOperation(string operation)
{
    switch (operation)
    {
        case "<":
            return (x, y) => x < y;

        case ">":
            return (x, y) => x > y;

        case "<=":
            return (x, y) => x <= y;

        default:
            throw new Exception();
    }
}

你可以像这样使用它:

var op = ParseOperation("<");
Console.WriteLine(op(1, 2)); // true
于 2012-04-29T03:50:36.900 回答
1

switch 语句是责任链模式的最简单实现,其目的是将您的问题路由到正确的处理程序。经典的 GoF 实现是链表。 Wikipedia有一篇很好的文章,NetObjectives也有。

另一个很好的实现是注册表实现。这在这里有效,因为规则总是相同的——将给定的键与操作匹配。填写这个抽象,用字典支持它。使用您知道的操作预加载字典。

public abstract class OperationRegistry
{
   public abstract void RegisterOperation(string symbol, Func<double, double, bool> operation);
   public abstract Func<double, double, bool> GetOperation(string symbol);
}

FWIW,我更愿意看到一个新课程而不是 Func,但也许这只是我。

于 2012-04-29T04:45:06.680 回答