处理嵌套代码条件的更好模式?

ada*_*101 3 .net c# language-agnostic vb.net asp.net

我有一个网页,需要有选择地显示或隐藏大量的控件.每个控件的可见性是根据3个条件中的哪一个确定的.

因此,例如,给定条件A,B和C;

  • 仅当A和B为真且C为假时,Control1才需要可见.
  • 仅当B和C为真且A为假时,Control2才需要可见.
  • 只有当A和C为真且它不关心B是什么时,Control3才需要可见.
  • 等等...

如果每个控件都查看了每个条件,那么控制逻辑将是丑陋的,但可行.

If A Then
    If B Then
        If C Then

        Else

        End If
    Else
        If C Then

        Else

        End If
    End If
Else
    If B Then
        If C Then

        Else

        End If
    Else
        If C Then

        Else

        End If
    End If
End If
Run Code Online (Sandbox Code Playgroud)

但不幸的是,当你混合使用许多控件只关心3个条件中的1个或2个时,代码开始变成维护噩梦.以下是所有26种可能的条件:

A   False   B   Any     C   Any  
A   True    B   Any     C   Any  
A   Any     B   Any     C   False
A   False   B   Any     C   False
A   True    B   Any     C   False
A   Any     B   Any     C   True 
A   False   B   Any     C   True 
A   True    B   Any     C   True 
A   Any     B   False   C   Any  
A   False   B   False   C   Any  
A   True    B   False   C   Any  
A   Any     B   False   C   False
A   False   B   False   C   False
A   True    B   False   C   False
A   Any     B   False   C   True 
A   False   B   False   C   True 
A   True    B   False   C   True 
A   Any     B   True    C   Any  
A   False   B   True    C   Any  
A   True    B   True    C   Any  
A   Any     B   True    C   False
A   False   B   True    C   False
A   True    B   True    C   False
A   Any     B   True    C   True 
A   False   B   True    C   True 
A   True    B   True    C   True 
Run Code Online (Sandbox Code Playgroud)

是否有更好的模式来处理多个条件的检查?

编辑: 我已经开始沿着Marcelo Cantos建议的道路前进,但我的A,B和C条件很长.所以我做了一个帮手功能:

Dim isMatch = Function(A As Boolean?, B As Boolean?, C As Boolean?) As Boolean
        Return (Not A.HasValue OrElse A.Value = SomeLongConditionA) _
        AndAlso (Not B.HasValue OrElse B.Value = SomeLongConditionB) _
        AndAlso (Not C.HasValue OrElse C.Value = SomeLongConditionC)
    End Function

Control1.Visible = isMatch(True, True, False)
Control2.Visible = isMatch(False, True, True)
Control3.Visible = isMatch(True, Nothing, True)
Run Code Online (Sandbox Code Playgroud)

Mar*_*tos 15

Control1.Visible = A And B And Not C
Control2.Visible = Not A And B And C
Control3.Visible = A And C
...
Run Code Online (Sandbox Code Playgroud)

请注意,此表单类似于您提供的规则的说明.这是思考大多数问题的好方法:"我怎样才能使代码看起来像我对问题的描述?"

编辑:如果A,B和C表示冗长的表达式,则不必将这些表达式复制粘贴到每一行,也不必编写辅助函数.只需预先计算值:

Dim A As Boolean = SomeLongConditionA
Dim B As Boolean = SomeLongConditionB
Dim C As Boolean = SomeLongConditionC

Control1.Visible = A And B And Not C
...
Run Code Online (Sandbox Code Playgroud)

另请注意,这将比辅助函数快得多,这可以节省打字,但仍会多次评估条件.

  • @Dave:如果M和N很大,那么无论如何,MxN都将是巨大的.此外,@ MainMa的解决方案在结构上与我的相同,因此在复杂性方面表现出完全相同的增长.它只使用`if X然后Y = True`而不是'Y = X`. (2认同)