【问题标题】:How to make my code cleaner in this case (switch case / if else)在这种情况下如何使我的代码更清晰(switch case / if else)
【发布时间】:2015-11-10 03:05:56
【问题描述】:

我正在使用 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 语句。所以我尝试将其更改为 switch-case 语句。

    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语句。

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

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

【问题讨论】:

  • 你可以使用多个完整的ifs...但尽量统一使用“!=”或“==”...我更喜欢只使用“==”...你可以将输出存储在一个var中,并且只为每个if设置,最后只返回一个时间

标签: php coding-style


【解决方案1】:

就个人而言,您在下面显示的 case 语句看起来可读且实用。我从经验中发现,即使您有一些重复的台词,也绝对不是要走的路。不过,你甚至没有真正重复台词。如果您要尝试将其分离为函数,那么在函数中包含函数看起来会非常多余。

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

例如,而不是去:

return myFunction($param);

使用这个:

$returnVal=myFunction($param);

最后,让它流向: 返回 $returnVal;

有意义吗?

【讨论】:

    【解决方案2】:

    您可以使用服务定位器式模式:在应用程序启动时,您会将函数加载到键/值集合中,键是按钮名称,函数是值。当来电时,您会执行以下操作:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多