新人技術者のためのロジカル・シンキング入門(2) ―― プログラミングにおける良いデータ構造

冴木元

tag: 組み込み

技術解説 2008年3月 5日

【1】外部変数の役割とは

 外部変数の管理は,古くて新しい問題です.エピソード中のPさんのように,無秩序に外部変数を使用することが有害であると頭ではわかっていても,明確な方針を定めて保守性の高いプログラムをチームで開発できない,という人は少なくないように思います.外部変数が散乱するという事態は昔からありがちなのですが,その問題は意外と根が深いのです.

 そもそも外部変数というのは,ほかの変数とどこが違うのでしょうか.また,なぜ外部変数は必要なのでしょうか.

● 外部変数の性質を理解する

 外部変数は昔から困り者の典型とされています.とはいえ,理由がなければ使われなかったはずです.まず,なぜ必要とされたのかを,外部変数の性質から整理してみることにしましょう.外部変数があふれないようにするには,何に置き換えるべきだったかを整理することから出発します.

 外部変数には,以下の二つの特徴があります.

1) ほかの関数から見える

 最初に外部変数の特徴として挙げられるのは,関数の引き数にとらなくてもリード/ライトできるというものです.これは,便利な反面,関数間の依存性を高めてしまうので,デバッグがたいへんめんどうになるという欠点を含んでいます.

 例えば,ある外部変数をON/OFFの2値のフラグにして,処理を切り分ける関数を考えてみましょう.この関数は,関数単体での動作確認としてはON/OFF時にそれぞれ正しく動作すればOKとすることができます.ところが,機能ブロック全体が正しく動くためには,その手前の関数でON/OFFが正しく設定されていることが絶対条件になります.つまり,単体としては動作確認OKとしたはずの関数が,結合するとほかの関数の挙動しだいでおかしな動きをすることになってしまうのです.

 これでは,テスト・ケースも作りづらくなります(図1).ほかの関数の挙動に左右されてしまう作りであるため,単体テストを行っても関数の動作保証が不十分となってしまうからです.

zu01_01.gif
図1 関数間で外部変数フラグを持ち合っていると見通しが悪くなる
ソース・コードの中をのぞいても,そもそもどれが外部変数なのかがわかりにくいことが多い.各関数の挙動が入力パラメータだけで決まらないのでソース・コードが読みにくい.そのため,デバッグがめんどうになる.それだけでなく,テスト・ケースが作りづらく,設計仕様書への反映も困難.

2) 値を保持する

 もう一つの特徴は,外部変数は一つの関数が呼ばれて戻ってもその値を保持し続けるというものです(図2).これは,1)の特徴とあいまってプログラムの保守性を低下させます.なぜなら,関数による一つの処理が終わった時点で「状態」を記憶する変数があるため,関数を呼ぶたびに動作が変わってくる可能性がある,ということになるからです.

zu02_01.gif
図2 値が保持されて使い回されるとさらにややこしい
関数の動作仕様が1回の呼び出しで完結しないため,デバッグもテスト・ケースの作成も困難になる.どの外部変数がどの関数で更新されて値が書き変わるのかよくわからない場合,ソース・コードを書いた人を含めて,だれにも保守できない化け物を生み出しかねない.

● さらに深く「なぜ」と問うと

 ある関数からアクセスする外部変数が一つしかないときは,まだ話はそれほど込み入ってきません.ややこしいのは,外部変数を使いたい放題のプログラムの場合です.このような外部変数のフラグは,たいてい一つではすまなくなっています.

 複数のフラグが互いに依存しあって設定されているとき,「正しい」外部変数の設定というのは,機能ブロックの外部仕様から考えるとどのようなものになるのでしょうか.これを明確に定義しようとするとひと言ではすみません.かといって,この手のプログラムの挙動を把握するために「外部変数仕様書」の類を起こそうとすると,小さな機能ブロックでも数十ページのドキュメントになりそうです.

 さらに進めて,これらの外部変数はなぜ外部変数として実装されているのかを考えてみましょう.例えば,値を保持するという二つ目の性質が不要であれば,呼び出し元の関数のローカル変数かなにかにフラグをとって,引き数で渡していってもよいはずです.また,必要ないとすれば,どのようなことがあらかじめ明らかになっていればよいのでしょうか.

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日