2012-10-17 59 views
2

我已經繼承了一些代碼,其中有一個500行的switch語句。基本上,它打開一個string任務並執行相應的操作。如何重構這個巨大的switch語句?

我已經將每個案例陳述移到了他們自己的方法中。巨大的switch語句仍然存在,但不是內聯邏輯,而是每種情況都只是調用一種方法,所以它更簡潔。

問題是這些方法修改了很多不同的東西。 50%的方法需要傳入0個參數。大約40%需要5個參數,剩下的10%需要10個參數。

目前這個工程但我想把它做得更好。要麼擺脫switch語句,要麼以某種方式降低傳入參數的數量。

我想用Dictionary該映射string s到Action s到消除整個交換機的,但因爲我使用了很多的ref參數(基本類型),這是行不通的,有會是沒有方式將這些傳遞給構造函數,並讓它們稍後被引用修改。

該問題的明顯解決方案是將所有16個左右的變量放置到一個單獨的類中並傳遞,但其中很多不是很相關,因此它只是用另一個問題替換一個問題(長參數列表與非內聚數據類)。

想知道是否有其他方法可以改善此代碼。謝謝閱讀。

+1

你能用反射和界面做些什麼嗎? – jcolebrand

+0

@jcolebrand:該應用程序對性能非常敏感,涉及移動機器。這部分程序是一個瓶頸,所以我想避免反思。不確定接口如何幫助。也許你可以詳細說明一下? –

+5

如果沒有任何關於switch語句的作用以及它與代碼其餘部分的關係的情況,有點難以回答。交換機的條件和行動是否都是相關的,或者這只是一種應該完全消除的全方位場景? – pvanhouten

回答

2

由於你的問題沒有包含任何代碼,所以答案也不能。我認爲最好的做法是指向第82頁的歷史上最好的軟件書籍之一:Refactoring: Improving the Design of Existing Code

「面向對象代碼的一個最明顯的症狀是它比較缺乏switch語句,大多數時候你看到switch語句都應該考慮多態性。

然後,他列出了一些用於幫助實現此目的的特定模式。

3

不能看任何類型的代碼,我可以給出的唯一建議是你應該考慮使用SOLID design principles考慮重構測試。我會嘗試爲每個邏輯模塊(或交換機的條件)創建不同的類,通過這些對象的構造函數傳遞依賴關係(而不是作爲方法的參數),並嘗試創建一些可用於工作的統一接口在一些測試中。您可能想要通過投入工廠來提取這些對象的條件創建。聽起來像一團糟。祝你好運。

+0

對於這個問題有點過分。 –

0

您可以在代表中使用ref參數,但不能使用內置的ActionFunc通用代理。你必須定義自己就像這樣:

public delegate void DelegateWithRefParameters(ref int i, ref long l, ref bool b, ref object o); 

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     int i = 0; 
     long l = 0; 
     bool b = false; 
     object o = null; 

     var lookup = new Dictionary<string, DelegateWithRefParameters>() 
     { 
      { "object", ModifyObject }, 
      { "int", ModifyInt }, 
      { "bool", ModifyBool }, 
     }; 

     string s = "object"; 

     lookup[s](ref i, ref l, ref b, ref o); 
    } 

    private static void ModifyObject(ref int i, ref long l, ref bool b, ref object o) 
    { 
     o = new object(); 
    } 

    private static void ModifyInt(ref int i, ref long l, ref bool b, ref object o) 
    { 
     i++; 
    } 

    private static void ModifyBool(ref int i, ref long l, ref bool b, ref object o) 
    { 
     b = !b; 
    }    

} 

你只需要修改所有的方法來使用相同的簽名。