Re: [閒聊] 尋求比nest-if更優美的解決辦法

看板C_and_CPP作者 (最愛朴素妍)時間13年前 (2010/12/06 13:51), 編輯推噓2(209)
留言11則, 5人參與, 最新討論串5/21 (看更多)
※ 引述《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

12/06 15:05, , 1F
推!!當初我推FSM後,實在怕實做起來會麻煩很多..
12/06 15:05, 1F

12/06 15:07, , 2F
如果是 Flying Speghetti Moster 的話實作確實滿困難的
12/06 15:07, 2F

12/06 15:10, , 3F
看起來像是將檢查的動作封裝成物件 並做出執行的連鎖
12/06 15:10, 3F

12/06 15:10, , 4F
一個execute()成工就自動call下一個execute()
12/06 15:10, 4F

12/06 15:10, , 5F
好像很有趣的patternXDDD 感謝指教!!>"<
12/06 15:10, 5F

12/06 15:11, , 6F
Monster? XDDDDD
12/06 15:11, 6F

12/06 15:12, , 7F
我剛去google,那遊戲我還真不知道怎麼玩
12/06 15:12, 7F

12/06 18:58, , 8F
有點不懂為什麼要用link list耶,func call很多層
12/06 18:58, 8F
這個比較像設計樣式中的裝飾者(呼叫串), 你可以重組他的順序 , 也可以復用本來已經存在的呼叫串, function call 是很多層 沒錯! 但是如果考慮到 if 這樣多層的結構會常出現以及內外順 序可能會需要改動(或層數增加), 這種方法是比較簡單的, 也可 以不用跑個迴圈透過指標依序呼叫函式; 缺點是需要共通的介面 , 還有必須付出額外的執行時間.

12/06 19:18, , 9F
love在此說的串列式結構並非資料結構上的linklist.
12/06 19:18, 9F
※ 編輯: loveme00835 來自: 140.121.197.115 (12/06 19:28)

12/06 20:17, , 10F
恩大概了解 再去多問一下google好了
12/06 20:17, 10F

12/06 20:18, , 11F
感謝:)
12/06 20:18, 11F
文章代碼(AID): #1C_7dwvx (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 5 之 21 篇):
文章代碼(AID): #1C_7dwvx (C_and_CPP)