防止重复的选择案例

时间:2017-01-18 18:09:01

标签: .net vb.net

在下面的代码中,我有两个选择案例几乎相同,而且所有案例几乎相同。由于他们使用具有不同参数的重载构造函数,我无法找到将它们放入单个函数的方法。有什么方法可以做到这一点(理想情况下,不使用泛型或反射和严格选项?)

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

由于构造函数的参数在每个select块中的类型不同,我知道无法组合它们。

2 个答案:

答案 0 :(得分:1)

没有真正的方法来缩小它,因为它正在测试不同的东西并塑造不同的输出。对于“更漂亮”的代码,只需创建一个GetOutputSpreadSheet(outputType)GetInputSpreadSheet(inputType)方法,这样您就不必再查看它们了。

答案 1 :(得分:1)

如果两个块都将路径(假设它是String)和输出表的类型作为输入,然后返回一些类型为SpreadSheet的对象,则可以使用如下函数:

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

这假设有一个名为SpreadSheet的类是CSV,XLS等的共同祖先。

此外,SpreadSheet类有一个GetPath方法来返回其路径,以便我们可以请求中间电子表格的文件位置。也就是说,假设ToIntermediate以新CSV等理解加载的某种中间格式将其保存到磁盘。在你的代码中,相同的构造函数似乎接受了一个除路径之外的对象,这就是你无法“合并”两个select语句的原因,因为在第一个中你用path参数构造了对象,在第二个构造了一个SpreadSheet对象参数。

如果您不想保存文件临时电子表格,那么显然您无法合并两个select语句(您需要将常用的输入和输出类型与这些代码块重合为一个可重用的函数) )