スパゲッティコードとは、保守が難しく構造化されていないコンピュータソースコードを指す軽蔑的な表現です。構造化されていないコードが開発される原因としては、不安定なプロジェクト要件、プログラミングスタイルのルールの欠如、ソフトウェアエンジニアの能力や経験不足など、さまざまな要因が考えられます。 [1]
意味
構造化プログラミング構造ではなくGOTO文を多用するコードは、複雑で保守不可能なプログラムとなり、スパゲッティコードと呼ばれることが多い。 [2] このようなコードは複雑で絡み合った制御構造を持ち、概念的にはねじれて絡まったスパゲッティのようなプログラムフローになる。 [3]
1980年に米国国立標準技術局が発行した出版物では、 「スパゲッティプログラム」という語句が「断片化され散在したファイル」を持つ古いプログラムを表すために使用されました。[4]
スパゲッティコードは、メソッドが長すぎて乱雑なクラスを作成したり、ポリモーフィズムなどのオブジェクト指向の概念を放棄したりするなど、オブジェクト指向コードが手続き型スタイルで記述されるアンチパターンを表すこともできます。[5]この形式のスパゲッティコードの存在は、システムの理解可能性を著しく低下させる可能性があります。[6]
歴史
スパゲッティ コードという語がいつから一般的に使われるようになったかは明らかではないが、ガイ スティール著の「マカロニはスパゲッティより優れている」など、1977 年にいくつかの文献が登場している。[7]リチャード コンウェイは、 1978 年の著書「PL/I、PL/CS、PL/CT を使用した規律あるプログラミングの入門書」で、プログラムは「スパゲッティの皿と同じクリーンな論理構造を持つ」と述べている。 [8]この語句は、デイビッド グリースと共著した1979 年の著書「プログラミング入門」でも繰り返されている。[9] 1988 年の論文「ソフトウェア開発と機能強化のスパイラル モデル」では、この語句は、計画性に欠け、最終的にはウォーターフォール モデルの開発につながった古い実践であるコードと修正モデルを説明するために使用されている。[10] 1979 年の著書「COBOL プログラマのための構造化プログラミング」では、著者のポール ノルが、構造化が不十分なソース コードを説明する同義語として、スパゲッティ コードとラッツ ネストという語句を使用している。 [11]
Ada – Europe '93カンファレンスでは、Adaは例外伝播メカニズムの制限により、プログラマーに「スパゲッティコードではなく理解可能なコードを作成する」ことを強いると説明されました。[12]
1981年にミシガンテクニック誌に掲載された「基本的に言えば…FORTRANバイト!!」というコンピュータ言語のパロディー記事の中で、著者はFORTRANについて「完全にスパゲッティコードで構成されている」と述べている。[13]
リチャード・ハミングは講義[14]の中で、バイナリコードによる初期のプログラミングの文脈におけるこの用語の語源について次のように説明しています。
エラーを修正する際に、省略した命令を挿入したい場合は、直前の命令を取り、それを空きスペースへの転送で置き換えます。そこに、上書きしたばかりの命令を入れ、挿入したい命令を追加し、その後メイン プログラムに転送を戻します。このようにして、プログラムはすぐに奇妙な場所への制御のジャンプのシーケンスになりました。ほとんどの場合に起こることですが、修正にエラーがあった場合は、別の使用可能なスペースを使用して、同じトリックを再度使用します。その結果、ストレージを通るプログラムの制御パスはすぐにスパゲッティの缶のように見えました。命令の実行にそれらを単に挿入しないのはなぜですか? そうすると、プログラム全体を調べて、移動した命令のいずれかを参照するすべてのアドレスを変更する必要があります。そんなことは絶対にありません!
関連フレーズ
ラビオリコード
ラビオリコードはオブジェクト指向プログラミングに特有の用語です。これは、個別には理解しやすいが、全体として理解するのが難しい、構造化されたクラスで構成されたコードを表します。 [15]
ラザニアコード
ラザニアコードとは、レイヤーが非常に複雑に絡み合っており、1つのレイヤーに変更を加えると他のすべてのレイヤーの変更が必要になるコードのことです。[16]
例
以下は、 BASICのスパゲッティ コードの簡単な例です。このプログラムは、1 から 100 までの各数字とその四角形を画面に表示します。コードによって実行されるさまざまなアクションを区別するためにインデントは使用されず、プログラムのステートメントは行番号GOTOに依存します。ある領域から別の領域への実行の流れを予測することは困難です。現実世界でのスパゲッティ コードの発生はより複雑であり、プログラムの保守コストを大幅に増加させる可能性があります。
1 i = 0 2 i = i + 1 3 PRINT i ; "squared=" ; i * i 4 IF i >= 100 THEN GOTO 6 5 GOTO 2 6 PRINT "プログラムが完了しました。" 7 END
以下は、構造化プログラミングスタイルで記述された同じコードです。
1 FOR i = 1 TO 100 2 PRINT i ; "squared=" ; i * i 3 NEXT i 4 PRINT "プログラムが完了しました。" 5 END
プログラムはある領域から別の領域にジャンプしますが、このジャンプは形式的であり、予測が容易です。これは、for ループと関数がフロー制御を提供するのに対し、gotoステートメントは任意のフロー制御を推奨するためです。この例は小さいですが、実際のプログラムは多数のコード行で構成されており、スパゲッティ コード形式で記述すると保守が困難になります。
これは、GOTO ステートメントが埋め込まれたスパゲッティ コードの別の例です。
INPUT "いくつの数字をソートする必要がありますか?" ; T DIM n ( T ) FOR i = 1 TO T PRINT "NUMBER:" ; i INPUT n ( i ) NEXT i '計算: C = T E180: C = INT ( C / 2 ) IF C = 0 THEN GOTO C330 D = T - C E = 1 I220: f = E F230: g = f + C IF n ( f ) > n ( g ) THEN SWAP n ( f ), n ( g ) f = f - C IF f > 0 THEN GOTO F230 E = E + 1 IF E > D THEN GOTO E180 GOTO I220 C330: PRINT "ソートされたリストは" FOR i = 1 TO T PRINT n ( i ) NEXT i
参照
- 大きな泥の塊、認識可能なアーキテクチャを持たないソフトウェア
- 国際難読化Cコードコンテスト、楽しく難解なCコードを作成するコンテスト
- 技術的負債
- プログラミングスタイルの要素
参考文献
- ^ Markus, Pizka (2004). 「リファクタリングでスパゲッティコードを整理しますか?」(PDF)。ソフトウェアエンジニアリングの研究と実践: 846–852。 2018年3月5日時点のオリジナル(PDF)からアーカイブ。 2018年3月5日閲覧。
- ^ Cram, David; Hedley, Paul (2005). 「代名詞と手続き的意味: スパゲッティコードと妄想の関連性」(PDF)。オックスフォード大学言語学、文献学、音声学ワーキングペーパー。10 : 187–210。 2018年3月6日時点のオリジナル( PDF)からアーカイブ。 2018年3月5日閲覧。
- ^ Horstmann, Cay (2008)。「第 6 章 - 反復」。APコンピュータ サイエンス向け Java コンセプト(第 5 版 [つまり第 2 版])。ホーボーケン、ニュージャージー: J. Wiley & Sons。pp. 235–236。ISBN 978-0-470-18160-7. 2017年1月2日閲覧。
- ^ 米国国立規格協会 (1980)。ASTM特別技術出版物。米国政府印刷局。
- ^ Moha, N.; Gueheneuc, YG; Duchien, L.; Meur, AF Le (2010 年 1 月). 「DECOR: コードとデザインの臭いの仕様と検出のための方法」. IEEE Transactions on Software Engineering . 36 (1): 20–36. CiteSeerX 10.1.1.156.1524 . doi :10.1109/TSE.2009.50. ISSN 0098-5589. S2CID 14767901.
- ^ Abbes, M.; Khomh, F.; Gueheneuc, YG; Antoniol, G. (2011). 「2 つのアンチパターン、Blob と Spaghetti Code がプログラム理解に与える影響に関する実証的研究」。2011第15回欧州ソフトウェア保守およびリエンジニアリング会議。pp. 181–190。CiteSeerX 10.1.1.294.1685。doi :10.1109 / CSMR.2011.24。ISBN 978-1-61284-259-2.S2CID 14152638 。
- ^ ガイ・ルイス・スティール。1977年。マカロニはスパゲッティよりも美味しい。1977年人工知能とプログラミング言語シンポジウム議事録。米国ニューヨーク市計算機協会、60~66ページ。DOI:https://doi.org/10.1145/800228.806933
- ^ Conway, Richard (1978). PL/I、PL/CS、PL/CT を使用した規律あるプログラミング入門書。Winthrop Publishers。ISBN 978-0-87626-712-7。
- ^ Conway, Richard; Gries, David (1979).プログラミング入門(第 3 版). Little, Brown. ISBN 978-0-316-15414-7。
- ^ Boehm, Barry W. (1988 年 5 月). 「ソフトウェア開発と機能強化のスパイラル モデル」. IEEE Computer . 21 (2): 61–72. doi :10.1109/2.59. S2CID 1781829.
- ^ Noll, Paul (1977). COBOL プログラマのための構造化プログラミング: 設計、ドキュメント、コーディング、テスト。M. Murach & Associates。
- ^ Schwille, Jürgen (1993). 「例外の使用と乱用 — 適切な例外処理のための 12 のガイドライン」. Lecture Notes in Computer Science . Ada – Europe '93 (議事録). Lecture Notes in Computer Science. Vol. 688. Springer Berlin Heidelberg. pp. 142–152. doi :10.1007/3-540-56802-6_12. ISBN 978-3-540-56802-5。
- ^ MTSBS [明確化が必要] (1981 年 3 月- 4 月)。「基本的に言えば...FORTRAN バイト!!」。ミシガン テクニック。99 (4)。
{{cite journal}}: CS1 maint: 複数名: 著者リスト (リンク) CS1 maint: 数値名: 著者リスト (リンク) - ^ ハミング、リチャード (1996)。科学と工学を行う芸術。テイラー&フランシス。ISBN 9056995006。
- ^ De Troyer, O. (1991 年 5 月 13 日). Andersen, Rudolf; Bubenko, Janis A.; Sølvberg, Arne (編). OO バイナリ関係モデル: 真のオブジェクト指向の概念モデル(PDF) . Advanced Information Systems Engineering. 数値流体力学と多分野設計に関するノート. 第 498 巻. pp. 561–578. doi :10.1007/3-540-54059-8_104. ISBN 978-3-319-98176-5.S2CID 10894568 。
- ^ Tomov, Latchezar; Ivanova, Valentina (2014年10月). 「反例によるソフトウェアエンジニアリングの優れた実践の指導」.コンピュータサイエンスとコンピュータサイエンス教育(1): 397–405 . 2018年3月5日閲覧。
外部リンク
- Go To ステートメントは有害であると考えられる。エドガー・ダイクストラによるスパゲッティコードの古典的な否定
- どこから来たのかがわからなければ、どこへ行けばいいのかもわからない R. ローレンス クラーク著 DATAMATION、1973 年 12 月号 2018 年 7 月 16 日にWayback Machineにアーカイブ
- Java スパゲッティ コードを Java 弁当コードにリファクタリングし、ボウルいっぱいのコードを 1 つのクラスから 7 つのクラスに分割する
- オブジェクトとフレームワーク - 一歩引いて考える (Brian Rinaldi 著)
- パスタのプログラミング - スパゲッティ、ラザニア、ラビオリ、マカロニのコードが 2023-01-21 にWayback Machineにアーカイブされました
- プログラミングのパスタ理論
