令和元年度 秋期 システムアーキテクト試験 午前Ⅱ 問5

あるプログラム言語によるプログラミングの解説書の中に次の記述がある。この記述中の“良いプログラム”がもっている特性はどれか。

このプログラム言語では,関数を呼び出すときに引数を保持するためにスタックが使用される。オプションの指定によって,引数で受け渡すデータをどの関数からでも参照できる共通域に移して,スタックの使用量を減らすことは可能だが,“良いプログラム”とは見なされないこともある。

解答・解説

正解: ウ. プログラムの一部(関数)を変更しても,他の関数への影響が少ない。

正解は ウ です。

解説

ソフトウェア設計において、プログラムを構成する各モジュール(関数など)の独立性を高めることは、保守性や再利用性を向上させるために非常に重要です。モジュールの独立性を測る尺度の一つにモジュール結合度(モジュール間の結びつきの強さ)があり、結合度が低い(弱い)ほど独立性が高く、“良いプログラム”とされます。

問題文にあるように、関数間でデータをやり取りする際、以下の2つの方法が対比されています。

  • 引数による受け渡し(データ結合):必要なデータだけを引数としてスタック経由で渡す方法です。モジュール間の結合度が最も低く、他の関数からの予期せぬ干渉を受けにくいため、独立性が高い(変更時の影響範囲が局所化される)という特性があります。
  • 共通域(グローバル変数など)による受け渡し(共通結合):どの関数からでも参照・変更できる共通のメモリ領域を使う方法です。ある関数が共通域のデータを書き換えると、それを参照している他のすべての関数に影響が及ぶため、モジュール結合度が高くなり、バグの原因特定や修正が困難になります。

したがって、スタック(引数)を使用して共通域を使わない“良いプログラム”がもっている特性は、モジュールの独立性が高く、プログラムの一部(関数)を変更しても他の関数への影響が少ないことです。

各選択肢の解説

  • ア:関数呼び出しのたびに関数の引数がスタックに積まれるため、再帰呼び出しや深い関数呼び出しを行うとスタックの使用量が増加します。むしろ共通域(静的な領域)に移した方がスタック使用量を抑えやすいため、誤りです。
  • イ:スタックへのデータの積み下ろし(プッシュ・ポップ)には処理時間がかかります。一般に、共通域を直接参照する方が引数の受け渡し処理を省略できるため高速になることが多く、誤りです。
  • ウ:正解です。引数を用いてデータを受け渡すことで関数の独立性が高まり、ある関数を変更しても他の関数へ及ぼす影響を少なく(局所化)できます。
  • エ:引数による受け渡しと共通域の使用のどちらがステップ数を少なくできるかは一概に言えず、問題文の意図する“良いプログラム”(モジュール独立性の高さ)の特性とは直接関係しないため、誤りです。

Spineチーム