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

Does my code violates Single Responsibility Principle?

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

public interface ITerm
{
    Object Value { get; }
}

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

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

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 方法中使用访问者模式。

恕我直言,这绝对不是最明显的方法。

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

您有 2 个接口 IOperandIOperator,它们都派生自相同的基本接口 ITerm,而 IOperandIOperator没有 is-a 关系至少是一种代码味道。

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

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