我们在工作中遇到这样一种情况,即在遗留(核心)系统上工作的开发人员在向已经感染意大利面条代码的现有代码中添加新功能时,被迫使用 GOTO 语句。
现在,我知道使用“只需一点 GOTO”而不是花时间重构为更易于维护的解决方案可能存在争议。问题是,这个孤立的“只有一点 GOTO”并不是那么孤立。至少每周一次左右添加一个新的“一个小 GOTO”。由于可追溯到 1984 年或之前的代码充满了 GOTO,因此使用此代码库已经很恐怖了,这会让许多意大利面食者相信它的灵感来自飞行意大利面怪物本身。
不幸的是,编写此语言的语言没有任何现成的重构工具,因此推动“以后进行重构以提高生产力”变得更加困难,因为短期胜利是这里唯一关注的胜利......
有没有其他人遇到过这个问题,每个人都同意我们不能添加新的 GOTO 来将 2000 行跳转到随机部分,但不断让 Anaylsts 坚持只做一次并让管理层批准?
tldr;
如何解决开发人员被迫(被迫)不断添加 GOTO 语句(通过添加,我的意思是添加以跳转到多行之外的随机部分)的问题,因为它“更快地获得了该功能”?
我开始担心我们可能会因此而失去有价值的开发人员给猛龙队......
澄清:
去 here
alsoThere:
不,我说的是那种将 1000 行从一个子例程跳到另一个子例程中途进入 while 循环的 goto。去 somewhereClose
there:
我什至没有谈论您可以合理地阅读并确定程序在做什么的那种 goto。去 alsoThere
somewhereClose:
这是制作肉丸的代码midpoint:
如果第一次来到这里 Goto nextpoint
detail:
(每个几乎完全不同)Goto pointlessReturn
here:
在这个问题中,我不是在谈论偶尔可以使用 goto。去there
tacoBell:
它刚刚回到绘图板上。去 Jail
elsewhere:
如果每次触碰程序都需要花费数周时间来破译程序在做什么,那么您的代码库就存在严重问题。hell:
事实上,如果不是最新的 goto 4
版本的规范goto goto,我实际上是由我自己决定的detail
pointlessReturn:
tacoBell
Jail:
实际上,只是一个小小的更新,一个小小的胜利。我花了 4 个小时一次重构这个特定程序的一部分,一个标签,每次迭代都保存在 svn 中。每一步(大约 20 步)都很小、合乎逻辑,而且很容易通过某种奇怪的意大利面肉丸磁力自发地跳出你的饭菜,进入你的屏幕。 Goto合理地验证它不应该引入任何逻辑更改。使用这个新的更具可读性的版本,我已经与分析师坐下来,现在完成了几乎所有的更改。去bypass
nextpoint:
elseWhere
bypass:
end
4:
第一个 *如果第一次在这里 goto hell
,没有第二个如果第一次在这里 goto hell
,没有第三个如果第一次在这里 goto hell
第四个现在是最新的 goto hell
end: