我有以下兩種方法(你可以看到)類似於其大部分語句除了一個(詳見下文)重構下面的兩個C++方法搬出來重複碼
unsigned int CSWX::getLineParameters(const SURFACE & surface, vector<double> & params)
{
VARIANT varParams;
surface->getPlaneParams(varParams); // this is the line of code that is different
SafeDoubleArray sdParams(varParams);
for(int i = 0 ; i < sdParams.getSize() ; ++i)
{
params.push_back(sdParams[i]);
}
if(params.size() > 0) return 0;
return 1;
}
unsigned int CSWX::getPlaneParameters(const CURVE & curve, vector<double> & params)
{
VARIANT varParams;
curve->get_LineParams(varParams); // this is the line of code that is different
SafeDoubleArray sdParams(varParams);
for(int i = 0 ; i < sdParams.getSize() ; ++i)
{
params.push_back(sdParams[i]);
}
if(params.size() > 0) return 0;
return 1;
}
有沒有什麼技術可以用來將兩種方法的代碼行移出到一個單獨的方法中,這可以從兩種方式中調用 - 或者 - 可能將兩種方法結合到一種方法中?
以下是限制:
- 的類曲面和曲線從第三方庫,因此不可修改。 (如果有幫助,他們都是從IDispatch接口派生)
- 還有更相似的類(例如FACE),可以融入這個「模板」(不是C++模板,行代碼只是流)
我知道下面可能(可能?)來實現的解決方案,但真的很希望有一個更好的解決方案:
- 我可以一個第三個參數添加到2種方法 - 例如:一個枚舉 - 標識第一個參數(例如enum :: input_type_surface,enum :: input_type_curve)
- 我可以傳入一個IDispatch並嘗試dynamic_cast <>並測試哪個轉換是NON_NULL並執行if-else來調用右邊方法(如getPlaneParams()與get_LineParams())
以下不是一個限制,但肯定是因爲我的隊友阻力的要求:
- 沒有實現從表面繼承一個新的類/ CURVE等(他們更願意使用上述的枚舉解決方案來解決它)
你不清除'params'矢量。你打算用許多對象的參數來填充它嗎?也許有更好的方法來重構你的代碼,這取決於你之前調用geXXXXParameters方法的方法。 – 2010-03-29 17:41:33
爲什麼在'bool'就夠了時返回'unsigned int'? – 2010-03-29 18:42:48
「SafeDoubleArray」的類型是什麼?我懷疑這可能會重構更多,但我們首先需要。我第二@馬修的「bool」動議。 – GManNickG 2010-03-29 18:45:01