2012-04-05 8 views
0

Erlangのgen_fsmモジュールを使用してメニューオプションを管理するかなり大きなUSSDアプリケーションがあります。gen_fsmの状態を別のモジュールの関数に変更する

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へのエントリポイントなどを示します。

新バージョンでは、我々はそうのように、menus_fsmから呼び出される新しいモジュールhelp_menuhelp_menu/1waitHelpMenuChoice/2を移動したいと思いますが:

-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}; 

と、問題の行を交換しようとしたが、それはちょうど、次のようなエラーにLEAS: {badarg,[{erlang,apply,[conv_fsm,#Fun<help_menu.waitHelpMenuChoice.2>,[]]}

誰もがこの問題を回避する方法のいずれかの提案を持っていますか?

答えて

0

私は自分の質問に対する解決策を見つけることができました。これが明らかであれば、私はErlangには少し戸惑っている可能性があります。

他のモジュールに代わって状態遷移を処理するモジュールmenus_fsmに新しい機能wait_for_menu_response/2を追加しました。次のように

-module(menus_fsm), 
-export([wait_for_menu_response/2]). 
% ...snip... 
wait_for_menu_response(Params, {Function, StateData}) -> 
    Function(Params, StateData). 

はその後 help_menuモジュールが変更されました:

-module(help_menu).  
% ...snip... 

help_menu(StateData) -> 
    menus_fsm:send_menu(StateData, "Please Select:\n1. Option 1\n2. Option 2"), 
    {next_state, wait_for_menu_response, {fun waitHelpMenuChoice/2, StateData}, ?MENU_TOUT}. 

waitHelpMenuChoice(Params, StateData) -> 
    io:format("Got Help menu response: ~p", [Params]), 
    menus_fsm:doTerminate(ok,"Help Menu", StateData). 

ので、それはwait_for_menu_responseを呼び出しますが、wait_for_menu_responseは今help_menu:waitHelpMenuChoice/2を起動して自由であるmenus_fsmモジュール内gen_fsmとどまります。 help_menu:waitHelpMenuChoice/2を変更する必要はありませんでした。

help_menu(StateData) -> 
    menus_fsm:send_menu(StateData, "Please Select:\n1. Option 1\n2. Option 2", 
     fun waitHelpMenuChoice/2). 

が、私は私の説明は、上記のより良いアイデアを示していると思う:help_menu関数は単純になるように、実際には、私の最終版では、menus_fsm:send_menu関数は、その3番目のパラメータとしてfun waitHelpMenuChoice/2を受け入れるように変更された

関連する問題