如何处理鼠标单击逻辑的许多嵌套if语句?

时间:2012-02-28 18:45:45

标签: c++ conditional-statements

我正在尝试在应用程序中处理鼠标点击,但逻辑变得非常混乱,因为有许多条件。例如,我需要知道以下内容:

- 如果控制键被按下
- 如果是鼠标左键或右键 - 如果是点击图形对象的中间或侧面 - 如果在点击之前已经选择了图形对象

并且很可能在将来有更多条件。

目前,由于过多的嵌套条件,尝试编写规则会让人感到困惑。这不是太糟糕;我觉得必须有更好的方法。

我已经阅读了很多关于如何用多态来替换嵌套条件的内容,但我无法弄清楚这是否适用于此。

编辑:我不知道是否重要,但我正在使用C ++。

以下是一个例子:

if (leftMouseClick)
{
  if (!controlClicked)
  {
    if (!clickedOnRightOfNote)
    {
       if (!isAlreadySelected()) 
       {
         // stuff
       }
       else
       {
         // stuff
       }
    else
    {
       if (!isAlreadySelected())
       {
         // stuff
       }
       else
       {
         // stuff
       }

依此类推......

2 个答案:

答案 0 :(得分:1)

从if树中分出实际的做法 首先编写最简单易读的版本 - 然后考虑如何使其更好

if ( isInShape() ) {
  if ( isCtrl() ) {
    doShapeEdit()
  } else {
    doShapeSelect()
  } 
} else if ( isInBackground() ) {
  if ( isCtrl() ) {
     doSetPreferences();
  } else {
    doSetWahtever();
  }
}

然后在doEditShape()里面你可以处理其他特殊情况

答案 1 :(得分:1)

有一个经典的UI模式,每个小部件都知道它的坐标。假设所有小部件都来自IWidget接口。然后你可以得到一个小部件列表(矢量用C ++)。

点击鼠标后,您可以执行以下操作:

vector<IWidget*> widgets;
for(int i=0; i<widgets.size(); ++i) {
  if(widgets[i]->contains(x,y)) {
      widgets[i]->handle();
      break;
  } 
}

这可能无法直接应用于您的确切情况,但希望将其作为基于小部件层次结构的设计理念抛弃。它使用多态来避免if语句。 真正关键的原则是每个小部件应该知道它的坐标等。