Erlang の gen_fsm モジュールを使用してメニュー オプションを管理するかなり大きな USSD アプリケーションがあります。
menus_fsm.erl
現在のバージョンには、 5000 行以上の gen_fsm 関連コードを含む単一のファイルがあります。menus_fsm.erl
次のバージョンでは、個別のファイルに分割して、将来の保守を容易にする機会が与えられます。
古いバージョンでは、ヘルプ メニューを表示するには、次のようにします (help_menu/1
メイン メニューを表示する図示されていないコードから呼び出されます)。
-module(menus_fsm).
% Snipped some irrelvant code
help_menu(StateData) ->
% Display the first menu
send_menu(StateData, "Please Select:\n1. Option 1\n2. Option 2"),
{next_state, waitHelpMenuChoice, StateData, ?MENU_TOUT};
waitHelpMenuChoice(Params, StateData) ->
io:format("Got Help menu response: ~p", [Params]),
doTerminate(ok,"Help Menu", StateData).
FSM へのエントリ ポイントなどを示す多くのコードを省略しました。
新しいバージョンでは、次のように、から呼び出される新しいモジュールにhelp_menu/1
とを移動したいと考えています。waitHelpMenuChoice/2
help_menu
menus_fsm
-module( help_menu ).
% Snipped some irrelevant code
help_menu(StateData) ->
menus_fsm:send_menu(StateData, "Please Select:\n1. Option 1\n2. Option 2"),
{next_state, waitHelpMenuChoice, StateData, ?MENU_TOUT};
waitHelpMenuChoice(Params, StateData) ->
io:format("Got Help menu response: ~p", [Params]),
menus_fsm:doTerminate(ok,"Help Menu", StateData).
問題は次の行にあります{next_state, waitHelpMenuChoice, StateData, ?MENU_TOUT};
:モジュールにあることがgen_fsm
期待されているため、開始した場所に戻ります。waitHelpMenuChoice
menus_fsm
問題のある行を次のように置き換えようとしました
{next_state, fun help_menu:waitHelpMenuChoice/2, StateData, ?MENU_TOUT};
しかし、それは次のようなエラーにつながるだけです:
{badarg,[{erlang,apply,[conv_fsm,#Fun<help_menu.waitHelpMenuChoice.2>,[]]}
これを回避する方法について何か提案はありますか?