Nodejs中do{}while(0) 的利用

Nodejs中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这段代码了,感觉是不是很好?


5 回复

标题:Node.js 中 do {} while(0) 的利用

内容:

最近在微博上看到一篇关于 C++ 中使用 do {} while(0) 进行流程控制的文章,减少了 goto 语句的重复代码量。这种思路非常有趣。我们可以将这种技巧应用到 Node.js 中,来简化我们的代码逻辑。

设计场景

假设我们有四种条件(condition1condition4),当出现 condition1condition3 时,我们希望执行 doSomething1 函数;当出现 condition4 时,我们希望执行 doSomething2 函数;如果以上条件都不满足,则执行 doSomething3 函数。同时,我们需要为每种条件记录日志。

为了实现上述需求,我们可以使用 do {} while(0) 结构来简化代码逻辑。首先,我们假设不能使用 switch...case 语句。

传统方法

以下是传统的 if-else 实现方式:

function ifElse(condition) {
  if (condition === 'condition1') {
    doLog('condition1');
    doSomething1();
  } else if (condition === 'condition2') {
    doLog('condition2');
    doSomething1();
  } else if (condition === 'condition3') {
    doLog('condition3');
    doSomething1();
  } else if (condition === 'condition4') {
    doLog('condition4');
    doSomething2();
  } else {
    doLog('default');
    doSomething3();
  }
}

使用 do {} while(0)

现在我们使用 do {} while(0) 结构来重写这个流程控制:

function doWhile(condition) {
  do {
    if (condition === 'condition1') {
      doLog('condition1');
      break;
    }
    if (condition === 'condition2') {
      doLog('condition2');
      break;
    }
    if (condition === 'condition3') {
      doLog('condition3');
      break;
    }
    if (condition === 'condition4') {
      doLog('condition4');
      doSomething2();
      return;
    } else {
      doLog('default');
      doSomething3();
      return;
    }
  } while (0);
  doSomething1();
}

解释

通过 do {} while(0) 结构,我们可以在循环体内部使用 breakreturn 语句来提前退出循环。这使得我们能够更简洁地处理多个条件分支,并且避免了重复编写 doSomething1() 代码。每次条件匹配时,我们使用 break 语句跳出循环,从而避免了后续条件的检查。如果所有条件都不匹配,则最后会执行 doSomething1()

这种方法可以有效减少代码的冗余,提高代码的可读性和维护性。


把break换成||不是更短么……

这样比较直观啊,干嘛要再引进个do … while呢?

function do_while(condition){
  if (condition1 || condition2 || condition3) {
    do_something_1;
  } else if (condition4) {
    do_something_2;
  } else {
    do_something_3;
  }
}

switch控制流程也可以

在 Node.js 中,do {} while (0) 结构可以用来简化条件判断的代码,并减少重复的代码量。这个结构可以被用来模拟 switch-case 逻辑,同时避免使用 goto 语句。

以下是一个示例,展示了如何在 Node.js 中使用 do {} while (0) 来实现类似的功能:

function processCondition(condition) {
    let result = 'default';

    do {
        if (condition === 'condition1') {
            console.log('Logging condition1');
            break;
        }
        if (condition === 'condition2') {
            console.log('Logging condition2');
            break;
        }
        if (condition === 'condition3') {
            console.log('Logging condition3');
            break;
        }
        if (condition === 'condition4') {
            console.log('Logging condition4');
            result = 'do_something_2';
            break;
        }
        console.log('Logging default condition');
        result = 'do_something_3';
    } while (0);

    switch (result) {
        case 'do_something_2':
            console.log('Executing do_something_2');
            break;
        case 'do_something_3':
            console.log('Executing do_something_3');
            break;
        default:
            console.log('Executing do_something_1');
            break;
    }
}

// 示例调用
processCondition('condition1'); // Logging condition1, Executing do_something_1
processCondition('condition4'); // Logging condition4, Executing do_something_2
processCondition('other');      // Logging default condition, Executing do_something_3

解释

  1. do {} while (0): 这个结构保证了循环体只会执行一次,并且可以通过 break 提前退出循环。
  2. 条件判断: 在循环体内通过多个 if 语句进行条件判断,一旦匹配到某个条件,则进行相应的日志记录并使用 break 提前退出循环。
  3. 默认处理: 如果所有条件都不满足,则执行默认的处理逻辑。
  4. 结果处理: 使用 switch 语句根据 result 的值来决定最终执行哪个函数。

这种方式避免了重复的代码,使得代码更加简洁和易于维护。

回到顶部