Лучший шаблон для обработки условий вложенного кода? - PullRequest
3 голосов
/ 29 октября 2010

У меня есть веб-страница, на которой нужно выборочно показывать или скрывать значительное количество элементов управления.Видимость каждого элемента управления определяется на основе того, какое из 3 условий является истинным.

Так, например, с учетом условий A, B и C;

  • Control1 должен быть только видимымкогда A и B истинны, а C ложны.
  • Control2 должен быть видимым только тогда, когда B и C истинны, а A ложен.
  • Control3 должен быть видимым только тогда, когда A и Cистинны, и не имеет значения, что такое B.
  • и так далее ...

Если бы каждый элемент управления рассматривал каждое условие, логика элемента управления была бы уродливой, но выполнимой.

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

Но, к сожалению, когда вы смешиваете тот факт, что многие элементы управления заботятся только об 1 или 2 из 3 условий, код начинает превращаться в кошмар обслуживания.Вот все 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 

Есть ли лучший шаблон для проверки нескольких условий?

Редактировать: Я начал спускатьсяДорога, которую предложил Марсело Кантос, но мои условия 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 ]

15 голосов
/ 29 октября 2010
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 голос
/ 29 октября 2010

Не проще ли сгруппировать условия по элементу управления:

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

Редактировать: или, в данном конкретном случае, когда вы имеете дело с логическими свойствами элементов управленияОтвет Марсело Кантоса дает еще более короткий и легкий способ сделать то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...