我正在制作一个控制台计算器作为测试项目。我实现它的主要特点是我创建了从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方法中使用访问者模式。
答案 0 :(得分:2)
这绝对不是最明显的方法。
我还不太清楚你在Value属性中存储了什么?
事实上,您有两个IOperand
和IOperator
接口,它们都来自相同的基接口ITerm
,而那些IOperand
和IOperator
没有有一个is-a关系至少是代码味道。
这意味着IOperand
和IOperator
不可互换,尽管它们都是ITerm
实例,这违反了Liskov替换原则(SOLID原则之一)。 / p>
几个星期前我自己创建了一个类似的控制台测试项目(反向波兰计算器控制台应用程序),您可以在github上找到它: https://github.com/fgheysels/Calculator