我希望这是在正确的地方。我正与同事讨论用于检查业务规则的方法。一般来说,有两个条件:
示例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
所以我想知道是否有人有任何其他技术用于规则检查?
答案 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}