我已经切换了这样的语句:
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 ++之间的选择,我需要它尽可能好。
答案 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 20
和executeSth()
,executeB()
default
}。
当我写这篇文章的时候,我有一个完全的大脑放屁,谢天谢地提醒我,我们可以用一个简单的函数指针来做这件事。
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
定义中 - 这当然只有在有多个地方具有类似代码的情况下才有意义 - 如果只有一个地方,你已经将两行代码从一个地方移动到另一个地方。
另一种解决方案可能是将函数executeA
或executeB
作为参数传递给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