2008-10-08 67 views
1

我想知道如果任何人能夠幫助我重構我前一段時間寫的一些代碼。我爲一個COM對象編寫了一個包裝器,只將字符串作爲輸入,所以在良好的OOP實踐中,我將字符串包裝在函數中,以便構建和調用。幫助重構函數,需要大量的參數

我只是想知道如果有人能想到更好的方式來做下面的代碼。

Public Function OpenTable(ByVal TablePath As String, Optional ByVal OpenAs As String = Nothing, _ 
      Optional ByVal Hide As Boolean = False, Optional ByVal AsReadOnly As Boolean = False, _ 
      Optional ByVal Interactive As Boolean = True, Optional ByVal Password As String = Nothing, _ 
      Optional ByVal NoIndex As Boolean = False, Optional ByVal ViewAutomatic As Boolean = True) As TableInfo 

      If String.IsNullOrEmpty(TablePath) Then 
       Throw New ArgumentNullException("TablePath", "TablePath cannot be null or empty") 
      End If 

      Dim Builder = New StringBuilder("Open Table ") 
      Builder.AppendFormat("{0}{1}{2}", ControlChars.Quote, TablePath, ControlChars.Quote) 

      If (Not String.IsNullOrEmpty(OpenAs)) Then Builder.AppendFormat(" as {0} ", OpenAs) 
      If (Hide) Then Builder.Append(" Hide ") 
      If (AsReadOnly) Then Builder.Append(" ReadOnly ") 
      If (Interactive) Then Builder.Append(" Interactive ") 
      If (Not String.IsNullOrEmpty(Password)) Then Builder.AppendFormat(" Password {0} ", Password) 
      If (NoIndex) Then Builder.Append(" NoIndex ") 
      If (ViewAutomatic) Then Builder.Append(" View Automatic ") 

      MyComApp.Do(Builder.ToString) 

      Dim FileInfo = New IO.FileInfo(TablePath) 
      Return New TableInfo(FileInfo.Name.Substring(0, InStrRev(FileInfo.Name, ".") - 1)) 
     End Function 

函數必須採用的參數量是我最擔心的。這個並不算太壞,但我還有其他一些功能可能在將來需要更多的參數,所以我主要尋找更好的方法來構建大型參數函數。

謝謝。

+0

反對...爲什麼? – 2008-12-08 13:36:38

回答

4

在這種情況下,似乎很多參數都只是'配置值'(最終是字符串),您可以修改它以接受在調用之前準備的所有配置的單個類,並且返回你相應的字符串。

喜歡的東西

class COMConfiguration { 
    private bool Hide = false; 
    private bool AsReadOnly = false; 
    //and so on... 

    public void setHide(bool v) { Hide = v; } 

    //only setters 

    public string getConfigString() { 
     StringBuilder sb = new StringBuilder(); 
     if (Hide) { sb.Append(" Hide "); } 
     if (AsReadOnly) { sb.Append(" ReadOnly "); } 
     //and so on 
     return sb.ToString() 
    } 
} 
0

因爲我不知道你的編程語言,我也會保持這個以僞代碼,但我一般的回答是使用安數組作爲一個參數:

function OpenTable(options As array) { 
    if (options is not array or options is empty) { 
     Throw exception 
    } 
    return_string = ""; 
    if (key is set ('readOnly', options) and is not empty) { 
     return_string = return_string + ' readonly'; 
    } 
    // repeat last 3 lines for all your params 
} 

OK了你的函數沒有道理的最後一部分對我來說,但是我認爲應該會出現一系列參數。祝你好運。

2

處理可能需要大量參數的函數的一種方法是創建一個新的對象類型,其唯一目的是保存該函數的參數。然後,您創建一個新類型的對象,根據需要設置屬性,然後將該對象引用傳遞給您的OpenTable函數。

0

您可以將您所有的布爾參數的enum類型的一個參數,標記爲Flags。下面是一個示例聲明:

' Define an Enum with FlagsAttribute. 
<FlagsAttribute()> _ 
Enum TableOptions as Short 
    Hide = 1 
    AsReadOnly = 2 
    Interactive = 4 
    NoIndex = 8 
    ViewAutomatic = 16 
End Enum 
+0

問題是,您可以有多個選項是true或false。所以你可以將AsReadOnly和Interactive都傳遞給函數,所以只有一個枚舉不起作用 – 2008-10-08 08:37:30