减少 select 中的圈复杂度
Reducing Cyclomatic Complexity in a select
祝你编码愉快,
我正在尝试清理一些代码,并且想知道如何减少我创建的方法的 Cylcomatic 复杂性。在导入 CSV 文件期间使用此方法。 CSV 文件中的一个字段是许可证类型,它是一个字符串(即“BFI 受监管的贷款人 - 网站 #2 许可证”)我正在将其转换为整数(1、2、3 或 4),将保存到数据库以根据许可证类型引用行业类型。
下面是我的方法。希望得到一些有关树荫 VB.NET 编码器的提示...
Private Function CheckIndustryType(LicName)
Dim VAR_IndType As Integer
Select Case Text_LicName
Case "BFI Level I Check Cashing - Branch License"
VAR_IndType = 3
Case "BFI Level II Check Cashing - Branch Certificate"
VAR_IndType = 3
Case "BFI Supervised Lender - Branch License"
VAR_IndType = 1
Case "BFI Deferred Presentment - Branch License"
VAR_IndType = 3
Case "BFI Supervised Lender - Website #1 License"
VAR_IndType = 1
Case "BFI Supervised Lender - Website #2 License"
VAR_IndType = 1
Case "BFI Supervised Lender - Website #3 License"
VAR_IndType = 1
Case "BFI Supervised Lender - Website #4 License"
VAR_IndType = 1
Case "BFI Supervised Lender - Website #5 License"
VAR_IndType = 1
Case "BFI Supervised Lender - Website #6 License"
VAR_IndType = 1
Case "BFI Level II Check Cashing - Company License"
VAR_IndType = 3
Case "BFI Level I Check Cashing - Company License"
VAR_IndType = 3
Case "fI Branch Mortgage Lender/Servicer"
VAR_IndType = 2
Case "BFI Branch Mortgage Lender/Servicer - Other Trade Name #1"
VAR_IndType = 2
Case "BFI Branch Mortgage Lender/Servicer - Other Trade Name #2"
VAR_IndType = 2
Case "BFI Branch Mortgage Lender/Servicer - Other Trade Name #3"
VAR_IndType = 2
Case "BFI Branch Mortgage Lender/Servicer - Other Trade Name #4"
VAR_IndType = 2
Case "BFI Branch Mortgage Lender/Servicer - Other Trade Name #5"
VAR_IndType = 2
Case "BFI Branch Mortgage Lender/Servicer - Other Trade Name #6"
VAR_IndType = 2
Case "BFI Mortgage Lender / Servicer License"
VAR_IndType = 2
Case "BFI Mortgage Lender/Servicer License - Other Trade Name #1"
VAR_IndType = 2
Case "BFI Mortgage Lender/Servicer License - Other Trade Name #2"
VAR_IndType = 2
Case "BFI Mortgage Lender/Servicer License - Other Trade Name #3"
VAR_IndType = 2
Case "BFI Mortgage Lender/Servicer License - Other Trade Name #4"
VAR_IndType = 2
Case "BFI Mortgage Lender/Servicer License - Other Trade Name #5"
VAR_IndType = 2
Case "BFI Mortgage Lender/Servicer License - Other Trade Name #6"
VAR_IndType = 2
Case Else
VAR_IndType = 4
End Select
Return VAR_IndType
End Function
在这种情况下我会使用字典。它将独立路径的数量减少到 2,第二个是必需的,因为您当然使用默认值。
Module Module1
Dim industryTypeMap As New Dictionary(Of String, Int32) From {{"BFI Level I Check Cashing - Branch License", 3},
{"BFI Level II Check Cashing - Branch Certificate", 3},
{"BFI Supervised Lender - Branch License", 1}}
Sub Main()
Console.WriteLine(CheckIndustryType("BFI Supervised Lender - Branch License"))
Console.WriteLine(CheckIndustryType("BFI Level II Check Cashing - Branch Certificate"))
Console.WriteLine(CheckIndustryType("Other"))
End Sub
Private Function CheckIndustryType(LicName As String)
Dim industryInt As Int32
If industryTypeMap.TryGetValue(LicName, industryInt) Then
Return industryInt
Else
Return 4
End If
End Function
End Module
这输出:
1
3
4
您也可以在函数中定义字典以将所有代码一起维护,但如果您重复调用该函数,显然 运行 速度会变慢。
根据下面的评论 - 理想情况下,您会将实际映射放置在无需重新编译代码即可更新的外部项中(例如配置文件或数据库)。
我通过使用 StartsWith
和 Contains
以及 Select Case True
来缩短案例数。
Private Function CheckIndustryType(LicName As String) As Integer
Dim VAR_IndType As Integer
Select Case True
Case LicName.Contains("Check Cashing")
VAR_IndType = 3
Case LicName.StartsWith("BFI Supervised Lender")
VAR_IndType = 1
Case LicName.StartsWith("BFI Deferred Presentment")
VAR_IndType = 3
Case LicName.StartsWith("fI")
VAR_IndType = 2
Case LicName.StartsWith("BFI Branch Mortgage Lender")
VAR_IndType = 2
Case Else
VAR_IndType = 4
End Select
Return VAR_IndType
End Function
一长串长字符串是有风险的,因为任何更改都很可能会引入拼写错误,然后字符串就会不匹配。我可能会做一个 Enum
:
Enum LicenseType
BFILevelICheckCashingBranchLicense
BFILevelIICheckCashingBranchCertificate
BFISupervisedLenderBranchLicense
...
End Enum
然后根据该值进行测试。为了降低复杂性,我会制作一个属性,如:
Class VarIndTypeAttribute
Inherits System.Attribute
Public VarIndType As Integer
Sub New(varIndType As Integer
Me.VarIndType = varIndType
End Sub
End Class
然后枚举变为:
Enum
<VarIndType(3)>
BFILevelICheckCashingBranchLicense
<VarIndType(3)>
BFILevelIICheckCashingBranchCertificate
<VarIndType(1)>
BFISupervisedLenderBranchLicense
...
End Enum
然后你做一个像
这样的方法
<Extension>
Function ToVarIndType(enumValue As [Enum]) As Integer
Dim att = enumValue.GetAttributeOfType(Of VarIndTypeAttribute)()
Return If(att IsNot Nothing, att.VarIndType, 0)
End Function
然后
Dim valueEnum As LicenseType = ...
Dim VarIndType = valueEnum.ToVarIndType
而且您根本不需要查找功能!
您可能希望 VarIndType
也成为 Enum
,因此您不会在整个应用程序中使用像 0 和 3 这样的魔法值。
祝你编码愉快,
我正在尝试清理一些代码,并且想知道如何减少我创建的方法的 Cylcomatic 复杂性。在导入 CSV 文件期间使用此方法。 CSV 文件中的一个字段是许可证类型,它是一个字符串(即“BFI 受监管的贷款人 - 网站 #2 许可证”)我正在将其转换为整数(1、2、3 或 4),将保存到数据库以根据许可证类型引用行业类型。
下面是我的方法。希望得到一些有关树荫 VB.NET 编码器的提示...
Private Function CheckIndustryType(LicName)
Dim VAR_IndType As Integer
Select Case Text_LicName
Case "BFI Level I Check Cashing - Branch License"
VAR_IndType = 3
Case "BFI Level II Check Cashing - Branch Certificate"
VAR_IndType = 3
Case "BFI Supervised Lender - Branch License"
VAR_IndType = 1
Case "BFI Deferred Presentment - Branch License"
VAR_IndType = 3
Case "BFI Supervised Lender - Website #1 License"
VAR_IndType = 1
Case "BFI Supervised Lender - Website #2 License"
VAR_IndType = 1
Case "BFI Supervised Lender - Website #3 License"
VAR_IndType = 1
Case "BFI Supervised Lender - Website #4 License"
VAR_IndType = 1
Case "BFI Supervised Lender - Website #5 License"
VAR_IndType = 1
Case "BFI Supervised Lender - Website #6 License"
VAR_IndType = 1
Case "BFI Level II Check Cashing - Company License"
VAR_IndType = 3
Case "BFI Level I Check Cashing - Company License"
VAR_IndType = 3
Case "fI Branch Mortgage Lender/Servicer"
VAR_IndType = 2
Case "BFI Branch Mortgage Lender/Servicer - Other Trade Name #1"
VAR_IndType = 2
Case "BFI Branch Mortgage Lender/Servicer - Other Trade Name #2"
VAR_IndType = 2
Case "BFI Branch Mortgage Lender/Servicer - Other Trade Name #3"
VAR_IndType = 2
Case "BFI Branch Mortgage Lender/Servicer - Other Trade Name #4"
VAR_IndType = 2
Case "BFI Branch Mortgage Lender/Servicer - Other Trade Name #5"
VAR_IndType = 2
Case "BFI Branch Mortgage Lender/Servicer - Other Trade Name #6"
VAR_IndType = 2
Case "BFI Mortgage Lender / Servicer License"
VAR_IndType = 2
Case "BFI Mortgage Lender/Servicer License - Other Trade Name #1"
VAR_IndType = 2
Case "BFI Mortgage Lender/Servicer License - Other Trade Name #2"
VAR_IndType = 2
Case "BFI Mortgage Lender/Servicer License - Other Trade Name #3"
VAR_IndType = 2
Case "BFI Mortgage Lender/Servicer License - Other Trade Name #4"
VAR_IndType = 2
Case "BFI Mortgage Lender/Servicer License - Other Trade Name #5"
VAR_IndType = 2
Case "BFI Mortgage Lender/Servicer License - Other Trade Name #6"
VAR_IndType = 2
Case Else
VAR_IndType = 4
End Select
Return VAR_IndType
End Function
在这种情况下我会使用字典。它将独立路径的数量减少到 2,第二个是必需的,因为您当然使用默认值。
Module Module1
Dim industryTypeMap As New Dictionary(Of String, Int32) From {{"BFI Level I Check Cashing - Branch License", 3},
{"BFI Level II Check Cashing - Branch Certificate", 3},
{"BFI Supervised Lender - Branch License", 1}}
Sub Main()
Console.WriteLine(CheckIndustryType("BFI Supervised Lender - Branch License"))
Console.WriteLine(CheckIndustryType("BFI Level II Check Cashing - Branch Certificate"))
Console.WriteLine(CheckIndustryType("Other"))
End Sub
Private Function CheckIndustryType(LicName As String)
Dim industryInt As Int32
If industryTypeMap.TryGetValue(LicName, industryInt) Then
Return industryInt
Else
Return 4
End If
End Function
End Module
这输出:
1
3
4
您也可以在函数中定义字典以将所有代码一起维护,但如果您重复调用该函数,显然 运行 速度会变慢。
根据下面的评论 - 理想情况下,您会将实际映射放置在无需重新编译代码即可更新的外部项中(例如配置文件或数据库)。
我通过使用 StartsWith
和 Contains
以及 Select Case True
来缩短案例数。
Private Function CheckIndustryType(LicName As String) As Integer
Dim VAR_IndType As Integer
Select Case True
Case LicName.Contains("Check Cashing")
VAR_IndType = 3
Case LicName.StartsWith("BFI Supervised Lender")
VAR_IndType = 1
Case LicName.StartsWith("BFI Deferred Presentment")
VAR_IndType = 3
Case LicName.StartsWith("fI")
VAR_IndType = 2
Case LicName.StartsWith("BFI Branch Mortgage Lender")
VAR_IndType = 2
Case Else
VAR_IndType = 4
End Select
Return VAR_IndType
End Function
一长串长字符串是有风险的,因为任何更改都很可能会引入拼写错误,然后字符串就会不匹配。我可能会做一个 Enum
:
Enum LicenseType
BFILevelICheckCashingBranchLicense
BFILevelIICheckCashingBranchCertificate
BFISupervisedLenderBranchLicense
...
End Enum
然后根据该值进行测试。为了降低复杂性,我会制作一个属性,如:
Class VarIndTypeAttribute
Inherits System.Attribute
Public VarIndType As Integer
Sub New(varIndType As Integer
Me.VarIndType = varIndType
End Sub
End Class
然后枚举变为:
Enum
<VarIndType(3)>
BFILevelICheckCashingBranchLicense
<VarIndType(3)>
BFILevelIICheckCashingBranchCertificate
<VarIndType(1)>
BFISupervisedLenderBranchLicense
...
End Enum
然后你做一个像
这样的方法 <Extension>
Function ToVarIndType(enumValue As [Enum]) As Integer
Dim att = enumValue.GetAttributeOfType(Of VarIndTypeAttribute)()
Return If(att IsNot Nothing, att.VarIndType, 0)
End Function
然后
Dim valueEnum As LicenseType = ...
Dim VarIndType = valueEnum.ToVarIndType
而且您根本不需要查找功能!
您可能希望 VarIndType
也成为 Enum
,因此您不会在整个应用程序中使用像 0 和 3 这样的魔法值。