我的代码是否违反了单一职责原则?
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 个接口 IOperand
和 IOperator
,它们都派生自相同的基本接口 ITerm
,而 IOperand
和 IOperator
没有 is-a 关系至少是一种代码味道。
这意味着 IOperand
和 IOperator
不能互换,尽管它们都是 ITerm
实例,这违反了 Liskov 替换原则(SOLID 原则之一) .
几周前我自己创建了一个类似的控制台测试项目(逆向抛光计算器控制台应用程序),您可以在 github 上找到它:
https://github.com/fgheysels/Calculator
我正在制作一个控制台计算器作为测试项目。我实现它的主要特点是我使数字和运算符 类 继承自 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 个接口 IOperand
和 IOperator
,它们都派生自相同的基本接口 ITerm
,而 IOperand
和 IOperator
没有 is-a 关系至少是一种代码味道。
这意味着 IOperand
和 IOperator
不能互换,尽管它们都是 ITerm
实例,这违反了 Liskov 替换原则(SOLID 原则之一) .
几周前我自己创建了一个类似的控制台测试项目(逆向抛光计算器控制台应用程序),您可以在 github 上找到它: https://github.com/fgheysels/Calculator