この投稿では、スパゲティ化するコードやモデルの原因と対策について説明します。
原因
最近、スパゲティコードやスパゲティモデルに関するアドバイスを求められる機会が増えています。
スパゲティコードやスパゲティモデルが生じる主な原因は、ソフトウェア設計者がソフトウェア要求仕様と実装(コードやモデル)を直接一致させようとする設計手法にあります。
ソフトウェア要求仕様は、ソフトウェアアーキテクチャ構造やコンポーネント間インタフェース(特にグローバル変数などの共通変数)の設計を十分に考慮せずに作成されることがあります。
その結果、要求仕様の変更がコード全体に波及しやすく、モジュール間の依存関係が複雑化して可読性や保守性が低下する「スパゲティコード/スパゲティモデル」が発生します。
この問題を防ぐには、要求仕様の発行者またはソフトウェア設計者のいずれかが、ソフトウェアアーキテクチャおよびコンポーネント間インタフェース変数を考慮する責任を明確に担うことを、設計ルールとして定義する必要があります。
スパゲティコードやスパゲティモデルは、保守性や移植性を低下させるだけでなく、設計効率および品質の低下を招く要因となります。
原因:
- ソフトウェアアーキテクチャおよびコンポーネント間インタフェース変数に対するアーキテクチャ設計が不足している
- コンポーネント間インタフェース変数に関するソフトウェア要求仕様の設計ルールが未整備である
- コンポーネント間インタフェース変数に関するソフトウェア設計段階の設計ルールが未整備である
- ソフトウェアアーキテクチャおよびコンポーネント間インタフェース変数に関する教育・啓発が不足している

対策案
次の対策を提案します。なお、他にも有効な手法が考えられますので、あわせてご検討ください。
対策案:
- コンポーネントReceive部およびSend部の導入
下図のように、各コンポーネントに「Receive部」と「Send部」を設けます。
– Receive部:コンポーネント間インタフェース変数から、コンポーネント内ローカル変数へ値をコピーする。
– Send部:コンポーネント内ローカル変数から、コンポーネント間インタフェース変数へ値をコピーする。
– 各コンポーネント内部の処理は、ローカル変数またはコンポーネント静的変数で完結させる。 - ソフトウェア要求仕様書への明記
ソフトウェア要求仕様書に、コンポーネント間インタフェース変数を明示的に定義する。 - ソフトウェア設計段階での適用
ソフトウェア設計では、上記の「Receive部/Send部」構造を前提として設計を行う。 - 設計ルール・教育の実施
「Receive部/Send部」の設計方針および運用ルールを教育・周知し、設計者全体で統一的に運用する。
下図は、対策№1と№3にて対策した例です。
