Методы проверки бизнес-правил - PullRequest
0 голосов
/ 20 марта 2012

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

  1. «Если один не удастся, все не получится»1008 * Я использовал следующую технику для условия 1 в нескольких случаях.По существу, если одно из этих условий ложно, тогда все это не выполняется
    Dim blnTemp As Boolean = True
    
    If Fail=False Then blnTemp = blnTemp AndAlso False
    
        {code code code}
    
    If Fail=True Then blnTemp = blnTemp AndAlso False
    
        {code code code}
    
    If Fail=False Then blnTemp = blnTemp AndAlso False
    
        {code code code}
    
    If Fail=False Then blnTemp = blnTemp AndAlso False
    
        {yup, code code code}
    
    If True Then
        Execute("Execute Global Thermal Nuclear War")
    End If
    

    Так что мне интересно, есть ли у кого-нибудь другие методы, которые они использовали для проверки правил?

Ответы [ 3 ]

3 голосов
/ 20 марта 2012

Я обычно стараюсь придерживаться идеи «Быстро проваливайся, терпишь неудачу».В основном выход из метода, как только первое необходимое условие не выполняется.

Public Function NuclearWar() as Boolean
   If not is Foo() then return False
   If (FooList is Nothing AndAlso FooList.Count = 0) then return False
   (...) etc.

   return True
End Function

Для меня понятнее читать, а не понижать каждую проверку и возвращать результат в конце.Если «целая вещь» терпит неудачу, если одно из условий ложно, такой ранний переход оказывается весьма полезным - до тех пор, пока вам не нужно проверять результаты других проверок, которые пропущены из-за возврата.

@ Comment

но если ваши условия разделены другой работой, которая должна быть выполнена, то одного вызова функции будет недостаточно.Или это будет?Что бы вы сделали

Ну, читабельность и чистый код (который включает в себя простое следование потоку управления) - одна из вещей, которые меня волнуют.Так что я бы, скорее всего, групповые условия, которые связаны друг с другом.Если условия разделены другой работой, я бы абстрагировал условия в классе, скажем LaunchConditions.

Public Class LaunchCondition
    Public Property IsLaunch As Boolean
    ' Add other properties you'd like to check
End Class
Public Class LaunchConditions
    Private _launchConditions = New List(Of LaunchCondition)
    Public ReadOnly Property CanLaunch As Boolean
        Get
            Return CheckConditions()
        End Get
    End Property
    Public Sub AddCondition(ByVal condition As LaunchCondition)
        ' Add condition
    End Sub
    Public Sub RemoveCondition(ByVal condition As LaunchCondition)
        ' Add condition
    End Sub
    Private Function CheckConditions() As Boolean
        ' Your check logic
        Return _launchConditions.Any(Function(x As LaunchCondition) Not x.IsLaunch)
    End Function
End Class

Надеюсь, это даст вам некоторые идеи:)

2 голосов
/ 20 марта 2012

Для меня Linq выполняет работу кратко и легко читаемо.

Dim nuclearWarConditions As IEnumerable(Of Boolean) = New Boolean() { _
    True, _
    True, _
    True, _
    False, _
    True
}

If nuclearWarConditions.All(Function(condition) condition = True) Then
    Console.WriteLine("Execute Global Thermal Nuclear War")
End If

Аналогично, вы можете использовать

If nuclearWarConditions.Any(Function(condition) condition = False) Then
    Console.Error.WriteLine("Cancelled Global Thermal Nuclear War")
End If

для уменьшения вложенности.

Изменить: Извините, если я испортил синтаксис VB.Я не носитель языка:)

0 голосов
/ 20 марта 2012

Я не уверен, в чем разница между вашими двумя сценариями - разве «все должно быть правдой» - это не то же самое, что «если не получится, все рухнет»?

В любом случае, если ваша обработка уже завершена, я не стал бы связываться со всеми операторами If / Then, а пошел бы с чем-то более чистым:

if (conditional1 && conditional2 && conditional3...)
    {return true}
else
    {return false}
...