do{}while(0) 的利用
最近在weibo看到一篇c++利用do{}while(0)来做流程控制,减少goto语句的重复代码量,感觉想法很不错,这里我们假设一个场景,让js也能利用一把do{}while(0)的妙处。 设计场景:
流程可能出现condtion4种情况,当出现condition1-3时,期望执行dosomething1,当出现condition4时,期望执行dosomething2,否则默认执行dosomething3, 同时我们要记录每个condition情况的日志,do_log 我们可能写出如下伪代码: 注,这里我们假设不能够利用switch…case
function if_else(condition){
if( condtion1 ){
do_log_c1
do_something_1
}
else if( condtion2 ){
do_log_c2
do_something_1
}
else if( condtion3 ){
do_log_c3
do_something_1
}
else if( condtion4 ){
do_log_c4
do_something_2
}
else{
do_log_c5
do_something_3
}
}
这样我们就利用if和else完成了整个流程的代码,接下来我们利用do{}while(0) 来重写这个流程控制:
function do_while(condition){
do{
if( condition1){
do_log_c1
break;
}
if( condition2) {
do_log_c2
break;
};
if( condition3) {
do_log_c3
break;
};
if( condition4){
do_log_c4
do_something_2
return;
}
else{
do_log_c5
do_something_3
return;
}
}while(0);
do_something_1;
}
这样我们就少写了几遍do_something_1这段代码了,感觉是不是很好?
4 回复
把break换成||不是更短么……
这样比较直观啊,干嘛要再引进个do … while呢?
function do_while(condition){
if (condition1 || condition2 || condition3) {
do_something_1;
} else if (condition4) {
do_something_2;
} else {
do_something_3;
}
}
@boris @leizongmin 确实文章写的不够严谨啊,还有个需求是要根据condtion条件来记录不同的日志,这样do{}while(0)就可以起到一定的流程控制作用了,感觉属于魔法代码,见仁见智的利用吧
switch控制流程也可以