![]() |
1
9
我不认为自动静态分析可以确定这些原则是否得到尊重。要编写这样一个工具,您需要正式定义每个概念的含义,并有一种方法来对照任何代码检查它。你如何将责任的概念正式化?我个人不知道。 也就是说,你可以有工具来帮助你检测违规的可能性。 例如,您可以使用诸如每个类的方法数、每个类的成员数等代码度量来确定类是否太大,从而可能违反SRP。 一个例外可能是Liskov替换原则。 如果 在所有方法(先决条件、后置条件、不变量)上定义契约,然后可以检查重新定义超类方法的方法是否加强了先决条件、削弱了后置条件并尊重了超类方法的不变量。我认为工具 ESC/Java 执行这些检查。 阅读 wikipedia page about LSP 必须进行更多的检查。 |
![]() |
2
4
我的回答涉及到一个特定于.NET的产品,提前道歉,也许有人可以推荐它的非.NET类似产品。 我会给你的 NDepend 一个尝试,看看它是否可以导致我违反SRP和ISP的使用指标,如:
DIP和LSP违规可能更难追踪,因为它们涉及程序员的意图。一个分析工具可以识别类型之间的关系,但是它如何判断一个类真正地扩展了另一个类的情况呢?或者,在一个正确设计的程序中,a应该依赖于B而不是相反? OCP提出了一个不同的挑战,因为类应该被打开/关闭的扩展/修改不一定已经发生了。 然而,如果我们相信遵循SOLID可以得到一个更易于维护的产品(科学地证明这一说法并不是这个问题的目的),那么NDepend的抽象不稳定性图表应该给出一个很好的解释 衡量每个软件模块遵循原则的程度。如果是的话,模块应该避开图表的左下角,被称为“疼痛区”。在这个区域中,模块是稳定的(不是很好——太多其他模块依赖它,所以很难更改),但是不够抽象。 |