2017-01-18 13 views
0

次のコードでは、2つのSelect Casesがほぼ同一であり、さらにすべてのケースがほぼ同じです。彼らは異なるパラメータを持つ多重定義されたコンストラクタを使用しているので、それらを単一の関数に入れる方法を見つけることはできません。すべてでこれを行うにはどのような方法は、(理想的に厳しいジェネリックまたは反射し、オプションでを使用しなくても?)がある繰り返しの選択の防止

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 

これはSpのこと、またなど、CSV、XLSの共通の祖先であるスプレッドシートと呼ばれるいくつかのクラスがあることが

を前提としてい

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 

:その後、このように使用readSheetクラスにはパスを返すGetPathメソッドがあり、中間スプレッドシートのファイルの場所を尋ねることができます。つまり、ToIntermediateが新しいCSVなどがロードすることを理解している中間形式でディスクに保存するとします。あなたのコードでは、同じコンストラクタがオブジェクトをパスとは別のものとして受け入れるように見えました。そのため、2つのselect文をマージできなかったのは、1番目のパスパラメータでオブジェクトを構築し、2番目にSpreadSheetオブジェクトパラメータ。

一時スプレッドシートをファイルに保存したくない場合は、明らかに2つのselect文をマージすることはできません(これらのコードブロックに共通の入力および出力タイプを持たなければ単一の再利用可能関数)

関連する問題