2017-01-18 56 views
0

在下面的代碼中,我有兩個選擇案例幾乎完全相同,而且所有案例幾乎完全相同。由於他們正在使用帶有不同參數的重載構造函數,所以我無法找到將它們放入單個函數的方法。有沒有什麼辦法都做到這一點(最好不使用泛型或反射,並與選項嚴格?)防止重複選擇案例

Sub Main() 'for testing, this currently converts csv to csv 
    inputPath = Environment.GetCommandLineArgs(1) 
    inputType = Environment.GetCommandLineArgs(2).ToUpper 
    outputPath = Environment.GetCommandLineArgs(3) 
    outputType = Environment.GetCommandLineArgs(4).ToUpper 

    'Grab Input 
    Select Case inputType 
     Case "CSV" 
      inputSpreadSheet = New CSV(inputPath) 
     Case "XLS" 
      inputSpreadSheet = New XLS(inputPath) 
     Case "XLSX" 
      Throw New NotImplementedException() 
     Case "PIPE" 
      Throw New NotImplementedException() 
     Case Else 
      Throw New Exception(inputType & " Is not a valid input type.") 
    End Select 

    'Convert Input to Intermediate Format 
    intermediateSpreadSheet = inputSpreadSheet.ToIntermediate() 

    'Convert Intermediate to output Format 
    Select Case outputType 
     Case "CSV" 
      outputSpreadSheet = New CSV(intermediateSpreadSheet) 
     Case "XLS" 
      outputSpreadSheet = New XLS(intermediateSpreadSheet) 
     Case "XLSX" 
      Throw New NotImplementedException() 
     Case "PIPE" 
      Throw New NotImplementedException() 
     Case Else 
      Throw New Exception(outputType & " Is not a valid output type.") 
    End Select 

    'Generate output file 
    outputSpreadSheet.Export(outputPath) 
End Sub 

因爲用於構造函數的參數是不同類型的每一個選擇塊的,我知道沒辦法將它們結合起來。

+1

它並不真正重複,它測試2個不同的東西並創建不同的結果 – Plutonix

回答

1

有沒有真正的方法來壓縮,因爲它測試不同的東西和塑造不同的輸出。對於「更漂亮」的代碼,只需創建一個GetOutputSpreadSheet(outputType)GetInputSpreadSheet(inputType)方法,這樣就不必再看它們了。

1

如果兩個塊作爲輸入的路徑(假設它的串)和類型的輸出表,然後返回一些對象類型的電子表格說,那麼你可以像下面這樣的函數:

Public Static Function CreateSpreadSheet(ByVal path As String, ByVal type As String) As SpreadSheet 
    Select Case type 
    Case "CSV" 
     Return New CSV(path) 
    Case "XLS" 
     Return New XLS(path) 
    Case "XLSX" 
     Return NotImplementedException() 
    Case "PIPE" 
     Return NotImplementedException() 
    Case Else 
     Throw New Exception(type & " is not a valid output type") 
    End Select 
End Function 

然後用這樣的:

Sub Main() 'for testing, this currently converts csv to csv 
    inputPath = Environment.GetCommandLineArgs(1) 
    inputType = Environment.GetCommandLineArgs(2).ToUpper 
    outputPath = Environment.GetCommandLineArgs(3) 
    outputType = Environment.GetCommandLineArgs(4).ToUpper 

    'Grab Input 
    inputSpreadSheeet = CreateSpreadSheet(inputPath, inputType); 

    'Convert Input to Intermediate Format 
    intermediateSpreadSheet = inputSpreadSheet.ToIntermediate(); 

    'Convert Intermediate to output Format 
    outputSpreadSheet = CreateSpreadSheet(intermediateSpreadSheet.GetPath(), outputType); 

    'Generate output file 
    outputSpreadSheet.Export(outputPath) 
End Sub 

這假定有一些類稱爲電子表格是CSV,XLS的一個共同的祖先,等

同樣,SP readSheet類有一個GetPath方法來返回它的路徑,以便我們可以請求中間電子表格的文件位置。也就是說,假設ToIntermediate以New CSV等能夠加載的中間格式將其保存到磁盤。在你的代碼中,相同的構造函數似乎接受一個不同於路徑的對象,這就是你不能「合併」這兩個select語句的原因,因爲在第一個構造對象時使用path參數,第二個使用SpreadSheet對象參數。

如果您不想保存到臨時電子表格文件,那麼顯然您不能合併這兩個選擇語句(您需要有共同的輸入和輸出類型到這些代碼塊來將它們重構爲單個可重用的功能)