我知道在某些情况下许多设计原则相互冲突。所以,我们必须权衡它们,看看哪一个更有益。直到现在我才知道 SRP 原则,并且完全基于它做了很多设计,但在内部,我在遵循这个原则时有时会感觉错了。现在我了解了 TDA,我的感觉得到了更多的支持 :)
SRP :-对象应该担心自己的问题而不是其他任何人
TDA :-行为(仅取决于其对象状态)应保留在对象本身内
示例:- 我有不同的形状,如矩形、正方形、圆形等。现在我必须计算面积。
我的设计到现在为止:-我一直在关注 SRP,在那里我有 AreaCalculatorService 类,它会询问形状状态并计算面积。这种设计背后的原因是形状不应该担心面积计算,因为它不是形状责任。但理想情况下,我曾经认为面积计算代码应该驻留在每个形状下,就好像如果出现新形状一样,我必须修改 AreaCalculatorService 类(这违反了扩展开放和修改关闭原则(OECM))。但总是优先考虑 SRP。这似乎是错误的
神话被打破了(至少我的):-使用 TDA,看起来我的感觉是正确的,我不应该询问对象的状态,而是告诉形状来计算它的面积。虽然它会违反 SRP 原则,但会支持 OECM 原则。正如我所说的设计原则有时会相互冲突,但我相信行为完全取决于其对象状态,行为和状态应该是在一起的。
另一个例子:-假设我必须计算组织中所有员工的所有部门的薪水,那么我们应该遵循 SalaryCalculatorService 将依赖于部门和员工的 SRP。
它将询问每个员工的工资,然后对所有工资进行汇总。所以在这里我要求员工的状态,但仍然没有违反 TDA calcSalary 不仅取决于每个员工的工资。
让我知道我对这两个原则的解释是否正确,在第一种情况下我应该遵循 TDA 而在第二种情况下应该遵循 SRP 吗?