シリーズ「開発の初めから順番に書いていってみる」の続きです。
設計手順には、要求分析、外部設計、内部詳細設計・プログラミング、単体テスト、結合テスト、総合テスト、運用テスト及び運用とあります。
現在プログラミングで、決定表と自動生成の話題を書こうと思っています。
今日は決定表の1回目、概要です。
■決定表(デシジョンテーブル)とは
決定表というものがあります。
情報処理試験で出るのですけど、
それ以外の場でも、仕様を明確にするために、昔は良く書きました。
こんなかんじ
30歳未満 Y Y N N
男性 Y N Y N
既婚者 N Y Y N
──────────────
帳票1を出力 - X - -
帳票2を出力 - - - X
帳票3を出力 X - - -
帳票4を出力 - - X -
ここ http://homepage2.nifty.com/mitsugumorita/98as/98asm03.htm
より引用(情報処理試験の問題らしい)
これは、4つの部分に分かれていて、線より上の左側の部分に条件がかかれ、
右側に、それが成立するときY,しないときNが書かれる。
で、左側の線より下にやることが書いてあって、上のY/Nでしめされたときに
やることが、どれかわかるように右側に書いてある
(ここでは、やるものをX)としている。
●ここで、場合をつくすとは。。。
ここで、場合を尽くして書くには、
・一番初めの条件はYYYYYと半分までY、のこり半分をN
・二番初めの条件は
1番目のYのところのうち半分がYYY・・、のこり半分をN・・
1番目のYのところのうち半分がYYY・・、のこり半分をN・・
・3番初めの条件は
2番目のYのところのうち半分がYYY・・、のこり半分をN・・
2番目のYのところのうち半分がYYY・・、のこり半分をN・・
・一番下は、YNYNYNYNと、交互になる
つまり、上記の例の場合、3段だと
YYYYNNNN
YYNNYYNN
YNYNYNYN
5段だと
YYYYYYYYYYYYYYYYNNNNNNNNNNNNNNNN
YYYYYYYYNNNNNNNNYYYYYYYYNNNNNNNN
YYYYNNNNYYYYNNNNYYYYNNNNYYYYNNNN
YYNNYYNNYYNNYYNNYYNNYYNNYYNNYYNN
YNYNYNYNYNYNYNYNYNYNYNYNYNYNYNYN
になるはずです。
(チェックするとき、下からみていくとかんたん、
一番下はYNYNYNYNと、交互、
下から二段目はYYNNYYNNYYNNと2つごと(2の1乗ごと)、
下から三段目はYYYYNNNNYYNNYYNNと4つごと(2の2乗ごと)、
最上段は、Y半分、N半分になっていけばOK
●つまり、例の場合
場合をつくしていないです。
たとえば、全部Yつまり、
30歳未満の男性の既婚者
というのは、世の中に存在しますが、ここでは書いていません。
これは、わざとだと思います。
(出題を難しくするために場合を尽くしていないんだと思います。
場合を尽くしてしまうと、考えやすい)
■決定表における、一般的なプログラミング
場合がつくされているときには、以下のように
IF(1番上の条件== TRUE)
IF(2番上の条件== TRUE)
IF(3番目の条件== TRUE)
YYYをやる
ELSE
YYNをやる
ENDIF
ELSE
IF(3番目の条件== TRUE)
YNYをやる
ELSE
YNNをやる
ENDIF
ENDIF
:
:
のように、IF文の入れ子にすることで、表現可能ではあります。
ただし、条件が多いと、プログラムがすごく長くなってしまいます。
そして、一番問題なのは、上記のように場合が尽くされていないとき
(そのような仕様書は来る。場合を尽くす必要がないときなどで、
それには、条件が従属している、たとえば、雨が降っていて、
土砂降りのときというような場合、晴れの土砂降りはありえないから
というようなケースや、絶対ありえないケース
男性でかつ子供を産んだ経験のある人とかは、かかれていない場合がある)
下手にIF文の入れ子を作ると、想定外の条件が成立してしまったりします。
●IF文の入れ子を防ぐ、一般的方法
そこで、こういう方法を良く使います。
上記の例だと
if ( ( age <30 ) &&
= 30 ) &&
( seibetsu == SEIBETSU.OTOKO ) &&
( kikon == true ) )
{
//NYYの処理
System.out.println("帳票4");
return;
}
if ( ( age >= 30 ) &&
( seibetsu != SEIBETSU.OTOKO ) &&
( kikon == false) )
{
//NNNの処理
System.out.println("帳票2");
return;
}
というふうに、条件部分を1つ1つ並べてしまう方法です。
こちらのほうが、仕様書と一致するため、間違いが少ないです。
このように、ドキュメントと、プログラムをできるだけ一致させるほうが
間違いが少ないし、特に仕様書が矛盾していたり、条件が足りないときに、
書き手と、プログラムの誤差が小さくなります。
で、さらに、「自動生成するための、もっと差が少ない方法」というのがあります。
決定表のYNと、やる内容をそのまま書くことにより、
仕様書をそのまま写せばできるようにするものなのですが、
それについては、このシリーズの次回に書きます。