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

C++ 如何处理鼠标点击逻辑的许多嵌套if语句?,c++,conditional-statements,C++,Conditional Statements,我试图在应用程序中处理鼠标点击,但逻辑变得非常混乱,因为有许多条件。例如,我需要知道以下几点: -如果按下控制键 -如果是鼠标左键或右键 -如果单击的是图形对象的中间或侧面 -如果图形对象在单击之前已选定或未选定 未来很可能会有更多的条件 目前,由于嵌套条件过多,编写规则的过程相当混乱。还不算太坏;我只是觉得一定有更好的办法 我读过很多关于如何用多态性替换嵌套条件的书,但我不知道这是否适用于这里 编辑:我不知道这是否重要,但我使用的是C++。 下面是一个例子: if (leftMouseClic

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

-如果按下控制键
-如果是鼠标左键或右键
-如果单击的是图形对象的中间或侧面
-如果图形对象在单击之前已选定或未选定

未来很可能会有更多的条件

目前,由于嵌套条件过多,编写规则的过程相当混乱。还不算太坏;我只是觉得一定有更好的办法

我读过很多关于如何用多态性替换嵌套条件的书,但我不知道这是否适用于这里

编辑:我不知道这是否重要,但我使用的是C++。 下面是一个例子:

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

以此类推……

从if树中分离出实际做的事情
首先编写最简单、可读性最强的版本,然后思考如何使其更好

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

然后在doEditShape()中,您可以处理其他特殊情况

有一个经典的UI模式,其中每个小部件都知道它的坐标。假设所有小部件都来自IWidget接口。然后您可以有一个小部件列表(C++中的vector)

单击鼠标时,您可以执行以下操作:

vector<IWidget*> widgets;
for(int i=0; i<widgets.size(); ++i) {
  if(widgets[i]->contains(x,y)) {
      widgets[i]->handle();
      break;
  } 
}
vectorwidgets;
对于(int i=0;i包含(x,y)){
widgets[i]->handle();
打破
} 
}
这可能不直接适用于您的具体情况,但希望将其作为一种基于小部件层次结构的设计思想扔掉。它使用多态性来避免if语句。
实际上,关键原则是每个小部件都应该知道它的坐标等。

什么语言?请更新您的问题,用语言标记它,并发布一个代码示例。您可能需要将您的逻辑作为一个示例来编写。这将更容易推理。在某些情况下,您甚至可以对表中的所有逻辑进行编码。您是否考虑过将逻辑委托给单独的处理程序(每个不同的操作一个处理程序),而不是一个了解一切的单一处理程序?这将有助于增强凝聚力。当然,假设每个动作都是独立的;如果不是这样,这可能不是一个好方法。