看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《awashharp (AwA)》之銘言: : 最近在寫一些網路server相關的程式, : 為了要產生足夠詳盡的錯誤訊息給使用者,常常會發現用了很深的nest-if程式… : 像是: : if(data != NULL) { : if(checkData(data) == 0) { : if(modifyData(data) == 0) { : if(fireDataChanged(data) == 0) { : if(saveDataIntoFile(data) == 0) { : printf("Finally succeed..."); : } : else printf("Data storage failed."); : } : else printf("Observer call failed."); : } : else printf("Data modification failed."); : } : else printf("Data is invaild."); : } : else printf("Data not found."); 從原文的推文"FSM", 我想到另一種解決方式. 我把每個 if 都視為一個檢查點, 定義出 Abstract Class "CheckPoint" 當做基底類別: ┌───────────────┐ │ CheckPoint │ ├───────────────┤ │# next : auto_ptr<CheckPoint> │ ├───────────────┤ │+ CheckPoint( CheckPoint* ) │ │+ execute( Data* ) = 0 : void │ └───────────────┘ 然後再把每個檢查點各自用 Concrete Class 來代表, 繼承自 CheckPoint: "BeginChecking" "CheckData" "ModifyData" "FireDataChanged" "SaveDataIntoFile" 每個類別的 execute方法都需傳入指向 Data 的指標, 然後視情況決定要不 要繼續下一階段的檢查呼叫. 這是串列式的結構, 可以預先寫死再從其中某 個節點開始呼叫, 也可以動態改成新的串列結構來實現不同的檢查流程, 程 式碼如下: http://codepad.org/zhaQUwGY 至於非同步的問題..應該有什麼可以鎖定物件的功能才對, 而不是想盡辦法 把不相關的邏輯濃縮成一小塊.. -- ◢████ ◢█ ◢██◣ ◢█ ◢███ ◢█ T-ara版怎麼去 ████◢█████s ~> T-ara ███ █ ◢██ 歡迎您的光臨 ███████████恩靜智妍孝敏 ███ ██ 素妍居麗寶藍 ████◥██◤ █████花英 ψmakigoto123 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115
tropical72:推!!當初我推FSM後,實在怕實做起來會麻煩很多.. 12/06 15:05
uranusjr:如果是 Flying Speghetti Moster 的話實作確實滿困難的 12/06 15:07
awashharp:看起來像是將檢查的動作封裝成物件 並做出執行的連鎖 12/06 15:10
awashharp:一個execute()成工就自動call下一個execute() 12/06 15:10
awashharp:好像很有趣的patternXDDD 感謝指教!!>"< 12/06 15:10
x000032001: Monster? XDDDDD 12/06 15:11
tropical72:我剛去google,那遊戲我還真不知道怎麼玩 12/06 15:12
michael0728n:有點不懂為什麼要用link list耶,func call很多層 12/06 18:58
這個比較像設計樣式中的裝飾者(呼叫串), 你可以重組他的順序 , 也可以復用本來已經存在的呼叫串, function call 是很多層 沒錯! 但是如果考慮到 if 這樣多層的結構會常出現以及內外順 序可能會需要改動(或層數增加), 這種方法是比較簡單的, 也可 以不用跑個迴圈透過指標依序呼叫函式; 缺點是需要共通的介面 , 還有必須付出額外的執行時間.
tropical72:love在此說的串列式結構並非資料結構上的linklist. 12/06 19:18
※ 編輯: loveme00835 來自: 140.121.197.115 (12/06 19:28)
michael0728n:恩大概了解 再去多問一下google好了 12/06 20:17
michael0728n:感謝:) 12/06 20:18