.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=
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