熊與我爲我傾倒以下簡化代碼:(我將描述該問題下面。)重構函數指針,以某種形式的模板
class CMyClass
{
...
private:
HRESULT ReadAlpha(PROPVARIANT* pPropVariant, SomeLib::Base *b);
HRESULT ReadBeta(PROPVARIANT* pPropVariant, SomeLib::Base *b);
typedef HRESULT (CMyClass::*ReadSignature)(PROPVARIANT* pPropVariant, SomeLib::Base *b);
HRESULT TryFormats(ReadSignature ReadFormat, PROPVARIANT* pPropVariant);
};
inline HRESULT CMyClass::ReadAlpha(PROPVARIANT* pPropVariant, SomeLib::Base *b)
{
if (b)
{
// got a valid Base. Handle generic stuff here.
SetStuff(pPropVariant, b->someInt);
return S_OK;
}
return (b != NULL) ? 0 : -1;
}
inline HRESULT CMyClass::ReadBeta(PROPVARIANT* pPropVariant, SomeLib::Base *b)
{
if (b)
{
SomeLib::FormatA *fa;
SomeLib::FormatB *fb;
if (fa = dynamic_cast<SomeLib::FormatA*>(b))
{
// specific code for FormatA
SetStuff(pPropVariant, fa->getVersion());
return S_OK;
}
else if (fb = dynamic_cast<SomeLib::FormatB*>(b))
{
// specific code for FormatB
SetStuff(pPropVariant, fb->valueForB);
return S_OK;
}
}
return (b != NULL) ? 0 : -1;
}
inline HRESULT CMyClass::TryFormats(ReadSignature ReadFormat, PROPVARIANT* pPropVariant)
{
HRESULT hr;
if (FAILED(hr = (this->*ReadFormat)(pPropVariant, _pFile->formatA())))
if (FAILED(hr = (this->*ReadFormat)(pPropVariant, _pFile->formatC())))
hr = (this->*ReadFormat)(pPropVariant, _pFile->formatD());
return hr;
}
我最終調用的代碼,如:
hr = TryFormats(&CMyClass::ReadAlpha, pPropVar);
現在...問題是,這是太泛型和約束,特別是現在,我試圖重構此代碼在其他項目中使用。所以,這意味着我想將ReadXxx
代碼放在另一個源文件中,並以某種方式濫用模板。 TryFormats
保留在類中,因爲不同的類具有不同的格式,它們嘗試讀取。
我目前的做法是註定要失敗的,由於所需要的功能dynamic_cast<Derived*>
不是在Base
類,因爲我可能需要一個類來讀取多達5名不同的格式,我真的不想拖累我首先不需要格式。 (例如,見上文CMyClass
如何不支持SomeLib::FormatB
,但ReadBeta()
需要支持它,因此迫使編譯器編譯所有相關信息。)總的來說,我有大約10種不同的格式,我'支持'這樣。
我該如何正確重構這段代碼?我不想爲每個後代重寫Base
功能,我也不想將派生的特定信息放入只需要Base
的函數中。
我已經嘗試了一些東西,但是我設法從我的編譯器中擠出的所有錯誤都是彩虹。我沒有把這裏的人們與我的企圖混淆起來,而是想給出我的(簡化的)原始工作準則,並讓專家就如何做到這一點得出他們自己的結論。實際上,這些函數中大約有50個函數,但它們要麼遵循上述函數的一般結構ReadAlpha
或ReadBeta
函數。所以如果有人能告訴我如何做到這一點,我可以沒有問題轉換我的實際代碼。 (我想我需要更改TryFormats()
的定義,這也是沒有問題的 - 我只是希望有人能告訴我如何得到上述示例重構正確。)
謝謝,我道歉很長很長的問題。
看到我的更新您的評論。希望有所幫助。 – 2009-11-20 15:13:53
你不會在同一句話中經常看到的詞:過於籠統和約束 – 2009-11-20 16:33:53
@Doug:越多的想法越好! :) @馬丁約克:真的。儘管如此,他們都適用於我。我認爲問題的根源在於後代對於主要興趣點已經非常一致地開始了,但是對於設計來說沒有考慮次要(更具體的)信息來源......使得獲得這樣的信息無論格式是否真實混亂。 – Stigma 2009-11-20 20:03:55