2012-02-28 98 views
1

我试图在应用程序中处理鼠标点击,但逻辑变得非常混乱,因为有很多条件。例如,我需要了解以下内容:如何处理鼠标点击逻辑的嵌套if语句?

- 如果控制键被按下
- 如果它向左或鼠标右键
- 如果它是中间或图形对象的侧点击
- 如果图形对象已被选中,或者在点击前未选中

并且未来可能会有更多条件。

目前,由于过多的嵌套条件而试图编写规则是相当混乱的。这不是太糟糕;我只是觉得必须有更好的方法。

我读过很多关于如何用多态性替换嵌套条件,但我无法弄清楚这是否适用于此。

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

下面是一个例子:

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

等等...

+0

什么语言?请更新您的问题,用语言标记它,并发布代码示例。 – Oded 2012-02-28 18:47:29

+0

您可能需要将您的逻辑写为[状态机](http://en.wikipedia.org/wiki/State_machine)。推理起来会容易得多。在某些情况下,您甚至可以编码表中的所有逻辑。 – 2012-02-28 18:49:27

+0

您是否考虑委托逻辑来分离处理程序(每个独立操作一个)而不是一个知道所有事情的单片处理程序?这将有助于增加凝聚力。当然,假定每个行动都是独立的;如果情况并非如此,这可能不是一个好方法。 – Cameron 2012-02-28 18:52:02

回答

1

拆分出实际做从如果树
先写最简单最可读的版本的东西 - 然后想想如何使其更好

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

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

+0

够简单。谢谢! – Anthony 2012-03-05 18:14:03

1

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

当有一个鼠标点击,你可以这样做:

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

这可能不是直接适用于您的具体情况,但要根据小部件的层次结构有把它作为一个设计理念。它使用多态性来避免if语句。 真的关键原则是,每个小部件应该知道它的坐标等。