4.3.2 应该在什么时候使用goto?

GreyZeng 2021-08-07 15:23:11

原文地址
教材4.3.2中写到

函数最好有单一的出口,为了达到这一目的,可以使用goto。只要有助于程序逻辑的清晰体现,什么方法都可以使用,包括goto。

作者认为只要有助于逻辑清晰表达,使可以使用goto的。犹记得大一时接触c语言时,老师特地说过不要使用goto,goto虽然好用,但会使程序结构混乱。

于是抱着疑惑查阅了相关资料,发现主要有两种观点。一种就是不提倡使用goto,因为容易把逻辑弄乱且难以理解;另一种提倡使用goto,因为在跳出多层循环和异常处理时比较方便且效率高,很多大型项目、开源项目,包括linux都会巨量的出现goto来处理错误。所以比较好的标准就是在错误处理的时候使用goto,其他地方都禁止使用goto吗?

...全文
705 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
GreyZeng 2022-03-14
  • 打赏
  • 举报
回复

经过了一个大三下学期,我的代码总行数增长了近9000行,其中包括在软件工程课程中使用的Javascript,WXSS,WXML,C++以及其他课程使用的Python,Matlab。在这些代码中,跳转语句非常多,其中有的地方需要连接到一个语句块之外,但是所连接到的地方又无需使用多次,这个时候,如果用到goto语句,就可以极大的减少代码行数,并且使函数简单化。

​ 而且我发现,《构建之法》这本书中提到的“函数最好有单一出口,为了达到这一目的,可以使用goto。只要有助于程序逻辑的清晰体现,什么方法都可以使用,包括goto”,这一观点非常正确,一个函数最好只有一个出口,这样在逻辑上会非常清晰,并且,在Debug的时候,如果只有一个出口的话,单步调试中进出函数的过程都会非常明晰,编写程序的时候也不会错在某个出口的返回值出了问题。因此我认为,只要是符合代码规范,并且有助于代码的清晰展示,任何语句都可以使用,良好的goto语句比臃肿的if判断反而更利于阅读。

原文地址

GreyZeng 2022-03-14
  • 打赏
  • 举报
回复

目前我认为软件开发的过程中只要能够使代码实现清晰简洁,像goto这样的方法也可以考虑使用。但一般而言goto只适用于某些特殊的场景,例如所有代码分支都有统一出口或多重循环的情况。无论如何,写出让他人可以看懂的代码是最重要的。
原文地址

GreyZeng 2021-08-07
  • 打赏
  • 举报
回复

这里我仍然坚持学期初的观点,即:

  • 只有在需要错误处理而语言本身没有提供错误处理功能的情况下使用goto语句
    同时多加入两点前提:

  • 优先考虑更换开发语言

  • 同时应当在项目的README,相关函数的开头加以说明,且确保成员们受到过相关的培训

团队的一切规范都是服务于开发效率的,但是规范对于开发效率和可维护性确实有很大影响,一种不常见的规范本来就是对开发人员的一种心智负担,因此如果没有特殊需要,不要使用这样的构造。

