基於函數式編程的調試工具

基於函數式編程的調試工具

需求

在項目開發過程中發現兩個問題:

  1. 內部調試通常需要使用GM指令(比如一鍵滿級滿錢滿技能等)。但是目前用的是在遊戲內置的聊天框中輸入文本的方式調用GM指令,體驗不好而且效率不高。
  2. 每次聯調過程中,當需要確認一些服務器消息時總是必須加入打印日誌的相關代碼,然後重新編譯(即使是LuaJIT也需要花費不少時間)。

枯燥乏味的重複行爲在無形中蠶食着開發人員的精力和耐心,它們是項目開發裏的蚊蠅和蛆蟲,解決上述問題迫在眉睫。剛好在前些時間瞭解了一些有關函數式編程的知識,本着實驗的目的,先定幾個小目標:

  1. 儘可能使用更加便捷的GUI提供用戶交互,通過簡單的點選操作就可完成執行GM指令以及信息查詢等功能。
  2. 支持由用戶自定義GUI,比如常見的多級菜單選項,或是點選按鈕後執行的功能。
  3. 與現有項目代碼儘可能保持低耦合,便於後期管理維護。

設計

GMToolsDesignGUI只是負責顯示數據和交互;KEYS是GUI中顯示的菜單選項,FUNC負責基於規則A執行邏輯(查詢服務器消息內容、發送GM指令等),它們都是可配置的,分別由策劃和程序維護;MANAGER則基於規則B從KEYS中提取文本給GUI顯示,並根據用戶選擇的選項基於規則C提取數據,然後將其作爲參數傳遞給FUNC。
能看到應用函數式編程的好處:

  1. 對於不同的對象和行爲(比如不同類型的數據和不同簽名的函數),能夠基於自定義的範式對其進行統一的處理,邏輯上易於理解。上述提到的規則A、B、C可以抽象爲三種函數(剛好Lua將function視爲基礎類型,代碼寫起來也更加方便)。
  2. 具體的邏輯被隱藏在統一的執行範式背後,用戶可以實現除了執行GM指令和查詢服務器消息之外的其他行爲,而且由於Lua將函數也作爲基礎類型處理,現在這些行爲都是可配置的。
  3. 函數內部一致性使得用戶(這裏指項目中的程序員)的調試工作能夠進行地更加順利。

實現

  1. MANAGER使用棧Stack管理GUI顯示的KEYS多級菜單選項文本,以及點選菜單後存儲的數據。
  2. 一些菜單選項需要自行定義規則才能獲取到:
    1. 以Lua中的一個table存儲這些規則,MANAGER只需讀取table即可獲取規則。
    2. table中以數字爲key定義function,MANAGER基於當前在GUI中展開的菜單層級數,將其作爲key值從該table中獲取規則。比如剛打開調試工具界面時爲第一級,即獲取下標爲1的規則。
    3. 如需要其它規則,在table中以字符串爲key定義function,比如本工具就額外定義了canUnfold判斷是否可繼續展開下一級菜單。
      就像這樣:
      LuaExample
  3. FUNC的規則比較簡單,filter篩選從MANAGER中取得的數據並將其作爲參數返回,condition檢查這些參數是否符合一定要求,func最後根據這些參數執行一定的邏輯。

參考資料

《Functional Programming For The Rest of Us》(中文翻譯)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章