2011-02-17 62 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提供的程序的整潔,但這種方式給出了當你不能超載問題的方法的選擇。