我有一个场景,其中我有很多具有以下模式的功能
RETURN_TYPE FOO(
TYPE PARM1,
TYPE PARM2)
{
PROLOG(PARM1, PARM2);
//FOO_BODY
EPILOG(PARM1, PARM2);
}
考虑一个遵循上述模式的示例函数
SQLRETURN SQLGetInfo(
SQLHDBC ConnectionHandle,
SQLUSMALLINT InfoType,
SQLPOINTER InfoValuePtr,
SQLSMALLINT BufferLength,
SQLSMALLINT * StringLengthPtr)
{
// ******** Prolog(InfoValuePtr, BufferLength) *************
CComSafeArray<BYTE> _InfoValuePtr(BufferLength);
LPBYTE pData;
// **********************************************************
SQLRETURN rc = p->SQLGetInfo(
reinterpret_cast<PSSQLHSTMT>(ConnectionHandle),
InfoType,
_InfoValuePtr,
BufferLength,
StringLengthPtr);
// ******** Epilog(InfoValuePtr) ******************************
::SafeArrayAccessData(_InfoValuePtr, reinterpret_cast<void **>(&pData));
memcpy_s(InfoValuePtr, BufferLength, pData, _InfoValuePtr.GetCount());
::SafeArrayUnaccessData(_InfoValuePtr);
return rc;
// *************************************************************
}
我的困境是,我有点不习惯一遍又一遍地重复相同的代码模式,这在开发过程中很容易出错,而且代码臃肿。即使在明天,改变某些东西实际上意味着一丝不苟地改变每一次发生的事情,以与变化保持一致。
处理模式的建议方式/最佳实践是什么?Macros
,Templates
注意我们仍然没有使用 boost 并且添加 boost 只是为了解决这个问题在这里可能不是一个选项