2011-02-17 61 views
4

我正在重构一个庞大的代码库的讨厌问题,并且需要找到特定的方法,接受相当一般的接口的实例,该界面。当用特定的子类型调用时查找特定方法的用法

例如,在NastyStatic中是DoBadThings(IBusinessObject)方法。在我的商业图书馆中,我有大约50个课程实施IBusinessObject,其中包括DontHurtMe : IBusinessObject

我怎样才能找到每个电话NastyStatic.DoBadThings(foo),但只有fooDontHurtMe的实例?

编辑:我在某种静态分析工具之后。在DoBadThings(或类似的)中设置动态手表并运行应用程序并不是一个真正的选择。由于我对DontHurtMe所做的更改,它已经会抛出异常,并且有太多的代码路径可以用这种方式查找所有用法(至少在它启动并且我的用户开始抱怨之前)。

+0

如果anwser不包括向DoBadThings方法添加某种跟踪并运行应用程序,我会感到惊讶(并且非常感兴趣) – 2011-02-17 07:42:44

+0

@xorcrud这正是我想要避免的;-)还有,很多代码路径,并且在那种情况下它已经抛出异常 – 2011-02-17 07:45:11

+0

无论如何,它会如何帮助您重构它? – Dyppl 2011-02-17 07:55:56

回答

5

简单。编写一个以DontHurtMe为参数的DoBadThings的重载。现在看看它叫什么名字。这不会检测到这样的情况:使用声明的IBusinessObject调用该方法,发生是一个DontHurtMe - 但我不认为静态分析可以检测到该情况。这可以通过声明 DontHurtMe来获得您的方法的所有调用。

0

我不能想出静态分析的解决方案。我刚刚重新审查了ReSharper的“查找使用先进...”的选项,但没有发现任何内容。你可以在这个方法上加上一个条件断点,条件如foo is DontHurtMe,但是我想你已经知道了,它更适合于当你试图找到一个bug而不是重构目的的情况。

2

ReSharper 5的结构搜索可以做到这一点。假设下面的代码:

class Program 
{ 
    static void Main(string[] args) 
    { 

     var hm = new HurtMe(); 
     var dhm = new DontHurtMe(); 

     DoBadThings(hm); 

     DoBadThings(dhm); 

    } 

    static void DoBadThings(IBusinessObject ibo) { } 
} 

interface IBusinessObject { } 

class DontHurtMe : IBusinessObject { } 

class HurtMe : IBusinessObject { } 

现在,如上所述,A R#Find UsagesDoBadThings,不管我们指定哪些选项,会发现无论是在Main的调用。

但是,如果我们

  1. 转到ReSharper | Find | Search with Pattern....
  2. Add Placeholder | Expression,命名为dhm,并指定DontHurtMe作为类型
  3. Search pattern,类型DoBadThings($dbm$)
  4. 单击查找

我们得到我们的结果只有DoBadThings对象上调用同型静态识别为a DontHurtMe而不是HurtMe的调用。


我喜欢通过@Carl Manaster提供的程序的整洁,但这种方式给出了当你不能超载问题的方法的选择。