2009-10-12 46 views
0

我正在修改子类的重写方法。为了确定这种变化的影响,我经历了所有可能的情景并进行了测试。对子类的影响分析

的问题是,“一切可能出现的情况”被读业务用例,把破发点,以找出何时被击中,而不是其他人这种特殊的重写的方法来确定。

是否有可靠或程序化的方式来了解影响?例如,如果它不是重写的方法,我可以简单地“查找所有实例”,或者甚至使用grep来找到它被调用的位置。对于重写的方法是否有类似的措施?还是仅仅是多态的不便?

回答

1

这个主题可能有科学的方法。但总的来说,您可能不得不采用“多态性带来的不便”。

我知道有些人因为这个原因直接反对任何OO。实际上,这也是为什么在.Net方法中,与Java不同,默认情况下不能重写。

如果你在google上搜索多态休息封装或继承休息封装,你会发现很多关于该主题的讨论。

0

一个快速的建议是重命名该函数。编译器会让您快速了解需要查看和可能重构的内容。显然,这完全取决于你在控制所有可能的客户端代码。

+0

好吧,这是一个重写的方法,编译器不会抱怨,只是使用基类实现。 – 2009-10-12 23:04:21

+0

是的,我可以通过在基类中更改它来重命名该方法。这是我知道的唯一可靠的武器,迫使你去参观所有可能的用途。这并不好玩,但它完成了。 – 2009-10-13 01:31:34

+0

这样做的问题是,取决于有多少其他的子类继承基类并重写此方法,它将从不方便变为不可能。与使用“查找所有参考”或类似功能并没有多大区别。 – 2009-10-13 05:25:19

1

我不知道所有的细节,所以很难推测,但是你认为这种变化会产生什么影响?

只要你不改变方法的签名,只要单独验证类的行为即可。这是单元测试的一个关键原则。既然你提到了断点,我假设你在调试器中手动测试。单元测试可以让你远离所有这些;值得一看。

如果该方法修改全局状态或者该类与其他类紧密耦合,则可能很难单独进行测试。见Adding unit tests to legacy code

作为另一种选择,ReSharper有一个查找用法功能,可以找到一种方法的调用者和基类的可选呼叫者。在“查找使用高级”下也可以找到重写方法。

+0

不幸的是,它正在修改全局状态(一些缓存数据)。但是,您的另一个问题的链接很有趣,谢谢! – 2009-10-13 05:16:30