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

问题描述 投票:-4回答:2

使用条件运算符的示例。

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();
c++ function if-statement conditional-operator
2个回答
1
投票

让我们简化要求:

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

Using the conditional operator:

a = b ? c : d;

恕我直言,尽可能清楚

Using temporaries and if:

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

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

Using functions:

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

//....

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

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

Alternate functions:

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

//...

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

我建议的另一种选择。如果您不想在将来仅检查b怎么办?如果这两个变体不是唯一的,即你想将ID_NODE_GLOW_SELECTID_NODE_COLOR_NORMAL结合起来用于其他条件怎么办?

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


0
投票

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

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

  • 将所有样式数据收集到一个sprite_style类中。这样,您可以为各种样式制作一些命名常量,然后您可以使用一个简单的set_style函数调用来更改样式。
  • 将选择代码移出sprite类 - 让sprite类成为精灵所需的基本内容。将此样式切换到子类中,或者甚至更好地将其移动到在状态更改时触发的事件处理程序中。
© www.soinside.com 2019 - 2024. All rights reserved.