作者loveme00835 (最愛朴素妍)
看板C_and_CPP
標題Re: [閒聊] 尋求比nest-if更優美的解決辦法
時間Mon Dec 6 13:51:50 2010
※ 引述《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