Re: [閒聊] 尋求比nest-if更優美的解決辦法
※ 引述《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
12/06 15:05, 1F
→
12/06 15:07, , 2F
12/06 15:07, 2F
→
12/06 15:10, , 3F
12/06 15:10, 3F
→
12/06 15:10, , 4F
12/06 15:10, 4F
→
12/06 15:10, , 5F
12/06 15:10, 5F
→
12/06 15:11, , 6F
12/06 15:11, 6F
→
12/06 15:12, , 7F
12/06 15:12, 7F
→
12/06 18:58, , 8F
12/06 18:58, 8F
這個比較像設計樣式中的裝飾者(呼叫串), 你可以重組他的順序
, 也可以復用本來已經存在的呼叫串, function call 是很多層
沒錯! 但是如果考慮到 if 這樣多層的結構會常出現以及內外順
序可能會需要改動(或層數增加), 這種方法是比較簡單的, 也可
以不用跑個迴圈透過指標依序呼叫函式; 缺點是需要共通的介面
, 還有必須付出額外的執行時間.
→
12/06 19:18, , 9F
12/06 19:18, 9F
※ 編輯: loveme00835 來自: 140.121.197.115 (12/06 19:28)
推
12/06 20:17, , 10F
12/06 20:17, 10F
→
12/06 20:18, , 11F
12/06 20:18, 11F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 5 之 21 篇):