スパゲティプログラム
出典: フリー百科事典『ウィキペディア(Wikipedia)』
スパゲティプログラムまたはスパゲティコードとは、スパゲティのように複雑に実行順序が絡まり、整理されていないプログラムのことを指す俗語のことである。
目次 |
[編集] スパゲティなプログラムの問題点
プログラムのテストを行う際、プログラムの実行順序をトレース(追跡)するのに苦労する。それゆえ、バグが発生してもなかなか原因を見つけ出せなくなる。
スパゲティプログラムは保守・機能追加を妨げる為、修正されることが望ましい。しかし「動作しているプログラムは修正しない」ことを習慣とする文化では、修正は避けられる傾向にあった。これは見通しの悪いスパゲッティ状態のプログラムを変更することにより、予期せぬバグを追加してしまったり、「寝たバグを起こす」可能性が高かったからである。時間や予算・人材が許す場合でもこの傾向は見られた。
[編集] 原因
[編集] goto文の濫用
スパゲッティプログラムを作りだす原因としてよく挙げられるのが、goto文の濫用である。BASICなどの言語にあるgoto文は、無条件に指定したラベルの位置までジャンプする。これは関数やループなどの制御構文を利用した制御に比べ、処理の流れを追いにくく、ソースコードの可読性およびメンテナンス性を低下させてしまう。 しかし、C言語等でエラーを処理する場合、goto文を使うことでエラー処理を書きやすくなることがあるなど、一概にgoto文を全否定出来ない面もある。近代的なプログラミング言語では、例外処理や多重ループを抜けるための制御文が用意されているため、ほとんどgoto文は使われない。プログラミング言語によってはgoto文が言語仕様に無いものも存在する。
[編集] 多重継承の濫用
オブジェクト指向を取り入れたプログラミング言語において、多重継承を機能追加のためにむやみに濫用し、クラス間の関係が複雑になりすぎてしまうことでスバゲティ化が起こることがある。このため(メンバの名前の衝突や菱形継承を避けるなどの目的もあり)、Delphi、Java、C#などの言語では多重継承が禁止され、機能の追加にはオブジェクトコンポジションを利用することが推奨されている。
[編集] スコープの拡大
グローバル変数の濫用によりスコープが拡大され、可読性が悪くなることがある。プログラミング言語によってはグローバル変数が言語仕様に無いものも存在する。
[編集] 技術不足
コーディング技術の不足による要因もある。同一関数内に処理を延々と書き連ねたり、一貫性のない記述を繰り返したりすることにより可読性が悪くなることがある。
[編集] 解決の糸口
後にテストファーストの方法論が確立され、プログラム本体の完成と同時期に、テストプログラムも作成されるようになると、プログラム変更の危険性は相対的に低くなり、このような状態のプログラムは積極的に修正することが奨励されるようになった(リファクタリング)。