【问题标题】:How do I refactor out GOTO statements in GWBASIC code?如何重构 GWBASIC 代码中的 GOTO 语句?
【发布时间】:2015-11-11 00:41:37
【问题描述】:

我目前正在将一堆旧的 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

【问题讨论】:

    标签: python refactoring basic gw-basic


    【解决方案1】:

    我的两分钱:

    1. 从 GOSUB 语句开始并识别代码块 实现功能(从不依赖其他块的小功能开始)
    2. 为其编写 python 测试(基于您要移植的 gwbasic 代码部分的预期/实际输出)
    3. 将函数(第 1 点中标识的 gwbasic 块)移植到 Python
    4. 运行测试以检查它是否通过/失败

    这个想法是使用测试来证明新系统的行为与旧系统一样。

    HTH。

    参考: paper on test-driven porting

    【讨论】:

      【解决方案2】:

      如果您只想在现代机器上运行代码,您可以使用PC-BASIC 运行它,从而省去重构工作。

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

      【讨论】:

      • 上次我检查时 PC-Basic 不能在 64 位 PC 上运行,否则我会的!
      • @aw4lly,那可能是旧版本,也许值得再试一次——我已经在 64 位 Win10 和 Ubuntu 上成功测试了最新版本...
      猜你喜欢
      • 1970-01-01
      • 2011-01-26
      • 2015-09-22
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多