.net 检查业务规则的方法

.net 检查业务规则的方法,.net,vb.net,theory,.net,Vb.net,Theory,我希望这是在正确的地方。我和一位同事讨论了一种用于检查业务规则的方法。通常有两个条件: “如果一个人失败了,整个事情都失败了” 例1:“如果一个失败了,整个事情都失败了” 我已经在几种情况下使用了条件1的以下技术。从本质上说,如果其中一个条件是错误的,那么整个事情就失败了 Dim blnTemp As Boolean = True If Fail=False Then blnTemp = blnTemp AndAlso False {code code code} If Fail=

我希望这是在正确的地方。我和一位同事讨论了一种用于检查业务规则的方法。通常有两个条件:

  • “如果一个人失败了,整个事情都失败了”
  • 例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
    

    所以我想知道是否有人有其他用于规则检查的技术?

    我通常会尝试“快速失败,快速失败”的想法。一旦不满足第一个要求的条件,基本上就离开该方法

    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
    
    对我来说,阅读起来更清晰,而不是每次检查后都返回结果。如果“整件事”失败,如果其中一个条件为假,那么提前跳转就很方便了——只要您不需要检查由于返回而遗漏的其他检查的结果

    @评论

    但是如果你的条件被其他需要改进的工作分开了 如果这样做,一个函数调用将是不够的。还是会?什么 你愿意吗

    好吧,可读性和干净的代码(包括控制流的简单遵循)是我关心的事情之一。所以我最有可能将相关的条件分组。如果这些条件被其他工作分隔开,我会在类中抽象这些条件,比如说
    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
    

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

    我通常会尝试“快速失败,努力失败”的想法。一旦不满足第一个要求的条件,基本上就离开该方法

    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
    
    对我来说,阅读起来更清晰,而不是每次检查后都返回结果。如果“整件事”失败,如果其中一个条件为假,那么提前跳转就很方便了——只要您不需要检查由于返回而遗漏的其他检查的结果

    @评论

    但是如果你的条件被其他需要改进的工作分开了 如果这样做,一个函数调用将是不够的。还是会?什么 你愿意吗

    好吧,可读性和干净的代码(包括控制流的简单遵循)是我关心的事情之一。所以我最有可能将相关的条件分组。如果这些条件被其他工作分隔开,我会在类中抽象这些条件,比如说
    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
    

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

    我不确定你的两个场景之间的区别是什么——难道“一切都必须是真的”不等于“如果一个失败了,整个事情都失败了”吗

    在任何情况下,假设您的处理已经完成,我不会弄乱所有If/Then语句,而是使用更干净的语句:

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

    我不确定你的两个场景之间的区别是什么——难道“一切都必须是真的”和“如果一个失败了,整个事情都失败了”不一样吗

    在任何情况下,假设您的处理已经完成,我不会弄乱所有If/Then语句,而是使用更干净的语句:

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

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

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

    我理解,但在这个例子中没有回报。如果不在函数中,我们将决定是否不执行代码部分。我可以将代码封装在一个函数中,然后它就可以工作了,但假设你不能这样做。我想你的风格会建议将代码封装在一个函数中,我认为这是一个很棒的答案,很可能是一个更好的实践,但是,如果您的条件被其他需要完成的工作分隔开,那么一个函数调用是不够的。还是会?你会怎么做。仅供参考,我编辑了示例1来说明我在说什么。这和规范方法正是我想要的。对于复杂的高处理业务逻辑,我认为它提供了一种更灵活的方式来处理条件,而不是使用条件和分支。我猜在测试的时候也有好处。谢谢你的时间。我理解,但在这个例子中没有回报。如果不在函数中,我们将决定是否不执行代码部分。我可以将代码封装在一个函数中,然后它就可以工作了,但假设你不能这样做。我想你的风格会建议将代码封装在一个函数中,我认为这是一个很棒的答案,很可能是一个更好的实践,但是,如果您的条件被其他需要完成的工作分隔开,那么一个函数调用是不够的。还是会?你会怎么做。仅供参考,我编辑了示例1来说明我在说什么。这和规范方法正是我想要的。对于复杂的高处理业务逻辑,我认为它提供了一种更灵活的方式来处理条件,而不是使用条件和分支。我猜在测试的时候也有好处。谢谢你的时间。除了清晰,没有区别。有时,业务规则会声明其中一个,这样编码是有意义的,这样下一个人就更容易遵循。@wavedrop:代码可读性会产生巨大的差异。另外,请查看规范模式,它允许a实现干净的验证。此处有一些链接:。这里有一个例子:Guy-我简化了代码,因为我觉得它很混乱。现在只有一个例子,如果你需要,你只需要翻转条件。我在上面的评论中提到了这一点,“但是如果你的条件被其他需要完成的工作分开,那么一个函数{条件s