如何重构 GWBASIC 代码中的 GOTO 语句?

How do I refactor out GOTO statements in GWBASIC code?

我目前正在将一堆旧的 GWBASIC 代码重构为 python,以便它可以 运行 在较新的机器上。它们都是旧的工程数学程序,数学量很大,并且在整个过程中大量使用 GOTO 语句。

我只是想知道你是如何重构语句的?您是只在全局范围内声明所有变量并编写将修改它们的函数,还是我只需要重写程序逻辑以便传递值有意义,或者有更好的方法吗?

下面的代码片段:

25 INPUT "EXISTING FILE (Y/N)";EF$
30 IF EF$="Y" OR EF$="y" THEN 4000
40 LOCATE 4,1:PRINT USING "<######> NUMBER OF JOINTS";NON+1;:GOSUB 1400:IF D$="" THEN 50 ELSE NON=VAL (D$)-1
50 PRINT:PRINT USING "<######> NUMBER OF MEMBER GROUPS";MG+1;:GOSUB 1400:IF D$="" THEN 60 ELSE MG=VAL (D$)-1
60 PRINT:PRINT USING "<######> NUMBER OF MEMBERS";M+1;:GOSUB 1400:IF D$="" THEN 70 ELSE M=VAL (D$)-1
70 PRINT:PRINT USING "<######> NUMBER OF SUPPORTS";NS+1;:GOSUB 1400:IF D$="" THEN 75 ELSE NS=VAL (D$)-1
75 E=200000!:PRINT:PRINT USING "<#########> YOUNGS MODULUS (MPa)";E;:GOSUB 1400:IF D$="" THEN 80 ELSE E=VAL (D$)
80 TEC=.0000117:PRINT:PRINT USING "<##.##^^^^> THERMAL EXPANSION COEFFICIENT";TEC;:GOSUB 1400:IF D$="" THEN 90 ELSE TEC=VAL (D$)
90 GRAV=7850:PRINT:PRINT USING "<#########> MATERIAL DENSITY (kg/m^3)";GRAV;:GOSUB 1400:IF D$="" THEN 180 ELSE GRAV=VAL (D$)
180 DIM N(NON,1),MG(MG,1),M(M,3),ID(M,10),NC(NON,2),SD(NS,3),FE(M,5),R(5),C(5,5),E(5),T(5),SR(NS,2),LD(30,7),LN$(30),TE(M),MD$(MG)
190 F=-1:GOTO 200
195 CLS:F=-1:PRINT:PRINT USING "<###> JOINT NUMBER";F+2;:GOSUB 1410:IF D$="" THEN 200 ELSE F=VAL (D$)-2
200 CLS:PRINT:PRINT"JOINT DATA"
205 F=F+1:IF F>NON THEN 250
210 PRINT:PRINT"JOINT  ";F+1;:PRINT TAB(15);:PRINT USING "<#######>  X CO-ORD (mm)=";N(F,0)*1000!;:INPUT ;D$:IF D$="R" OR D$="r" THEN 1500
220 IF D$="" THEN 230 ELSE N(F,0)=VAL (D$)/1000
230 PRINT TAB(50);:PRINT USING "<#######> Y CO-ORD (mm)=";N(F,1)*1000!;:GOSUB 1410::IF D$="" THEN 240 ELSE N(F,1)=VAL (D$)/1000!
240 GOTO 205
250 IF FL=1 THEN 1500
290 F=-1:GOTO 300

我的两分钱:

  1. 从 GOSUB 语句开始并识别代码块 实现功能(从不依赖于其他块的小功能开始)
  2. 为它编写一个python测试(基于您正在移植的gwbasic代码部分的expected/actual输出)
  3. 将函数(第 1 点中标识的 gwbasic 块)移植到 Python
  4. 运行测试是否passes/fails

想法是使用测试来证明新系统的行为与旧系统相同。

HTH.

参考: paper on test-driven porting

如果您只想 运行 现代机器上的代码,您可以 运行 使用 PC-BASIC 并节省重构工作。

当然,这不会使代码更易于理解或更易于维护...