6

先日、自社の新人が作成したシナリオをレビューしたところ、以下のサンプルのような処理を見つけました。

「異常発生時に同じ処理を繰り返す」処理に「サンプル」の処理構造を採用する場合は注意が必要です。

「サンプル」を作成した新人は、テスト時は何回か同じ処理をリトライすれば成功したため、
正常系の処理が1~数回で成功し、再帰から抜けることを想定してこのように作成したとのことでした。

ただし、実行時の状況や処理内容によってはエラーがリトライでは解消されない
(正常系の処理自体が例外の発生原因など)場合もあるため、
「異常発生時に同じ処理を繰り返す」ときに「サンプル」の処理構造を採用した場合、
これが解消されないまま永久に繰り返し実行される(再帰から抜けない)可能性があります。
(WinActorでのサブルーチンの再帰呼び出し回数は100回が上限ですので「永久」ではないのですが...)

こういった懸念があるため、一般にサブルーチンの再帰呼び出しは、
再帰から抜ける条件を考慮したつくりとするべきです。

「ある種の複雑な問題を解くコードをシンプルに記述できる場合があるが、
 再帰による入れ子の数に応じて占有するメモリが増加する上、実行速度も効率的とは言えず、
 非再帰的に記述できるならそうすべきである。」

こちらは、
IT用語辞典 e-Words「再帰呼び出し 【 recursive call 】 リカーシブコール」
(URL: http://e-words.jp/w/%E5%86%8D%E5%B8%B0%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97.html )
からの抜粋ですが、WinActorでのサブルーチンの再帰呼び出しにおいても同じことがいえます。

サブルーチンの再帰呼び出しや例外処理について知見のあるひとが、
敢えて危険が伴う処理構造を採用するというのであれば問題発生時の対応も可能でしょうからアリかもしれません。
ですが基本的にはなるべく危険は排除し分かりやすいシナリオとなるようにすべきでしょう。

以下に「サンプル」の改良版として採用した、「非再帰的」に行うものを掲載しますので、
ご参考にしていただければと思います。

WinActorはプログラミングをしたことがない人でも手軽に扱えるという利点がありますが、
通常プログラミングを覚える際に一緒に身に着けるお作法を学ぶ機会があまりないため、
知らずに「サンプル」と同じ処理を作成してしまい、
不具合を感じている方もいるのではと思い投稿してみました。

新しいコメントを投稿

リトライについてはなかなか悩ましいところで、「画像マッチングチェック→失敗したらリロード」などで割と無限ループを書いてしまっていますが、サーバがダウンしていると本当に無限ループになってしまったりしています。
回数で打ち切る処理も稼動条件によっては必要ですね。参考になります。

Oscarさま

同様のことは「WinActorシナリオ構築規約」にも掲載されていますね。

特約店だとパートナーサイトからダウンロードしてこれますが、シナリオ構築の基礎
としてこのフォーラムでも閲覧できるといいですね。