在这种情况下,如何使我的代码更干净(切换大小写/if-else)


How to make my code cleaner in this case (switch case / if else)

我正在使用PHP设计一个小型网络游戏
游戏中有几个按钮,当玩家点击时会发出ajax请求。

当我需要对每个按钮进行不同的确定时,我会写下以下代码。。。

    if ($button != 'A') {
        if ($button == 'B') {
            if (!$this->functionB()) {
                return $this->returnJson(<some message>);
            }
        } elseif ($button == 'C') {
            if (!$this->functionC()) {
                return $this->returnJson(<some message>);
            }
        } else {  // other buttons go here
            if (!$this->myFunction($button)) {
                return $this->returnJson(<some message>);
            }
        }
    }
    // other logic...
    return $this->returnJson(<success message>);

当玩家点击按钮A时,他绝对会得到成功的消息
当玩家点击按钮B时,如果他没有通过函数B()的确定,他将收到错误消息。如果他通过了,他将获得成功的消息。点击按钮C也是如此。
当玩家点击其他按钮(大约10个按钮)时,将由myFunction()进行确定。

但我认为代码并不优雅,因为有三层if-else语句。所以我试着把它改成switchcase语句。

    switch ($button) {
        case ('A'):
            break;
        case ('B') {
            if (!$this->functionB()) {
                return $this->returnJson(<some message>);
            }
            break;
        case ('C') {
            if (!$this->functionC()) {
                return $this->returnJson(<some message>);
            }
            break;
        default: // other buttons go here
            if (!$this->myFunction($button)) {
                return $this->returnJson(<some message>);
            }
            break;
        }
    }
    // other logic...
    return $this->returnJson(<success message>);

我仍然对此不满意,因为switch语句中有if语句。

在这种情况下,如何使我的代码更干净?

我是编程新手,真的想在我的编码风格上打下良好的基础。希望你能给我一些建议。非常感谢!

就个人而言,下面显示的case语句看起来可读,而且功能强大。我从经验中发现,即使你有一些重复的台词,神秘绝对不是办法。不过,你甚至没有真正重复台词。如果您试图将其分离为多个函数,那么在函数中包含函数将显得非常多余。

我确实看到了一件事,程序流通常应该一直到函数的末尾,而不是从内部返回,否则你会遇到无法访问的代码或难以解决的情况。例如,你上面的代码,我认为你可能不小心做到了这一点,所以我希望这对我的观点有所帮助。

例如,与其去:

return myFunction($param);

使用此:

$returnVal=myFunction($param);

最后,让它流向:return$returnVal;

有道理吗?

您可以使用服务定位器式模式:在应用程序启动时,您将函数加载到键/值集合中,键是按钮名称,函数是值。当电话打来时,你会做一些类似的事情:

var handler = collection[ incomingValue ];
handler.Invoke();

(我是C#开发人员,所以把它翻译成PHP!:D)