我正在尝试在应用程序中处理鼠标点击,但逻辑变得非常混乱,因为有许多条件。例如,我需要知道以下内容:
- 如果控制键被按下
- 如果是鼠标左键或右键
- 如果是点击图形对象的中间或侧面
- 如果在点击之前已经选择了图形对象
并且很可能在将来有更多条件。
目前,由于过多的嵌套条件,尝试编写规则会让人感到困惑。这不是太糟糕;我觉得必须有更好的方法。
我已经阅读了很多关于如何用多态来替换嵌套条件的内容,但我无法弄清楚这是否适用于此。
编辑:我不知道是否重要,但我正在使用C ++。以下是一个例子:
if (leftMouseClick)
{
if (!controlClicked)
{
if (!clickedOnRightOfNote)
{
if (!isAlreadySelected())
{
// stuff
}
else
{
// stuff
}
else
{
if (!isAlreadySelected())
{
// stuff
}
else
{
// stuff
}
依此类推......
答案 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语句。 真正关键的原则是每个小部件应该知道它的坐标等。