最佳代码实践验证 - C.

时间:2012-02-03 10:19:08

标签: c

有一些我需要执行验证的变量。伪代码如下,但我觉得必须有一个更优雅的解决方案。

  If ( var != A || var != B || var != C || var != D )
        {
        reject
        }
    else if ( var == A || var == B)
        {
        do validation applicable to A or B
        }
    else if ( var == A || var == B || var == C || var == D )  
        {
        do validation applicable to all valid vars
        }

5 个答案:

答案 0 :(得分:2)

原始伪代码不正确,因此我对所需行为做了一些合理的假设。

// If var not equal to any of A,B,C or D...
if ( var != A && var != B && var != C && var != D ) 
{
    reject
}
// Otherwise var equal to one of A,B,C or D
else
{
    // If it is A or B...
    if( var == A || var == B )
    {
        do validation applicable to A or B
    }

    do validation applicable to all valid vars
}

或者您可以按如下方式翻转逻辑:

// If var equal to one of A,B,C or D
if( var == A || var == B || var == C || var == D ) 
{
    // If it is A or B...
    if( var == A || var == B )
    {
        do validation applicable to A or B
    }

    do validation applicable to all valid vars
}
else
{
    reject
}

可能更清楚。

答案 1 :(得分:0)

switch

怎么样?
switch (var)
{
    case A:
    case B:
        validate_ab();
        // break here if desired
    case C:
    case D:
        validate_all();
        break;
    default:
        reject();
 }

但这需要var具有整数类型。

答案 2 :(得分:0)

if ( var < 'A' || var > 'D' )
    {
    reject
    }
else if ( var < 'C')
    {
    do validation applicable to A or B
    }
else  
    {
    do validation applicable to all valid vars
    }

答案 3 :(得分:0)

这取决于var可以采用的值的类型,但如果可能的话,为什么不尝试使用bitflags呢?假设它是示例的int,它可以包含任何位标志A,B,C,D。

#define A 0x01
#define B 0x02
#define C 0x04
#define D 0x08
if((var & (int)0xF) == 0)
{
   //reject
}
else if(var &(int) 0x3 != 0)
{
 //applicable only to A or B
}
else if((var & (int)0xF) != 0)
{
    //do validation applicable to all valid vars
}

您可能无法在特定应用程序中使用bitflags,但如果可以的话,那么与您给出的示例类似,这将对您有所帮助。

答案 4 :(得分:0)

我认为使用开关是不错的选择。以下是我对可读代码的看法

int a=0,b=0,c=0,d=0;
switch(var){
 case A : 
     a=1;
 if(b && c && d)
    do validate applicable to all valid vars
    else if(b)
    do validation applicable to A or B   
    return;
case B :
    b=1;
    if(a && c && d)
        do validate applicable to all valid vars
    else if(a)
        do validation applicable to A or B   
    return;
 case C :
    c=1;
    if(a && b && d)
        do validate applicable to all valid vars
    return;
 case D :
    d=1;
    if(a && b && c)
        do validate applicable to all valid vars
    return;
 default :
    reject;
    return;
}