改进这段丑陋的代码

时间:2011-08-19 22:39:34

标签: vb.net qr-code

我正在VB.net中编写QR代码生成器

首先,我检查用户选择的(QR码版本)值。

每个版本都有固定的每个模式位数(0001,0010,0100,1000)。

基本上我现在得到的是:

Private Function get_number_of_bits() As Integer
    Dim bits As Integer

    If listVersion.Value < 10 Then
        If get_binary_mode(listMode.SelectedItem) = "0001" Then
            bits = 10
        End If
        If get_binary_mode(listMode.SelectedItem) = "0010" Then
            bits = 9
        End If
        If get_binary_mode(listMode.SelectedItem) = "0100" Or _
           get_binary_mode(listMode.SelectedItem) = "1000" Then
            bits = 8
        End If
    ElseIf listVersion.Value < 27 Then
        If get_binary_mode(listMode.SelectedItem) = "0001" Then
            bits = 12
        End If
        If get_binary_mode(listMode.SelectedItem) = "0010" Then
            bits = 11
        End If
        If get_binary_mode(listMode.SelectedItem) = "0100" Then
            bits = 16
        End If
        If get_binary_mode(listMode.SelectedItem) = "1000" Then
            bits = 10
        End If
    Else
        If get_binary_mode(listMode.SelectedItem) = "0001" Then
            bits = 14
        End If
        If get_binary_mode(listMode.SelectedItem) = "0010" Then
            bits = 13
        End If
        If get_binary_mode(listMode.SelectedItem) = "0100" Then
            bits = 16
        End If
        If get_binary_mode(listMode.SelectedItem) = "1000" Then
            bits = 12
        End If
    End If

    Return bits
End Function

哪个有效,但当然它是一个丑陋的......代码:)。

什么是更好的方式来写这个?

修改

按要求。

listMode是一个填充的组合框:

Private Function get_encoding_modes() As Dictionary(Of String, String)
    Dim modes As New Dictionary(Of String, String)
    modes.Add("0000", "<Auto select>")
    modes.Add("0001", "Numeric (max. 7089 chars)")
    modes.Add("0010", "Alphanumeric (max. 4296 chars)")
    modes.Add("0100", "Binary [8 bits] (max. 2953 chars)")
    modes.Add("1000", "Kanji/Kana (max. 1817 chars)")

    Return modes
End Function

get_binarymode的代码

Private Function get_binary_mode(ByVal mode As String) As String
    Dim modes As New Dictionary(Of String, String)
    modes = get_encoding_modes()

    Dim result As String = ""

    Dim pair As KeyValuePair(Of String, String)
    For Each pair In modes
        If pair.Value = mode Then
            result = pair.Key
        End If
    Next

    Return result
End Function

2 个答案:

答案 0 :(得分:6)

答案 1 :(得分:1)

我会建议这种“改进”。

  • get_binary_mode()被调用一次。有点性能提升。

  • 您对listVersion.value的3个案例仍然是3,但更容易阅读。当您需要添加第4个时,添加另一个CaseExit Select是一项简单的工作。请务必保留Exit Select语句,以防9之类的值出现,因为它会同时满足<10<27

  • 每个案例的单独功能和逻辑分离(10岁以下,27岁以下等)。这在未来应该更加可维护。

  • 当需要改变某些事物时,我们确切地知道要去哪里,而且它是非常本地化的。

  • 显然,我的命名惯例需要做一些工作才能以更易读/可理解的术语表达意图。

  • 当然这个答案包含更多行代码。我宁愿阅读&amp;保持较小的自包含功能,做一件事(一件事情)。 YMMV。

  • 你可以更进一步,摆脱局部变量bits。只需Return AnalyzeUnderXX()

Private Function get_number_of_bits() As Integer
    Dim mode As String = get_binary_mode(listMode.SelectedItem)
    Dim bits As Integer

    Select Case Convert.ToInt32(listVersion.Value)
        Case Is < 10
            bits = AnalyzeUnder10(mode)
            Exit Select
        Case Is < 27
            bits = AnalyzeUnder27(mode)
            Exit Select
        Case Else
            bits = AnalyzeDefault(mode)
    End Select

    Return bits  
End Function

Private Function AnalyzeUnder10(input As String) As Integer
    Select Case input
        Case "0001"
            Return 10
        Case "0010"
            Return 9
        Case "0100" Or "1000"
            Return 8
    End Select
End Function

Private Function AnalyzeUnder27(input As String) As Integer
    Select Case input
        Case "0001"
            Return 12
        Case "0010"
            Return 11
        Case "0100"
            Return 16
        Case "1000"
            Return 10
    End Select
End Function

Private Function AnalyzeDefault(input As String) As Integer
    Select Case input
        Case "0001"
            Return 14
        Case "0010"
            Return 13
        Case "0100"
            Return 16
        Case "1000"
            Return 12
    End Select
End Function