分享

实战技巧:goto语句的替代实现方式(转载)

 xzm_afterDe 2015-08-27
 

实战技巧:goto语句的替代实现方式

分类: Android C/C++ Java 4996人阅读 评论(4) 收藏 举报

曾几何时,goto是多么的让牛人绽放他们高超的精湛技术

曾几何时,goto又变成了万恶之首

曾几何时,goto只在教科书中的示例才会出现

有太多的理由不让用goto,但有时,我们又想使用goto的功能,怎么办?

用try/catch/finally便可实现同等于goto的功能,来看二个示例:

  1. try {  
  2.       // operation one  
  3.       if (failed) {  
  4.             throw Exception;  
  5.       }  
  6.   
  7.       // operation two  
  8.       if (failed) {  
  9.             throw Exception;  
  10.       }  
  11.   
  12.       // operation three  
  13.       if (failed) {  
  14.            throw Exception;  
  15.       }  
  16. catch (Exception e) {  
  17.       // do something when cases failed  
  18. }  
和:

  1. try {  
  2.      // operation one  
  3.      if (failed) {  
  4.          return;  
  5.      }  
  6.   
  7.      // operation two  
  8.      if (failed) {  
  9.          return;  
  10.      }  
  11.   
  12.       // operation three  
  13.       if (failed) {  
  14.           return;  
  15.       }  
  16. finally {  
  17.       // do something when failed  
  18. }  
以上二段都等同于:

  1.        // operation one  
  2.        if (failed) {  
  3.            goto when_failed;  
  4.        }  
  5.   
  6.        // operation one  
  7.        if (failed) {  
  8.            goto when_failed;  
  9.        }  
  10.   
  11.        // operation one  
  12.        if (failed) {  
  13.            goto when_failed;  
  14.        }  
  15. when_failed:  
  16.        // do something when failed  

用异常的方式有些暴力,但确实能正确的帮助实现类似goto的功能;用return和finally虽不是很暴力,但是比较难控制,因为涉及到return语句,它会在finally块执行后得以执行,所以如果不想退出程序的话,这个方法还不如用异常来控制。

另外,break, continue也是比较强大的跳转语句,特别是break label和continue label,可以跳出一层循环或是多层循环; 但是要注意一点的是break只能在循环语句和switch语句中使用,continue只能在循环语句中使用。所以它们的局限性也很大。 

这个小示例说明,goto不单单是一个语句,它是一种解决问题的思路和编程习惯,习惯了它的人,或者是想用它的人,即使不用goto也会写出类似goto逻辑出来。它的优点是会更容易的帮助找出解决方案。它的缺点也是众人皆知。但我们要避免的不单单是一个goto语句,而是这种“跳转式”的解决思路和编程习惯。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多