代码之家  ›  专栏  ›  技术社区  ›  ftdysa

这是一个糟糕的模式吗?(内部切换for/eforeach循环)

  •  9
  • ftdysa  · 技术社区  · 16 年前

    我发现自己正在编写以下代码:

    foreach($array as $key => $value) {
        switch($key) {
            case 'something':
                doSomething($value);
                break;
            case 'somethingelse':
                doSomethingElse($value);
                break;
        }
    }
    

    if($array[0] == 'something') {
        doSomething($array[0]);
    }
    if($array[1] == 'somethingelse') {
        doSomethingElse($array[1]);
    }
    

    (或类似的东西)

    如果需要,我可以发布确切的代码,但这是发生的事情的大致轮廓。请不要批评,但请记住,我在这里寻求帮助。所以,如果我做错了什么,那就指出吧。

    6 回复  |  直到 16 年前
        1
  •  15
  •   Emil Vikström    13 年前

    将函数映射到字典/关联数组中的键是这种情况下的一种常见方法(正如@jldupont所提到的)——不仅在PHP中,而且在许多具有关联数组的动态语言中。例如,Python和Lua甚至没有 switch语句——这几乎是模拟交换机的唯一方法。

    考虑这种方法:

    <?
    $arr[] = "bye";
    $arr[] = "hi";
    
    function sayHi() { print("Hello.\n"); }
    function sayBye() { print("Goodbye.\n"); }
    
    $funcs["hi"] = sayHi;
    $funcs["bye"] = sayBye;
    
    foreach($arr as $k){
        $funcs[$k]();
    }
    
    ?>
    

    输出:

    Goodbye.
    Hello.
    

    当你只有两个不同的值时,这是多余的,但随着你必须覆盖的情况数量的增加,这显然是一种更有价值的方法。

        2
  •  5
  •   jheddings    16 年前

    我倾向于在foreach循环中使用开关。依我之见,它比一堆if还脏。

    您可以将开关置于其他功能中,例如:

    foreach($array as $key => $value) {
       doTransaction($key , $value);
    }
    
    ...
    
    function doTransaction($key, $value){
         switch($key) {
            case 'something':
                doSomething($value);
                break;
            case 'somethingelse':
                doSomethingElse($value);
               break;
        }
    }
    
        3
  •  4
  •   Nettogrof    16 年前

    这不是一个“坏”的解决方案,但一如既往,还有其他选择。例如,您可以去掉switch语句,对字符串使用解释型处理程序。这类似于函数指针列表,但您不必保持列表最新以添加新行为;只需将新函数添加到处理程序中即可处理它。

    $array = array(
      "something" => "itsasecret",
      "somethingelse" => "i can't tell you",
    );
    
    class Handler {
      static function something($value) {
        printf("something: %s\n", $value);
      }
    
      static function somethingelse($value) {
        printf("somethingelse: %s\n", $value);
      }
    }
    
    $handler = new Handler();
    foreach($array as $key => $value) {
      $handler->$key($value);
    }
    

    您可能需要一些代码来清理输入字符串,并确保该方法存在于您的处理程序中,但这可能会给您一些想法。

        4
  •  1
  •   jldupont    16 年前

    还有(至少)另一种可能性:使用字典查找将工作分配给函数。

        5
  •  0
  •   inked    16 年前

    试试这个:

    使用开关和if对每个版本运行一百万次。每次跑步的时间。

    让我们知道哪一个跑得更快。

        6
  •  0
  •   DOOManiac    16 年前

    这没什么不对的。

    如果你只有两三个项目,为了代码的复杂性,我会选择If。如果你有超过5个,我肯定会选择这个开关。..