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

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

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

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

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

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

...全文
3340 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)

7,765

社区成员

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

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