有多少IT公司禁止程序员用goto?教条主义真是害人不浅

YapingXin 2011-08-15 12:20:53
goto真的如某些人说的那么邪恶吗?

本质上说,break、continue这些无条件跳转的方式,其实都是goto的化身。你见哪个公司禁用break和continue?

Exception本质上其实就是一个大大的GOTO,哪个公司能不用exception?

goto不是不能用,而是不能滥用。但是,说实话我很少看到滥用goto的例子,在我十年编程生涯中,我见到最多的是有人因为刻意避免用goto而把代码搞得很冗长。。。真正因为滥用goto导致的bug,我十年都没碰到过几个。。。

抛砖引玉,大家有什么看法请随便拍。今天这帖子就是纯粹来散分的。

...全文
3461 110 打赏 收藏 转发到动态 举报
写回复
用AI写文章
110 条回复
切换为时间正序
请发表友善的回复…
发表回复
quanziquantao 2011-08-18
  • 打赏
  • 举报
回复
哇咔咔,我们没有禁用goto,只要用得好,功能能实现,性能不差,代码逻辑清楚,爱怎么用就怎么用,文档写明白就行了。

不就一工具么,吵吵啥呢?
hzqt210 2011-08-18
  • 打赏
  • 举报
回复
禁用goto的公司的管理肯定都没仔细看过linux内核
trojanpizza 2011-08-18
  • 打赏
  • 举报
回复
goto是个好东西 有时候非goto不可 不过大部分情况下用到goto的时候要重新审视代码结构 一般都可以规避
YapingXin 2011-08-17
  • 打赏
  • 举报
回复
我今天上午fix了一个很隐晦的bug,那个bug来自于一个底层的API。这个API提供了对某个协议包的encode和decode,这个encode和decode方法负责进行一个结构体和协议数据包中某一段二进制数据之间的相互转换。

但是,因为这个encode和decode方法没有完整地实现,就check in进去了。我不知道以前的人怎么做code review的,又是怎么做测试的,这么重要的一个问题竟然没有发现。我在调用这个encode和decode的时候,当然是信任这两个方法的,我把二进制数据decode成结构体,然后再修改了结构体中某一字段,然后再把结构体encode成二进制数据。结果,丢了几个字节的数据。我还纳闷呢,我并没有修改别的字段,怎么别的字段的对应的二进制数据丢了呢?一跟踪才发现。

这里所涉及到的代码中并没有goto。可是出了错一样很隐晦很难找。

我想说什么呢?如果一个程序员不拿出专业的态度来写代码,是很容易创造出隐晦的bug的。这个和goto无关,和程序员的素质有关。
YapingXin 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 84 楼 nongyan90 的回复:]
goto会降低代码的可读性是事实,而break,continue,Exception的确很好用,goto要用的话,整个代码应该严格限制goto的数量。
[/Quote]

抱歉,我想纠正你一下:
不应严格控制goto的数量,而应该规范goto的用法。
PG 2011-08-17
  • 打赏
  • 举报
回复
出于维护和可读性问题,很多公司都选择禁用goto
user_ABCD 2011-08-17
  • 打赏
  • 举报
回复
上个引用引错了,本来是对 83#说的
user_ABCD 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 83 楼 wuzhxun 的回复:]

引用楼主 xinyaping 的回复:
goto真的如某些人说的那么邪恶吗?

本质上说,break、continue这些无条件跳转的方式,其实都是goto的化身。你见哪个公司禁用break和continue?

Exception本质上其实就是一个大大的GOTO,哪个公司能不用exception?

goto不是不能用,而是不能滥用。但是,说实话我很少看到滥用goto的例子,在我……
[/Quote]

你要这么说,break ,continue 也能达到这种效果
user_ABCD 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 81 楼 duke3030 的回复:]

goto想用就用吧,反正我想不出do { ... } while(0)这种代码到底比goto可读性好到哪里去,新手读到这种代码,可能更加困惑。
另外,在某些图像处理和AI方面的算法,goto是最高效的,不可替代的。
我最后一个观点是,设计成熟的系统,无论其规模,goto语句出现的频率是不可能太高的,因此,刻意的去禁止goto没必要
[/Quote]


这种用法一般在定义宏时使用,避免一段程序被切断
鸿雁 2011-08-17
  • 打赏
  • 举报
回复
goto我几乎不用的,常常以break和continue
YapingXin 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 106 楼 ck0074451665 的回复:]
goto,我到觉得调试的时候用到时可以滴。
[/Quote]

goto偏偏不是调试的时候用滴。。。
YapingXin 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 106 楼 ck0074451665 的回复:]

goto,我到觉得调试的时候用到时可以滴。每一个关键字都有他的用法。
如果是正文,我觉得就算了。东跳西跳的,晕头。。。
不过,刚刚我明白了一个道理:return不可以跳出一个循环啊???
我怎么有印象return可以跳出一个循环,呵呵,云头了。
[/Quote]

