昨日以下のように自動販売機はフローチャートでなくて状態遷移図だろうとつぶやいた
昔ある人が「フローチャートの良い教材を見つけた。それは自動販売機だ」と言ったのを聞いて「自動販売機なら状態遷移図だろう」と思ったのだが、その人があまりにも自信満々で話が通じないだろうと思い、黙っていたことを思い出した。同意もしなかったが。
— 徳丸 浩 (@ockeghem) August 2, 2020
実際、基本情報処理技術者の試験に自動販売機の状態遷移図の試験が複数出題されているようだし、自動販売機の処理はイベントドリブン(硬貨投入、商品ボタン押下、返金ボタン押下…)なのでフローチャートでは書きにくいと思うが、敢えてフローチャートを書いてみようと思った…が、チャートを書くのは面倒なので、C言語風の擬似コードで書いてみた。前述のようにイベントドリブンの処理にはなるのだが、擬似コードではイベント待ちのポーリングをしている風に書いた。
在庫 = ...; // 入庫時に設定
残額 = 0;
商品ランプ点灯中 = false;
while (true) {
if (硬貨投入) {
if (残額 + 投入金額 > 上限金額) {
投入金額返金; // 入れたお金が戻ってくる
} else {
残額 += 投入金額;
if (残額 >= 商品金額 && 在庫 > 0 && ! 商品ランプ点灯中) {
商品ランプ点灯;
}
}
}
if (商品ボタン押下) {
if (残額 >= 商品金額 && 在庫 > 0) {
商品出荷;
残額 -= 商品金額;
--在庫;
商品ランプ消灯; // 残金を即返金する仕様
if (残額 > 0) {
返金;
残額 = 0;
}
}
}
if (返金ボタン押下) {
if (残額 > 0) {
返金;
残額 = 0;
if (商品ランプ点灯中) {
商品ランプ消灯;
}
}
}
}
実際のプログラミングでは、個別の処理は上記のように書くしかないとは思うが、せっかく擬似コードを書いたのに、処理の正しさの実感が全然わかない(間違いや抜けがあれば指摘してほしい)。なので、マクロには状態遷移的に考えて、ミクロではフローチャート…ではないにしても手続き的に考えるのがよいだろう。
ちなみに、「自動販売機 フローチャート」で画像検索すると、ヘンテコなフローチャートが大量に見つかるが、それはイベント駆動を意識してないからで、結果としては問題ないかもしれない(例えば、お金が入ってないのに返金ボタンを押すことが考慮されていないが、単に無視すればよいので差し支えない)が、設計内容を検証する上ではそれは良くないと思う。