检查业务规则的方法

时间:2012-03-20 15:12:27

标签: .net vb.net theory

我希望这是在正确的地方。我正与同事讨论用于检查业务规则的方法。一般来说,有两个条件:

  1. “如果一个人失败,整个事情都会失败”
  2. 示例1:“如果一个失败,整个事情就失败了”

    我在几种情况下对条件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 个答案:

答案 0 :(得分:3)

我通常会尝试使用“快速失败,努力失败”的想法。基本上在不满足第一个必要条件时立即离开该方法。

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

对我来说,更清楚的是阅读而不是每次检查并最后返回结果。如果其中一个条件为假,那么“整件事”就会失败,那么早期跳转就会非常方便 - 只要你不需要检查由于返回而遗漏的其他检查的结果。 / p>

@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

希望这会给你一些想法:)

答案 1 :(得分:2)

对我来说,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语法。我不是以英语为母语的人:)

答案 2 :(得分:0)

我不确定你的两个场景之间的区别是什么 - 不是“所有必须是真的”和“如果一个人失败了整个事情都失败了”吗?

在任何情况下,假设您的处理已经完成,我不会搞乱所有的If / Then语句,而是选择更清洁的东西:

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