我们当年在大学学习c语言的时候,讲到goto语句时老师就是一带而过,说了这么一句话,尽量不要多用goto!
对了,是尽量不要多用,而不是说不要用。其实goto语句在某些业务场景下是非常有用的,我下面就稍微讲一两个项目中使用goto语句的场景。
最近完成了一个学籍照片采集的软件项目开发,其中有两处用了goto语句,这两处goto语句的用法应该是比较适合当做场景来说一说的。
第一个场景是用户引导界面,由于我们的项目采用c++加MFC的技术框架,业务层采用纯c++,UI采用CDialog,当用户提出需要用户引导界面来执行连接相机、配置工作目录以及导入学籍数据这三个界面的时候,当时挺费了一点神,到底怎么做才能既简单的完成业务需求,有能保持代码简洁。
一下子就想到了goto语句,三个界面分别按顺序来写,然后根据添加相关的条件判断,就是说,如果已经设置了,就不再弹出对话框,最后在条件中添加goto语句,如果是上一步,则goto到上一步的对话框,如果是下一步则如果这一步验证通过则跳转到下一步。
这种场景,采用goto语句可以非常简单的得到处理。
第二个场景是在处理人脸识别的时候,由于压缩参数的问题,会导致识别出多个人脸的情况,应客户要求,需要增加识别的灵敏度,我们采用的解决方法是,采用双参数模式,如果第一个参数不能完成业务,则使用第二个参数来执行。如果第二个参数执行错误,则直接报错。
这里面有一个业务场景的问题,因为我们的软件对用户的专业要求比较低,人脸是通过程序自动寻找的,所以在某些情况下,由于背景问题,而导致算法检测人脸出错,而这种错误可以通过调整压缩比例来避免。
在这里,我们在执行第一次检测过程后,判断结果,如果检测成功,则继续,如果检测失败,则调整参数重新执行一次,这里重新执行就是使用goto语句直接调整到相应的程序段落。
这两个地方采用了goto语句,非常优雅而又简洁的解决了问题。
最后我们总结一下,在哪些情况下可以使用goto语句来解决问题:
1、整条业务是单线程的,也就是说无论什么时候执行,只有一个线程在执行此段程序;
2、顺序的几段程序之间有一定的承前启后的线性关系的,这种关系是单向的、固定的;
3、在某些条件下,需要修改程序段中的参数值并且重新执行此段程序的。