我的代码是否违反了单一责任原则?

时间:2016-11-08 21:51:01

标签: c# solid-principles

我正在制作一个控制台计算器作为测试项目。我实现它的主要特点是我创建了从ITerm接口继承的数字和运算符类:

public interface ITerm
{
    Object Value { get; }
}

现在,我在IOperand和IOperator接口中继承它,并通过反向波兰表示法在进一步计算中使用这些接口。

现在,我被告知使用此Object类型属性来保留数字和运算符违反了单一责任原则。

private ITerm CalculatePostfixExpression(IEnumerable<ITerm> input)
{
    var tempResult = new Stack<ITerm>();
    foreach (var term in input)
    {
        if (term is IOperand)
        {
            tempResult.Push(term as IOperand);
        }
        if (term is IOperator)
        {
            tempResult.Push(ProceedOperation(term as IOperator, tempResult));
        }
    }
    return tempResult.Peek();
}

这就是我处理计算的方式。所以有两个问题: 1.关于在Object变量中存储操作数和运算符的想法是否存在缺陷? 2.有什么方法可以改进我的代码吗?我现在考虑在CalculatePostfixExpression方法中使用访问者模式。

1 个答案:

答案 0 :(得分:2)

这绝对不是最明显的方法。

我还不太清楚你在Value属性中存储了什么?

事实上,您有两个IOperandIOperator接口,它们都来自相同的基接口ITerm,而那些IOperandIOperator没有有一个is-a关系至少是代码味道。

这意味着IOperandIOperator不可互换,尽管它们都是ITerm实例,这违反了Liskov替换原则(SOLID原则之一)。 / p>

几个星期前我自己创建了一个类似的控制台测试项目(反向波兰计算器控制台应用程序),您可以在github上找到它: https://github.com/fgheysels/Calculator