スパゲティプログラム

出典: フリー百科事典『ウィキペディア(Wikipedia)』

: spaghetti program: spaghetti code使[1]


(1977)

[]


辿1

[ 1]

1980[?]BASIC使

[ 2][ 3]使

OSAPI

[2]

[?]


[]




JavaScript

[]

goto[]


gotoBASICgoto

BASICBASICgotoifgoto使returnGOSUBgotoBASICBASICGOTOBASICBASICVisual Basic for Applications (VBA) Visual Basic .NET (VB.NET) 2023使

PascalCgotoBASIC使[ 4]

C++Javabreakgotogoto使C#gotogotoreturn[3]

goto使使

Cgoto使[ 5]

使使

使[]


使使寿[6]

使JavaC#C/C++

Singleton 使

C/C++1[7]

使使

[8][9]使

[]


C++使DelphiJavaC#使goto[10]Effective C++Effective Java

[]


使1調使[11]

 (structured concurrency) [12]

[]


GUII/O[13]Future async/await

[]


使使[14]C++

しかたなくスパゲティプログラムにしてしまった事例[編集]




1980Goto使使

CPUApple II65C02Undocumented instruction使III退[]

スパゲティプログラムが許容、放置された具体例[編集]

1980年代のメモリ量が限られていた時代には、プログラムのバイト数を圧縮する技を競い合う誌上コンテンストなどが開催されていて、そこではスパゲティプログラムが許容された。例えば、雑誌MSX・FANの投稿プログラムコーナー『ファンダム』で事実上のスパゲティプログラムが許容されてしまっていた。特に「1画面プログラム」すなわち行番号を含めた40×24文字のショートプログラムを多数採用・掲載しており、行から行へと、標準的ではない手法でジャンプをさせるようなコードが横行した。

たとえば次のようなものである。

  • 行内の分岐に関わるIF文の使用を極力避けてしまう (if文を終了するには行を終了するしか方法が無かった為)
  • NEXTの対象変数を書かない

たとえばBASICにおけるトリガー入力待機ルーチンは通常

10 IF STRIG(0)=0 THEN GOTO 10

と記述するのに対し、1画面プログラム採用作品では

10 FORI=0TO1:I=-STRIG(0):NEXT



8



*
X 028
10 CLS
20 LET X=14
30 LOCATE X,10:PRINT " ";
40 LET S=STICK(0)
50 IF S=3 THEN X=X+1: IF X>28 THEN X=28
60 IF S=7 THEN X=X-1: IF X<0 THEN X=0
70 LOCATE X,10:PRINT "*";
80 GOTO 30

以下はよく用いられていた圧縮方法で書かれたソース。

1 CLS:X=14
2 LOCATE X,10:PRINT" ";:S=STICK(0):X=X-(S=3)*(X<28)+(S=7)*(X>0):LOCATE X,10:PRINT"*";:GOTO 2

1
X1
MSX BASIC -10 X



() 31

スパゲティプログラムを修正する方法[編集]


使

使

[ 6]




脚注[編集]

注釈[編集]



(一)^ 11

(二)^ 

(三)^ 1使

(四)^ Csetjmp()longjmp()

(五)^ C++Object PascalC#Javausing[4]try-finallytry-with-resources[5]使gotobreak使

(六)^ 

出典[編集]

関連項目[編集]