管理变量组切换的最佳方法是什么?

时间:2011-12-23 22:02:45

标签: c++ function if-statement conditional-operator

使用条件运算符的示例。

void setSelected( bool selected )
{
    a = selected? SELECTED_VALUE_A: DEFAULT_VALUE_A;
    b = selected? SELECTED_VALUE_B: DEFAULT_VALUE_B;
    c = selected? SELECTED_VALUE_C: DEFAULT_VALUE_C;
}

使用iftemporaries

的示例
void setSelected( bool selected )
{
    a = DEFAULT_VALUE_A;
    b = DEFAULT_VALUE_B;
    c = DEFAULT_VALUE_C;
    if ( selected )
    {
        a = SELECTED_VALUE_A;
        b = SELECTED_VALUE_B;
        c = SELECTED_VALUE_C;
    }
}

使用函数

的示例
void setLook( int nA, float nB, std::string nC )
{
    a = nA;
    b = nB;
    c = nC;
}

void setSelected( bool selected )
{
    if ( selected )
        setLook( DEFAULT_VALUE_A, DEFAULT_VALUE_B, DEFAULT_VALUE_C );
    else
        setLook( SELECTED_VALUE_A, SELECTED_VALUE_B, SELECTED_VALUE_C );
}

使用函数的替代示例。仍然使用setLook

void setLookSelected()
{
    setLook( SELECTED_VALUE_A, SELECTED_VALUE_B, SELECTED_VALUE_C );
}
void setLookNormal()
{
    setLook( DEFAULT_VALUE_A, DEFAULT_VALUE_B, DEFAULT_VALUE_C );
}
void setSelectedAF( bool selected )
{
    if ( selected )
        setLookSelected();
    else
        setLookNormal();
}
//Or just call
setLookSelected();
setLookNormal();

2 个答案:

答案 0 :(得分:1)

让我们简化要求:

  

如果a为真,则将变量c设置为b,否则设置d

使用条件运算符:

a = b ? c : d;

恕我直言,尽可能清楚

使用临时和if:

a = c;
if (b)
   a = d;

真的很难看。即使c,您也会将a分配给!b。除了糟糕的可读性之外,您还会遇到性能下降,因为您有双重任务。优化器可以处理这个问题,但不要指望它。

使用功能:

void setA(T x)
{
   a = x;
}

//....

if (b)
   setA(c);
else
   setA(d);

如果您要设置许多成员,这可能很有用。代码维护性将得到改善。如果您想要不同的功能,您只需要在一个地方进行更改。还不错!

替代功能:

void setAC()
{
   a = c;
}
void setAD()
{
   a = d;
}

//...

if (b)
   setAC();
else
   setAD();

我建议的另一个选择。如果您不希望将来仅检查b该怎么办?如果这两个变体不是独占的,即您想要将ID_NODE_GLOW_SELECTID_NODE_COLOR_NORMAL合并用于其他条件,该怎么办?

结论:我将第一个变体用于简单的小案例,以及带有大型类参数的函数,您可以在其中设置大量成员。我肯定会远离选项2& 4。

答案 1 :(得分:0)

如果答案不清晰明显,有时候这意味着你提出了错误的问题。

扫描您的代码,我怀疑有两个设计更改是个好主意:

  • 将所有样式数据收集到一个sprite_style类中。这样,您可以为各种样式制作一些命名常量,然后您可以通过一个简单的set_style函数调用来更改样式。

  • 将选择代码移出sprite类 - 让sprite类成为精灵所需的基本内容。将此样式切换到子类中,或者甚至更好地移动到在状态更改时触发的事件处理程序。