見出し画像

ブールグラフでロジックを整理してデシジョンテーブルと条件式を自動生成する ~ 設計者やプログラマにお勧めする原因結果グラフ技法 ~

設計者やプログラマにお勧めしようと考えた理由

原因結果グラフ技法は、ソフトウェアテストの国際規格ISO/IEC/IEEE 29119の中にも示され、ソフトウェアテストのテスト設計技法として知られているものです。しかし、この技法やツールを使い込んで思うことは、まずは開発設計のために使う方がずっと有益だし、合理的だということです。

また、私は多数のコンサルの現場でこの技法を紹介してきているのですが、少し実装にまで踏み込まなければならないためか、テスト技術者には浮かない顔を見せる人が時々いる一方で、開発設計者やプログラマの方が興味津々という感じで次々と質問してくることが多いです。

コンサルの現場では、実際に要求や仕様、また制約条件や制限事項に散らばったロジックを、一緒にグラフに描きながら整理していきます。
そして理解が進むと、「もっと早くこの方法を知っていれば、あの時に使ったのに!」とか、「役立ちそうな実感が湧いたので、さっそく次の機会に自分も使ってみます。」という反応になることが多いです。いずれの場合もとても評判が良いです。

そんな経験から、「こんなに評判が良いのに、なぜこの技法が広まらないのだろうか」と疑問が湧き、「それは単純に開発設計者やプログラマの方がこの技法を知る機会がないからなのではないか」との仮説を立てるに至っています。

実際、テスト技術の専門書の中で解説されており、またそれ故にそこではテスト設計技法としての側面にフォーカスされた説明がなされています。

振り返ってよく考えてみると、私はもう少し広い側面での効用についていつも説明しており、そんな説明の仕方をしている書籍は未だないように思います。そこで、ここでは特に開発設計者やプログラマの皆さまに向けて、この技法を数回に分けて紹介することにします。

便利なツールがあってこその原因結果グラフ技法

まず、正直なところ、ツールがあってこその原因結果グラフ技法だと思います。

幸いなことに、ニフティの加瀬さんが作成され、CEGTestと名付けられたツールが無料で公開されており、気軽に使い始めることができます。これはサーバで運用もされていますが、JavaScriptで記述されたソースを落として手元のブラウザで簡単に動かすこともできます。このツールの素晴らしいところは、リアクティブに動作するところです。グラフを編集する度に、表示されているデシジョンテーブルが(Excelシートの自動計算のように)自動で書き変わってくれます。

このツールを手元で動かしながら、ツールの使い方と、技法を少しずつ覚えていくことができるので、学習もとてもし易くなっています。

ツール無しに原因結果グラフ技法を手作業でやることは、あまり現実的なことではないと思います。こう説明すると、なんかほとんどツールの恩恵であって、原因結果グラフ技法は面倒なものなのかと思われてしまいそうですが、そうではありません。技法が考え方と機械的手順を十分に整理したからこそ、ツール化できたということでもあり、相乗効果によるのです。

ツールで簡単な事例を示します

例えば、次の表に示すような遊園地の料金システムをグラフ化してみましょう。

画像1

この事例は、「秋山浩一『組合せテストの設計』情報処理 Vol.49 No.2 Feb. 2008」より借用させて頂きました。

CEGTestツールを使用してこのロジックをグラフに描いてみたものを下図に示します。

画像2

図に示されているようなデシジョンテーブルを自動で生成してくれます。

このツールで「ファイル」をクリックすると以下のようなメニューが出てきます。

画像3

このメニューの中の「エクスポート(CSV)」を選択すると、次のような画面になります。

画像4

ここで、デシジョンテーブルのデータがCSVで抽出できるのがわかると思います。

一番上の「原因結果グラフ データ」は、このグラフ全体の情報(テキスト形式のソース)です。これを保存しておいて、先のメニューで逆にインポートしてやれば、全ての情報を復元することができます。

グラフを使ってレビュー、エクスポートした条件式をプログラムへ、デシジョンテーブルでテスト

私はPowerPointのスライドにグラフの図を張り付け、対応するグラフ情報のソースをそのスライドのノートに張り付けて管理しています。これでレビューにも便利に使えます。

さて、そのソースの中に以下のような情報が含まれています。

[Cause Node]
区分1は個人である=
区分265歳以上である=
区分2は一般である=
県内在住はYesである=
区分2は小学生である=
区分26歳未満である=
[Middle Node]
県内在住の小学生=(県内在住はYesである AND 区分2は小学生である),
県内在住ではない小学生=(NOT 県内在住はYesである AND 区分2は小学生である),
[Result Node]
入場料は無料=(区分265歳以上である OR 区分26歳未満である OR 県内在住の小学生),
入場料は1200円=(区分1は個人である AND 区分2は一般である),
入場料は1000円=(NOT 区分1は個人である AND 区分2は一般である),
入場料は600円=(区分1は個人である AND 県内在住ではない小学生),
入場料は500円=(NOT 区分1は個人である AND 県内在住ではない小学生),
[Constraint]
ONE(区分265歳以上である 区分2は一般である 区分2は小学生である 区分26歳未満である),

これを、コメント文としてコピペしてから、グラフも見ながらプログラムのソースコードを記述し、デシジョンテーブルの方のデータでテストして確認します。

まとめ

「なんか使えそう!」、「役に立ちそう!」、「便利そう!」と思って頂けたら、この記事を書いた者としては嬉しいです。

グラフとデシジョンテーブルの関係グラフとプログラムの関係グラフに描き込まれた見慣れない表現などについて、もっと詳しく理解したいという方には、Qiitaの方にも記事を用意してありますので、そちらもご覧いただけると嬉しいです。

ここには従来語られていない、もう少し他の重要な効用について、稿を改めて書いていきたいと思っています。

この記事が気に入ったらサポートをしてみませんか?