我有一個看起來像這樣的設置。拋出異常是一種健康的退出方式嗎?
class Checker
{ // member data
Results m_results; // see below
public:
bool Check();
private:
bool Check1();
bool Check2();
// .. so on
};
檢查器是一個爲工程分析執行冗長檢查計算的類。每種類型的支票都有檢查員存儲的雙倍結果。 (見下文)
bool Checker::Check()
{ // initilisations etc.
Check1();
Check2();
// ... so on
}
一個典型的檢查功能應該是這樣的:
bool Checker::Check1()
{ double result;
// lots of code
m_results.SetCheck1Result(result);
}
而且結果類看起來是這樣的:
class Results
{ double m_check1Result;
double m_check2Result;
// ...
public:
void SetCheck1Result(double d);
double GetOverallResult()
{ return max(m_check1Result, m_check2Result, ...); }
};
注:所有代碼過於簡單。
檢查器和結果類最初編寫來執行所有檢查並返回整體雙重結果。現在有一個新的要求,我只需要知道的任何的結果是否超過1.如果是,則不需要執行後續檢查(這是優化)。要做到這一點,我可以:
- 修改每個CheckN函數以保持檢查結果和返回。父Check函數將繼續檢查m_results。 OR
- 在Results :: SetCheckNResults()中,如果值超過1,則引發異常,並在Checker :: Check()結束時捕獲它。
首先是繁瑣,容易出錯,次優的,因爲每一個功能CheckN進一步分支出來成子支票等
第二是非侵入和快捷。一個缺點是我能想到的是,Checker代碼可能不一定是異常安全的(儘管其他地方沒有引發其他異常)。還有什麼是我忽略的顯而易見的東西?拋出異常和堆棧展開的成本是多少?
有更好的第三種選擇嗎?
是否有一個速度/資源需求?看起來如此,但你並沒有完全清楚。 – Carlos 2010-05-20 08:28:52
卡洛斯,是的,有一個速度要求。我試圖實現的新模式只需要知道結果是否超過1,並且必須儘快返回ASAP。 – ramaseshan 2010-05-20 08:47:13