2013-12-22 97 views
2

我在PHP中創建了一個USSD應用程序,由於USSD請求是唯一的(每個選擇的新請求),我需要一種方法來跟蹤它們,跟蹤我需要一種方式來存儲應用程序的流程,在我的USSD應用程序中有靜態菜單以及動態菜單(從數據庫中檢索),我的問題是,我創建了具有很多if,else和switch語句的應用程序,並且真的很難更新菜單項。所以任何人都可以建議我一個很好的算法來創建這個USSD應用程序?我的意思是解決這個問題的一種有效方法,我需要一種方式來根據客戶請求添加和刪除菜單,當我這樣做時,我的代碼不應該中斷。誰可以幫我這個事?USSD(狀態機)應用程序的算法

-Thanks &問候

PS:我已閱讀並thisthis它實際上並沒有回答我的問題。

+1

你能澄清一下「USSD」是什麼,究竟你問題是?添加和刪​​除菜單,在哪裏?目前爲止你的代碼是什麼以及它在哪裏/如何不起作用? –

+0

@pekka(USSD)非結構化補充服務數據是用於由GSM蜂窩電話與服務提供商的計算機,例如,以通信的協議。當我們在手機上做一些像#111#這樣的事情時,菜單是否正確?您可以在其中導航到更多菜單。你清楚嗎? – Fawzan

+0

這使得這部分更清晰。但是,你能澄清你的問題嗎?也許顯示一些代碼? –

回答

3

USSD一起使用的最佳方法是使每個command都成爲一個單獨的類。這樣,您就可以工作,調試和維護一個大型USSD應用

$ussd = new USSDMessage(); // USSD Class 

$main = new Command("menu"); // Starting Command 

// Register multiple command 
$main->register(new Command("help")); 
$main->register(new Command("account")); 
$main->register(new Command("transfer")); 
$main->register(new Recharge("reacharge")); 

$main->run($ussd); // Run Request 

基礎類結構,

// Class To receve message from USSD 
class USSDMessage { 
    function next(); 
    function saveSession(); 
} 

// Basic Command Class 
class Command { 
    private $name; 
    private $cmd = array(); 

    function __construct($name) { 
     $this->name = $name; 
    } 

    function register(Command $menu) { 
     $this->cmd[$menu->getName] = $menu; 
    } 

    function run(USSDMessage $ussd) { 
     $key = $ussd->next(); // get next inpur from ussd 

     if (isset($this->cmd[$key])){ 
      $ussd->run($ussd); 
     } 
    } 
} 

// Recharge Command Example 
class Recharge extends Command { 

    function run(USSDMessage $ussd) { 
     $key = $ussd->next(); 

     switch ($key){ 
      case "1": 
       // Proccess card recharge 
       // Do Somthing 
       $ussd->saveSession(); // End Session 
       break; 
      case "2": 
       // Process direct deposit 
       // Do Somthing 
       $ussd->saveSession(); // End Session 
       break; 
      default: 
       // Format Not supported 
       // Do Somthing 
       $ussd->saveSession(); // End Session 
       break; 
     } 
    } 
} 
2

根據我從OP的問題了,下面是一些提示:

這個問題與樹遍歷。菜單的每個狀態都將存儲在樹的一個節點上。

如果您對後綴樹/ trieread here沒有任何瞭解。這個想法很簡單,因爲用戶輸入的選項有限:0,1,2,3,4,5,6 ... 9,#,*,我們可以表示一棵樹中的所有狀態。

樹中的每個節點將是這樣的:

Node{   
    Node [] next = new Node[12];//All options from 0 to * 
    Menu menu; 
} 

所以不是如果和開關,我們可以輕鬆地找到和使用,並通過樹遍歷從根到葉存儲所有的狀態。並且要提及所有狀態,我們只需要存儲一個變量:Node root

例如,如果我們有一系列操作#111#。 (假設#位於索引10,*位於索引11)我們將始終從root開始 - >進入索引10處的節點 - >進入索引1處的節點...最後,返回菜單。

僞代碼:

Menu traverse(String input){ 
    Node cur = root; 
    for(int index in input){ 
     cur = cur.next[index]; 
    } 
    return cur.menu; 
} 

對於刪除的狀態/分支,只是橫越從根到該葉,並更換該葉節點的父next陣列與null英寸

:如果存儲陣列中的Menu[]menu所有菜單,併爲每個節點可以更加輕鬆地管理菜單的列表,而不是回報的菜單,你會返回一個整數,表示期望的指數菜單中的數組menu