return将跳出当前运行的这个函数。:-)
ProjectDD 2011-08-17
  • 打赏
  • 举报
回复
我喜欢用goto 很给力 ,用goto XX的说法 不是针对 C# 的时代吧,陈谷子烂账了。
VOSTAR 2011-08-17
  • 打赏
  • 举报
回复
goto会降低代码的可读性是事实,而break,continue,Exception的确很好用,goto要用的话,整个代码应该严格限制goto的数量。
「已注销」 2011-08-17
  • 打赏
  • 举报
回复
goto,我到觉得调试的时候用到时可以滴。每一个关键字都有他的用法。
如果是正文,我觉得就算了。东跳西跳的,晕头。。。
不过,刚刚我明白了一个道理:return不可以跳出一个循环啊???
我怎么有印象return可以跳出一个循环,呵呵,云头了。

wuzhxun 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 xinyaping 的回复:]
goto真的如某些人说的那么邪恶吗?

本质上说,break、continue这些无条件跳转的方式,其实都是goto的化身。你见哪个公司禁用break和continue?

Exception本质上其实就是一个大大的GOTO,哪个公司能不用exception?

goto不是不能用,而是不能滥用。但是,说实话我很少看到滥用goto的例子,在我十年编程生涯中,我见到最多的是有人因为刻意避……
[/Quote]
break是跳出循环执行循环后面的代码(往后跳),continue是跳回循环的入口(往前跳,且仅仅限于跳到循环入口),而goto可以任意向前后跳,这样如果有的程序代码一多,goto也多的话,程序在上上下下的跳着执行,是很恐怖的,暂且不论代码是否容易引起崩溃,代码阅读理解也很困难。因为读着读着,说不定又跑到第一条语句了,就像多线程那样,很比较难调试。。。
shujiezhang 2011-08-17
  • 打赏
  • 举报
回复
如果能控制住滥用goto,用用也无妨。

不过大部分公司都控制不住,有些时候,有了goto 1,慢慢就会有了goto 2,一个函数到处是goto,已知goto到N,那就不好了。
duke3030 2011-08-17
  • 打赏
  • 举报
回复
goto想用就用吧,反正我想不出do { ... } while(0)这种代码到底比goto可读性好到哪里去,新手读到这种代码,可能更加困惑。
另外,在某些图像处理和AI方面的算法,goto是最高效的,不可替代的。
我最后一个观点是,设计成熟的系统,无论其规模,goto语句出现的频率是不可能太高的,因此,刻意的去禁止goto没必要
七色鸟 2011-08-17
  • 打赏
  • 举报
回复
学习下。
YapingXin 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 103 楼 darwin2005 的回复:]
只有没有没有经验的人才会怀疑goto危害。
[/Quote]

只有缺乏实际工程经验的人,才会认为如果放开对goto的限制,专业程序员们就会趁机大量地、泛滥地用goto。


非专业程序员不在本人考虑范围之内。对于非专业的程序员来说,各种不规范,各种无厘头,光禁止他们用goto是远远不够的,需要考虑的是禁止他们上岗,或者禁止他们的代码经老鸟code review之前擅自check in的问题。
加载更多回复(90)
内容概要:本文围绕“非线性流量的数据驱动Koopman模型预测控制研究”展开,提出一种基于数据驱动的Koopman算子理论方法,用于构建非线性系统的线性化状态空间模型,并结合模型预测控制(MPC)实现对复杂非线性系统的高效控制。研究通过引入扩展动态模态分解(EDMD)等观测函数,将非线性动力学映射至高维特征空间,在该空间中实现近似线性化表征,进而融合线性MPC框架进行优化求解。全文系统阐述了Koopman算子的数学基础、隐式线性化机制及在非线性流量控制中的建模流程,并通过Matlab代码完成了算法实现与仿真实验,验证了该方法在处理无精确物理模型、强非线性、时变动态系统中的有效性与鲁棒性,尤其适用于工业流程控制、能源系统调度等实际工程场景。; 适合人群:具备自动控制理论、非线性系统分析基础,熟悉Matlab编程,从事控制工程、系统辨识、智能优化、能源系统建模等方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于难以建立精确数学模型的复杂非线性系统(如流体动力系统、电力电子系统、机器人动力学等)的建模与实时控制;②实现数据驱动下的模型预测控制,提升系统响应速度与控制精度;③为先进控制策略(如MPC)提供一种可行的线性化建模范式,推动现代控制理论与数据科学、机器学习的深度融合。; 阅读建议:建议读者结合提供的Matlab代码深入理解Koopman方法的具体实现过程,重点关注观测函数构造、核函数选择、矩阵逼近、降维处理及MPC控制器设计等关键技术环节,并尝试将其迁移至其他非线性系统中进行复现实验与性能对比,以全面掌握其适用范围与局限性。

7,776

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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