如何在编程中处理冗长的条件决策

时间:2015-04-23 10:26:50

标签: forms design-patterns data-structures conditional-statements

我有一个问题,我提交表格,在提交表格之前,我必须为该表格定义某些标准,这意味着在提交表格时,它会通过标准,如果符合标准则执行行动。

现在它引导我进入很多if / else条件,我想知道如何避免这种情况。我也关注性能问题。有适合的设计模式吗?我该如何存储数据?在这种情况下,哪种数据结构可能有用?

1 个答案:

答案 0 :(得分:1)

根据您的说明,您可以拥有验证器集合或chain of responsibility进行验证。

在任何一种情况下,每个验证者类都有责任进行一小部分验证,并且只有在所有验证成功的情况下才执行最终操作。

如果您的验证格式为

if (someFlag)
{
    if (form.SomeProperty!= validValue) return false
}
else
{
    if (form.SomeOtherProperty!= validValue) return false
}
if (someOtherFlag)
{
    if (form.SomeThirdProperty!= validValue) return false
}
else
{
    if (form.SomeForthProperty!= validValue) return false
}

所有人都一个接一个地重复,然后我赞成一个简单的验证器集合,然后循环遍历它们,检查每个验证器,一旦失败就返回false,如果一切都成功就行动。

如果他们更深层次地嵌套某些检查只在某些情况下完成,有点像这样:

if (someFlag)
{
    if (form.SomeProperty!= validValue) 
    {
        return false
    }
    if (someDependentFlag)
    {
        if (form.SomeThirdProperty!= validValue) 
        {
            return false
        }
        if (someOtherDependentFlag)
        {
            if (form.YetAnotherField != changedValue) return false
        }
    }
}
else
{
    if (form.SomeProperty2!= validValue) 
    {
        return false
    }
    if (someOtherDependentFlag)
    {
        if (form.SomeThirdProperty!= validValue) 
        {
            return false
        }
        if (someOtherDependentFlag2)
        {
            if (form.YetAnotherField2 != changedValue) return false
        }
    }
}

然后我倾向于使用链接方法,因为您可以将每个支票封装为单独的类和链,然后根据需要将其封装在一起,并根据需要进行深度嵌套。

如果大多数检查都很简单,但只要你的验证器都实现了相同的接口,那么你可以采用一种组合方法,只要你的验证器都实现了相同的接口。

从最简单的事情开始,如果需要,可以演变为更复杂。