关于开发语言,相信不少人会对此抱有疑问,但是语言本身确实有其专长,如果进行Web开发,那么去使用没有错误处理的C显然是不明智的。事实上,语言本身是根据需要构建的,如果你发现一门语言没有你需要的功能以至于你需要绕很多弯去实现,很可能你的使用方式是错误的,或者这门语言不适合解决你现在遇到的问题。不得不提一提我们项目的React(x

原文地址

GreyZeng 2021-08-07
  • 打赏
  • 举报
回复

对于这个问题,我也询问了周围同学的看法,大家的观点大都也与我在提出疑问时的观点一致,goto语句可类比于汇编程序中的跳转指令,它容易造成包含分支和循环结构的程序逻辑混乱,往往会给阅读程序代码的工作人员带来更为复杂的任务难度,因而往往不建议在程序中使用goto语句。
原文地址

GreyZeng 2021-08-07
  • 打赏
  • 举报
回复

在本学期的软工课程中并没有使用到goto,不过经过团队项目的实践,还是很认同助教的观点“在团队项目中尽量约束”。对于大佬而言,goto可以简化逻辑,但在团队合作中,如果需要阅读含有goto的代码,那会变得非常头痛。
原文地址

代码下载地址: https://pan.quark.cn/s/e828ad01234a JLink与JTAG是两种在嵌入式系统调试领域得到普遍应用的接口技术,它们为开发者提供了对微控制器进行编程、调试以及故障诊断的能力。本文旨在对这两种接口的功能机制、定义规范以及实际应用中的异同点进行细致的剖析。JTAG(联合测试行动组)是一项国际性的标准,其原始设计目的是为了电路板级别的检测,但当前更多地被用于程序的下载和调试过程。该接口通过TMS(测试模式选择)、TCK(测试时钟)、TDI(测试数据输入)、TDO(测试数据输出)和TRST(测试复位)等信号线来完成数据的输入与输出任务。其中,TCK负责提供时钟脉冲,TMS用于控制测试逻辑的状态,TDI将数据传送至设备内部,TDO用于接收设备反馈的数据,而TRST则作为一个可选的外部复位信号。JLink是由Segger公司设计并推广的一种流行的JTAG/SWD(SWD:串行线调试)调试设备。与JTAG相比,SWD接口的设计更为精简,仅需两根线缆(SWDIO和SWDCLK)即可完成数据传输与时钟同步的功能,从而有效节约了硬件资源,对于资源受限的嵌入式系统尤为适用。JLink能够兼容多种微控制器和操作系统,并提供了高速的调试速度以及包括仿真、内存编程、在线电压检测在内的一系列丰富功能。在20引脚的JTAG接口规格中,除了标准的JTAG信号外,还可能包含电源供应、地线连接以及用户可定义的引脚。此类接口常用于传统的JTAG调试场景,适合需要大量信号线的应用环境。相反,14引脚的接口规格可能是在20引脚的基础上进行了简化处理,去除了部分非关键的信号线,以便在空间布局紧凑的环境中部署。在具体操作层面,JLink能够通过USB接口与个人计算...
源码直接下载地址: https://pan.quark.cn/s/fd3758fd4dad Greenplum是一个为大数据分析而构建的开源MPP(大规模并行处理)数据库系统。该系统具备处理PB级数据的能力,并且提供高效的在线分析处理(OLAP)功能。本部分将深入探讨Greenplum的高可用性、安全防护措施以及备份方法。Greenplum的高可用性设计体现在其包含了多层次的容错体系,涵盖了硬件和软件两个层面的容错需求。在硬件配置上,Greenplum建议部署两台管理节点,其中一台作为主节点,另一台作为备用(Standby)节点,这两者之间能够实现自动化的数据同步。一旦主节点发生故障,系统可以自动切换至备用节点,从而保障数据库的持续运行。在数据节点层面,Greenplum运用镜像技术,将primary实例的数据自动复制到其他数据节点的mirror实例中。若primary实例出现故障,系统可自动识别并启动相应的mirror实例,以此确保数据的完整性以及服务的可用性。除此之外,为了降低硬件故障对系统的影响,Greenplum数据库通常采用双台网络交换机的部署方案。在常规操作中,两台交换机协同工作,达成负载均衡的目的;当一台交换机出现故障时,另一台交换机能够提供备份支持。对于服务器硬件,Greenplum数据库要求实施冗余保护措施,涉及风扇(Fan)和电源供应单元(PSU)等组件,并且采用Raid5磁盘阵列技术来保护存储数据。当需要更换新的硬盘时,Raid5能够自动完成数据的重建。在系统表和视图的管理上,Greenplum维护了多个关键系统表和视图,例如gp_segment_configuration用于记录包括master和standby在内的所有节点信息,当节点状态显...

606

社区成员

发帖
与我相关
我的任务
社区描述
程序员。写过:移山之道,编程之美,构建之法,智能之门。
软件工程软件构建团队开发 企业社区 北京·朝阳区
社区管理员
  • SoftwareTeacher
  • GreyZeng
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