在switch语句中重复代码

时间:2013-09-02 14:59:08

标签: php c++

我已经切换了这样的语句:

switch(x){
    case a:
         executeSth();
         executeA();
    break;
    case b:
         executeSth();
         executeB();
    break;
    ...
}

所以executeSth();应该总是执行,除非在默认情况下,但在它之后调用一些特定于案例的代码(executeA();或executeB()等)。 (所以简单地将它放在开关前面是行不通的。)

是否有一种有效的方法来减少“executeSth();”的数量没有牺牲性能?

我只能想象将它分成两个开关(一个执行executeSth()和一个执行特定代码)但这会牺牲性能。也许你有更好的想法?

我基本上习惯于c / c ++或php的代码。我的目标是最小化代码大小,并且在c / c ++的情况下,可以生成可执行文件的大小。

编辑:是的,功能的顺序很重要。 Edit2:我没有php或c ++之间的选择,我需要它尽可能好。

6 个答案:

答案 0 :(得分:7)

嵌套switch是一个选项...

这使用了两个开关,但第二个没有在default情况下触发,因此具有略微更好的性能配置文件,而不仅仅是两个内嵌式开关。

switch($x) {
    case a: case b: case c:
        executeSth();
        switch($x) {
            case a:
                executeA();
                break;
            case b:
                executeB();
                break;
            case c:
                executeC();
                break;
        }
        break;
    default:
        ...
}

或者,变量函数可以完成工作......

这是一个可以使用的PHP选项,尽管很多人不喜欢变量函数。如果你想完全删除嵌套和放大,这可能是最好的选择。重复。

switch($x) {
    case a:
        $function = "executeA";
        break;
    case b:
        $function = "executeB";
        break;
    case c:
        $function = "executeC";
        break;
    default:
        ...
}

if(isset($function)) {
    executeSth();
    $function();
}

我还做了一点live test bed here,如果有人想在发布之前测试他们的PHP解决方案工作(case 10应该executeSth()executeA(),{{1应该case 20executeSth()executeB() default}。

在C ++中,您可以使用函数指针实现与上面相同的

当我写这篇文章的时候,我有一个完全的大脑放屁,谢天谢地提醒我,我们可以用一个简单的函数指针来做这件事。

executeDefault()

注意:我出去所以没有检查这些语法。我使用的语法是C语法,可能需要进行一些小的更改才能在C ++中工作。

答案 1 :(得分:2)

你可以做什么(虽然它可能不是最易读的解决方案),如果你使用PHP 5.3及以上版本,你可以创建如下方法:

function mymethod($funcToCall){
   executeSth();
   $funcToCall();
 }

并且如下所示:

switch(x){
case a:
     mymethod('executeA');
break;
case b:
     mymethod('executeB');
break;
...
}

答案 2 :(得分:1)

除非真的存在大量此类事情,否则我会保留原样。

一种解决方案当然是将executeSth的调用转移到executeA定义和executeB定义中 - 这当然只有在有多个地方具有类似代码的情况下才有意义 - 如果只有一个地方,你已经将两行代码从一个地方移动到另一个地方。

另一种解决方案可能是将函数executeAexecuteB作为参数传递给executeSth。但它只会让阅读变得更加复杂。

一般来说,我会说“较小的代码”不一定是“更好的代码”。关键是尽可能使代码清晰(当然,仍然可以实现合理的性能和代码大小)。

在C ++中,我还希望如果executeSth很小,它会被内联到案例代码中。因此,在进行一个或两个函数调用之间没有开销差异。

答案 3 :(得分:0)

为什么不在默认情况下设置一个标志,然后,在switch语句之后,如果没有设置标志(这意味着它不是默认情况),则执行common函数?这听起来像是一个合理的解决方案。

$flag = false;
switch(x){
    case a:
         executeA();
    break;
    case b:
         executeB();
    break;
    default:
         ... // other stuff
         $flag = true;
    break;
}

if ( !$flag )
    executeSth();

修改

我误解了这个问题。 对于相反的顺序,您可以将可能的情况放在变量中,然后使用PHP中的in_array或C ++中的strstr(不确定是否有更好的本机函数):

if ( !in_array(x, cases) {
    executeSth();
}
switch(x){
    case a:
         executeA();
    break;
    case b:
         executeB();
    break;
    ...
}

答案 4 :(得分:-1)

代码大小说:没关系。可读性> codesize。

也许你可以为你的executeSth()编写类似的东西:

if(!notDefault){
  executeSth();
}

答案 5 :(得分:-1)

(C ++)让预处理器为你复制代码? (Dᴏɴ'ᴛUꜱᴇTʜɪꜱʜɪꜱMᴀɪɴᴛᴀɪɴᴇᴅCᴏᴅᴇʙᴀꜱᴇ。这可能会影响可读性。我认为双开关解决方案很好。)

#define CASE(n) case n: printf("non-default\n"); _unused_label_##n

switch (x) {
CASE(1):
    printf("case 1\n");
    break;
CASE(2):
    printf("case 2\n");
    break;
default:
    printf("case else\n");
    break;
}

#undef CASE