【问题标题】:Impact analysis on subclass对子类的影响分析
【发布时间】:2009-10-12 22:47:16
【问题描述】:

我正在修改子类的重写方法。为了确定更改的影响,我遍历了所有可能的场景并进行了测试。

问题是,“所有可能的场景”是通过阅读业务用例来确定的,设置断点以找出这个特定的覆盖方法何时被命中而不是其他方法。

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

【问题讨论】:

    标签: c# visual-studio polymorphism


    【解决方案1】:

    这个话题可能有科学的方法。但总的来说,您可能不得不接受“只是多态性带来的不便”。

    我知道有些人出于这个原因非常反对任何 OO。事实上,这也是 .Net 中的方法与 Java 不同的是默认情况下不可覆盖的原因。

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

    【讨论】:

      【解决方案2】:

      我不知道所有细节,因此很难推测,但您预计此次更改会产生什么影响?

      只要您不更改方法的签名,只需单独验证类的行为即可。这是单元测试的一个关键原则。由于您提到断点,我假设您在调试器中手动测试。单元测试可以让你远离这一切;值得研究。

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

      作为另一种选择,ReSharper 有一个 Find Usages 功能,可以找到方法的调用者和可选的基类的调用者。还有一个选项可以在 Find Usages Advanced 下找到覆盖方法。

      【讨论】:

      • 不幸的是,它正在修改全局状态(一些缓存数据)。但是您指向另一个问题的链接很有趣,谢谢!
      【解决方案3】:

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

      【讨论】:

      • 嗯,它是一个被覆盖的方法,编译器不会报错,只使用基类实现。
      • 是的,我提到您可以通过在基类中更改方法来重命名该方法。这是我所知道的唯一确定的 wau,它迫使您访问所有可能的用途。这不好玩,但它完成了。
      • 这个问题是,取决于有多少其他子类继承了基类并覆盖了这个方法,它会从不方便变成不可能。并且与使用“查找所有参考资料”或类似功能没有太大区别。
      猜你喜欢
      • 2016-11-02
      • 2017-09-09
      • 2013-01-14
      • 2023-03-10
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      相关资源
      最近更新 更多