2

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
4

4 に答える 4

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

次に、次のように、あたかもデータベースから入ってくるかのように、ルールのリストの作成をハードコーディングできます。

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))

次に、巨大な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

ご覧のとおり、このように設計すると、後でルールを変更したり、ルールを追加したりするのがずっと簡単になります。ただし、文字列ではなく、実際にはこれらの値に列挙を使用する必要があります。例えば:

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

Public Enum AnglesOfRoof
    Any
    Horizontal
    Degrees30
    Degrees45
    ' ...
    Vertical
End Enum
于 2013-01-28T14:09:56.060 に答える
3
Select Case drpAngleOfRoof.Text
        Case "Horizontal"
            Select Case drpDwnRoofFacing.Text
                Case "South" : SR = 933
                Case "SE/SW" : SR = 933
                Case "E/W" : SR = 933
                Case "NE/NW" : SR = 933
                Case "North" : SR = 933
            End Select
        Case "30 Degrees"
            Select Case drpDwnRoofFacing.Text
                Case "South" : SR = 933
                Case "SE/SW" : SR = 933
                Case "E/W" : SR = 933
                Case "NE/NW" : SR = 933
                Case "North" : SR = 933
            End Select
        Case "45 Degrees"
            Select Case drpDwnRoofFacing.Text
                Case "South" : SR = 933
                Case "SE/SW" : SR = 933
                Case "E/W" : SR = 933
                Case "NE/NW" : SR = 933
                Case "North" : SR = 933
            End Select
        Case "60 Degrees"
            Select Case drpDwnRoofFacing.Text
                Case "South" : SR = 933
                Case "SE/SW" : SR = 933
                Case "E/W" : SR = 933
                Case "NE/NW" : SR = 933
                Case "North" : SR = 933
            End Select
        Case "Vertical"
            Select Case drpDwnRoofFacing.Text
                Case "South" : SR = 933
                Case "SE/SW" : SR = 933
                Case "E/W" : SR = 933
                Case "NE/NW" : SR = 933
                Case "North" : SR = 933
            End Select
    End Select
于 2013-01-28T14:06:28.217 に答える
2

IF ステートメントをネストできます。つまり、

If drpAngleOfRoof.Text = "Horizontal" Then

    If drpDwnRoofFacing.Text = "South" Then

         SR = 933

    End If

End If

たとえば、各角度位置に関連するすべてのステートメントをグループ化します。

または、代わりに Select...Case ステートメントを使用することもできます。

http://msdn.microsoft.com/en-us/library/cy37t14y(v=vs.71).aspx

于 2013-01-28T13:51:20.053 に答える
-1

代わりにselectステートメントを使用するのはどうですか。最初の選択を drpAngleOfRoof の値に切り詰めると、drpDownRoofFacing の値だけを気にする必要があります。このようなもの:

Select Case drpAngleOfRoof.Text
Case "Horizontal"
    Return 933
Case "30 Degrees"
    Select Case drpDwnRoofFacing.Text
        Case "South"
            Return 1042
        Case "SE/SW"
            Return 997
        Case "E/W"
            Return 886
        Case "NE/NW"
            Return 762
        Case "North"
            Return 709
    End Select
Case "45 Degrees"
    Select Case drpDwnRoofFacing.Text
        Case "South"
            Return 1023
        Case "SE/SW"
            Return 968
        Case "E/W"
            Return 829
        Case "NE/NW"
            Return 666
        Case "North"
            Return 621
    End Select
Case "60 Degrees"
    Select Case drpDwnRoofFacing.Text
        Case "South"
            Return 960
        Case "SE/SW"
            Return 900
        Case "E/W"
            Return 753
        Case "NE/NW"
            Return 580
        Case "North"
            Return 485
    End Select
Case "Vertical"
    Select Case drpDwnRoofFacing.Text
        Case "South"
            Return 724
        Case "SE/SW"
            Return 684
        Case "E/W"
            Return 565
        Case "NE/NW"
            Return 427
        Case "North"
            Return 360
    End Select
End Select
于 2013-01-28T14:10:03.953 に答える