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

时间:2010-10-28 23:13:12

标签: c# .net asp.net vb.net language-agnostic

我有一个需要有选择地显示或隐藏大量控件的网页。每个控件的可见性是根据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

但不幸的是,当你混合使用许多控件只关心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 

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

修改 我已经开始沿着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)

2 个答案:

答案 0 :(得分:15)

Control1.Visible = A And B And Not C
Control2.Visible = Not A And B And C
Control3.Visible = A And C
...

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

编辑:如果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
...

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

答案 1 :(得分:1)

通过控制对条件进行分组会不会更容易:

If A And B And Not C Then
    Control1.Visible = True
End If

If Not A And B And C Then
    Control2.Visible = True
End If

If A And C Then
    Control3.Visible = True
End If

编辑:或者,在这种处理控件的布尔属性的特殊情况下,Marcelo Cantos的答案提供了更简单易读的方法来执行相同的操作。