被迫向GOTO施加压力

Dan*_*ath 63 legacy goto

我们的工作情况是,在已经感染了意大利面条代码的现有代码中添加新功能时,处理遗留(核心)系统的开发人员正在被迫使用GOTO语句.

现在,我明白可能存在使用"只需一个小GOTO"的论据,而不是花时间重构一个更易于维护的解决方案.问题是,这个孤立的"只有一点GOTO"并不是那么孤立.每周至少一次左右有一个新的"一点GOTO"要添加.由于代码可追溯到1984年或之前的GOTO,这使得许多Pastafarians认为它受到了Flying Spaghetti Monster本身的启发,因此这个代码库已经令人恐惧.

不幸的是,这里编写的语言没有任何现成的重构工具,因此更难以推动'Refactor以后提高生产力',因为短期胜利是这里唯一值得关注的胜利......

有没有其他人经历过这个问题,即每个人都同意我们不能添加新的GOTO来将2000行跳到一个随机区域,但是Anaylsts一直坚持这样做只是这一次并让管理层批准它?

tldr;

如何解决开发人员被迫(强制)不断添加GOTO语句的问题(通过添加,我的意思是添加跳转到随机区域多行),因为它" 更快地获得功能"?

我开始担心我们可能会失去有价值的开发人员而不是这个...

图片来源:XKCD

澄清:

here

alsoThere:不,我在谈论那种从一个子程序中跳出1000行到另一个子程序中途的goto. somewhereClose

there:我甚至没有谈论你可以合理阅读的那种类型,并确定一个程序正在做什么. alsoThere

somewhereClose:这是制作肉丸的那种代码midpoint: 如果第一次在这里转到 nextpoint detail:(每一个几乎完全不同)转到 pointlessReturn

here:在这个问题中,我并没有谈论偶尔使用goto.去there

tacoBell:它刚刚回到绘图板. Jail

elsewhere:当分析师每周花一些时间来解决程序正在做什么时,你的代码库就会出现问题.事实上,我实际上取决于我的,hell:如果不是最新的goto goto 4转换goto detail pointlessReturn: goto tacoBell

Jail:实际上,只是一个小胜利的小更新.我花了4个小时一次重构这个特定程序的一部分单个标签,因为我去了svn中的每次迭代.每一步(其中约20)为短小,逻辑和足够容易转到 bypass nextpoint:自发地跳出你一顿,并在您完成一些奇怪的那种面条,肉丸磁性的屏幕.转到 elseWhere bypass:合理地验证它不应该引入任何逻辑更改.使用这个新的更易读的版本,我与分析师坐下来,现在几乎完成了所有这些变化. end

4:第一次*如果第一次在这里转到hell,没有第二次,如果第一次在这里转到 hell,没有第三次,如果第一次在这里转到 hell第四次现在最新转到 hell

end:

twk*_*twk 28

由于错误编写的GOTO引入了多少错误?他们花了多少钱给公司带来了多少钱?将问题变成具体的问题,而不是"这感觉很糟糕".一旦你能够被负责人认为是一个问题,就把它变成一个政策,比如"除了简化函数的退出逻辑之外没有任何新的GOTO",或"没有新的GOTO用于任何不能执行的功能"拥有100%的单元测试覆盖率".随着时间的推移,收紧政策.

  • 要摆脱问题,摆脱那些写错误的人.完成正确后,goto没有错. (5认同)

Igo*_*aka 12

GOTO没有制作好的代码意大利面条,还涉及到许多其他因素.这个linux邮件列表讨论可以帮助我们了解一些事情(Linus Torvalds关于使用gotos的大局的评论).

试图制定一个"没有goto政策"只是为了没有得到任何东西,从长远来看不会产生任何影响,并且不会使你的代码更易于维护.这些变化需要更加微妙,并专注于提高代码的整体质量,思考平台/语言的最佳实践,单元测试覆盖率,静态分析等.

  • 很多人都忘记了Dijkstra信的背景.问题不在于GOTO声明.问题在于,在20世纪60年代制造的语言往往缺乏像"while"语句那样的基本控制流程,你*必须*使用GOTO来完成任何事情. (7认同)
  • 很公平,这很邪恶. (4认同)
  • 我会阅读清单,但它在工作时被阻止(我以前可能在家里看过它).让我向你保证GOTO的这种用法我们一直困扰着******意大利面条代码.毕竟,为什么不跳出从一个子程序循环到另一个子程序中的if块的中间... (3认同)
  • 我构建了静态分析工具.GOTO不会使静态分析变得特别困难; 它很容易建立一个代码的真实流程图,包括转到愚蠢地方的GOTO.静态分析难的是疯狂的范围规则(C++),复杂或隐藏的数据流(COBOL),以及带有强制转换的函数的指针(C ),或(唯一的GOTO问题)和间接GOTO.GOTO让人发疯,因为参考代码很远,并且不适合程序员可能拥有的程序结构模型中的任何地方.他们没有太多打扰静态分析仪,因为这样的分析仪没有任何意见. (3认同)
  • Dijkstra也对正式静态分析感兴趣,当goto显示(或内存访问,或异常,或......)时,它会获得尖叫的heebies. (2认同)