读书人

设计模式应用到数据库接口的有关问题?

发布时间: 2012-03-05 11:54:02 作者: rapoo

设计模式应用到数据库接口的问题?用什么方法能达到最佳设计?比如维护方便,封装性又好.....
在写Informix数据库接口的过程中,
需要操作多达85个数据库表,而且表和字段的数目都会增加。
操作可分为select和insert(目前是2种),以后可能增加delete,modify等操作。
如果仅考虑上述2种操作,每个表就要写2个函数。要对85个表完成这两种操作,就需要85*2个函数。但是单就select或insert操作而言,内部的实现过程基本类似。
想找到一种方法实现接口函数易于维护,重复性代码少的目标,不知道用什么设计模式比较好?

注:数据库接口函数在informix的EC文件中实现。想从函数中抽象出共同的部分,写成基类。但每个函数的字段变量个数和类型都是可变的。

下面是其中一个数据库接口代码以做参考,变化部分都是由字段变量和类型的不同引起的。
bool CDBBackupApi::BackupUser( const string& strFileName)
{
//变化部分(变量个数和类型可变),这部分是字段变量定义代码
EXEC SQL begin declare section;
int iuserindex = 0;
char lpszUserName[31];
char lpszPassword[31];
int iLevel = 0;
datetime year to seconddtCreate;
int iValidate = 0;
char lpszFullName[61];
int FullNameInd;
char lpszUserNote[101];
int UserNoteInd;
char lpszEmail[61];
int EmailInd;
char lpszPhone[21];
int PhoneInd;
char timebuffer[20];
char arcCursor[20];
EXEC SQL end declare section;

int iFlag = 0;

CreateVar(NULL, arcCursor, NULL);
//变化部分(select语句字符串变化)
EXEC SQL declare :arcCursor cursor for
select userindex, trim(username), trim(password), level, createtime, validate, trim(fullname), trim(usernote), trim(email), trim(mobilephone)
from user order by userindex;

EXEC SQL open :arcCursor;

ofstream out_file( strFileName.c_str() );

for ( ; ; )
{ //变化部分(字段变量数和类型不同)
EXEC SQL fetch :arcCursor into :iuserindex, :lpszUserName, :lpszPassword, :iLevel,:dtCreate, :iValidate,
:lpszFullName, :lpszUserNote, :lpszEmail, :lpszPhone;

dttoasc(&dtCreate, timebuffer);

if (strncmp( SQLSTATE, "00", 02) != 0 )
break;

//变化部分(字段变量和个数类型变化)out_file<<iuserindex<<"|"<<lpszUserName<<"|"<<lpszPassword<<"|"<<iLevel<<"|"<<timebuffer<<"|"
<<iValidate<<"|"<<lpszFullName<<"|"<<lpszUserNote<<"|"<<lpszEmail<<"|"<<lpszPhone<<endl;

++iFlag;
}

FreeVar(NULL, arcCursor, NULL);

out_file.close();

return true;
}

[解决办法]
up


[解决办法]
建议向 taodm 大妈提问
[解决办法]
还没听说有以减少函数个数或者代码行数为目标的设计模式。
一般来说,设计模式都是增加函数个数的。

[解决办法]
把共同的东西抽象出来,得到相同类型操作,如果对于每个表指定其对应的操作

比如你有80几个表,其实有40个select的操作是一样的,或许只是参数不一样

那么可以把它们指定到同一个select操作上,参数由外面传进来


[解决办法]
1.模板可以考虑。
2.Template method可以考虑。
使用方法1的话,对方法的一致性要求比较高。
使用方法2的话,对每个表还是会有一个对应类的,本质上还是比较繁琐的。

把重点放在提高抽象层次上可能会更好一点。
example:
定义一个原子操作群,表查找,表插入字段,表删除,表更新。。。
然后再上层就是对原子操作进行排列和调用。
表的差异通过参数来隔离,那么动作本身可以达到通用。



读书人网 >C++

热点推荐