减少 VB.NET 的 if 代码量

Chr*_*eah 2 vb.net asp.net web

我正在使用 ASP Web 窗体和 VB 后端创建太阳能光伏计算器。我只是看着我的代码,作为一个 VB.NET 开发新手,我只是想知道是否有办法做一些不同的事情,减少代码行数或类似的东西。这是y代码的一个繁琐部分:

Dim SR As Integer
    'Store radiation value
    If drpDwnRoofFacing.Text = "South" And drpAngleOfRoof.Text = "Horizontal" Then
        SR = 933
    ElseIf drpDwnRoofFacing.Text = "SE/SW" And drpAngleOfRoof.Text = "Horizontal" Then
        SR = 933
    ElseIf drpDwnRoofFacing.Text = "E/W" And drpAngleOfRoof.Text = "Horizontal" Then
        SR = 933
    ElseIf drpDwnRoofFacing.Text = "NE/NW" And drpAngleOfRoof.Text = "Horizontal" Then
        SR = 933
    ElseIf drpDwnRoofFacing.Text = "North" And drpAngleOfRoof.Text = "Horizontal" Then
        SR = 933
    ElseIf drpDwnRoofFacing.Text = "South" And drpAngleOfRoof.Text = "30 Degrees" Then
        SR = 1042
    ElseIf drpDwnRoofFacing.Text = "SE/SW" And drpAngleOfRoof.Text = "30 Degrees" Then
        SR = 997
    ElseIf drpDwnRoofFacing.Text = "E/W" And drpAngleOfRoof.Text = "30 Degrees" Then
        SR = 886
    ElseIf drpDwnRoofFacing.Text = "NE/NW" And drpAngleOfRoof.Text = "30 Degrees" Then
        SR = 762
    ElseIf drpDwnRoofFacing.Text = "North" And drpAngleOfRoof.Text = "30 Degrees" Then
        SR = 709
    ElseIf drpDwnRoofFacing.Text = "South" And drpAngleOfRoof.Text = "45 Degrees" Then
        SR = 1023
    ElseIf drpDwnRoofFacing.Text = "SE/SW" And drpAngleOfRoof.Text = "45 Degrees" Then
        SR = 968
    ElseIf drpDwnRoofFacing.Text = "E/W" And drpAngleOfRoof.Text = "45 Degrees" Then
        SR = 829
    ElseIf drpDwnRoofFacing.Text = "NE/NW" And drpAngleOfRoof.Text = "45 Degrees" Then
        SR = 666
    ElseIf drpDwnRoofFacing.Text = "North" And drpAngleOfRoof.Text = "45 Degrees" Then
        SR = 621
    ElseIf drpDwnRoofFacing.Text = "South" And drpAngleOfRoof.Text = "60 Degrees" Then
        SR = 960
    ElseIf drpDwnRoofFacing.Text = "SE/SW" And drpAngleOfRoof.Text = "60 Degrees" Then
        SR = 900
    ElseIf drpDwnRoofFacing.Text = "E/W" And drpAngleOfRoof.Text = "60 Degrees" Then
        SR = 753
    ElseIf drpDwnRoofFacing.Text = "NE/NW" And drpAngleOfRoof.Text = "60 Degrees" Then
        SR = 580
    ElseIf drpDwnRoofFacing.Text = "North" And drpAngleOfRoof.Text = "60 Degrees" Then
        SR = 485
    ElseIf drpDwnRoofFacing.Text = "South" And drpAngleOfRoof.Text = "Vertical" Then
        SR = 724
    ElseIf drpDwnRoofFacing.Text = "SE/SW" And drpAngleOfRoof.Text = "Vertical" Then
        SR = 684
    ElseIf drpDwnRoofFacing.Text = "E/W" And drpAngleOfRoof.Text = "Vertical" Then
        SR = 565
    ElseIf drpDwnRoofFacing.Text = "NE/NW" And drpAngleOfRoof.Text = "Vertical" Then
        SR = 427
    ElseIf drpDwnRoofFacing.Text = "North" And drpAngleOfRoof.Text = "Vertical" Then
        SR = 360
    End If
Run Code Online (Sandbox Code Playgroud)

Ste*_*art 5

我建议将这些数据存储在应用程序代码之外,例如存储在数据库中,或者如果没有必要,可以存储在 XML 文件中。但是,即使您要在代码中硬编码转换规则,最好将规则的硬编码与处理和应用规则的逻辑分开。例如,您可以创建一个包含规则的类,如下所示:

Public Class MyRule
    Public Sub New(roofFacing As String, angleOfRoof As String, SR As Integer)
        _roofFacing = roofFacing
        _angleOfRoof = angleOfRoof
        _SR = sr
    End New

    Public ReadOnly Property RoofFacing() As String
        Get
            Return _roofFacing
        End Get
    End Property
    Private _roofFacing As String

    Public ReadOnly Property AngleOfRoof() As String
        Get
            Return _angleOfRoof
        End Get
    End Property
    Private _angleOfRoofAs String

    Public ReadOnly Property SR() As String
        Get
            Return _SR
        End Get
    End Property
    Private _SR String
End Class
Run Code Online (Sandbox Code Playgroud)

然后,您可以硬编码规则列表的创建,就像它们来自数据库一样,如下所示:

Dim rules As New List(Of MyRule)()
rules.Add(New MyRule("South", "Horizontal", 933))
rules.Add(New MyRule("South", "SE/SW", 933))
' ...
rules.Add(New MyRule("South", Nothing, 933))
Run Code Online (Sandbox Code Playgroud)

然后,If您可以使用一个简单的循环来应用规则,而不是一个巨大的语句,如下所示:

Dim SR As Integer
For Each rule As MyRule In rules
    If _
    ( _
        (rule.RoofFacing Is Nothing) OrEsle _
        (rule.RoofFacing = drpDwnRoofFacing.Text) _
    ) AndAlso _
    ( _
        (rule.AngleOfRoof Is Nothing) OrEsle _
        (rule.AngleOfRoof = drpAngleOfRoof.Text) _
    ) Then
        SR = rule.SR
        Exit For
    End If
Next
Run Code Online (Sandbox Code Playgroud)

如您所见,一旦按照这种方式进行设计,将来修改规则或添加其他规则将变得更加容易。但是,您应该真正为这些值使用枚举,而不是字符串。例如:

Public Enum RoofFacings
    Any
    North
    South
    EastOrWest
    ' ...
End Enum

Public Enum AnglesOfRoof
    Any
    Horizontal
    Degrees30
    Degrees45
    ' ...
    Vertical
End Enum
Run Code Online (Sandbox Code Playgroud)