选择显示字体大小

visual c++泛型编程实践


  泛型程序设计(generic programming) 是建立在c++的template机制基础上的一种完全不同于面向对象的程序设计思维模式,stl是泛型概念的一套实作产品。loki是一个与boost齐名的开放源码的c++程序库,它通过一些精巧的装置为常规c++开发提供了一些很有用的工具。 stl非常好用,弹性非常大,效率也很理想。目前几种主流的c++编译器均有相关的stl实现,而个人认为目前非常流行的visual c++ 6.0平台中开发文档应用程序时,其文档序列化的功能非常好用,但由于其序列化能力建立在mfc之上,并不被stl支持,所以,如何既拥有stl的效率及通用性,又保留mfc的序列化能力,便成了visual c++ 6.0平台上运用stl技术开发文档应用程序时不得不面对的一个问题,在这里我就以非常流行的visual c++ 6.0+sp5平台结合一个假定的例子来介绍一下如何在visual c++6.0中结合使用stl、loki及模板技术来开发一个文档应用的开发历程,希望能对大家有所启发。

  示例

  先来简单介绍一下我所用到的例子:一个简单的商务进销存基本应用(不必关注细节),它应该包含:职员(employee)、产品(product)、仓库(storage)、往来单位(supply)、帐户(account)、单据(bill)等等,由于每种信息均应有唯一标识,所以我在这里选用stl中的map来表示如下(为了说明简单起见,我们只列两种):

std::map<size,employee*> itsemployees;
//职员表
std::map<size,product*> itsproducts;
//产品表
..

  第一步:实现

  我们将以上map放入多(单)文档应用程序的文档类中,很显然,我们必须对每一个表至少提供以下三种最基本的操作:添加新成员函数、删除指定成员函数、获取指定成员函数。

  对于添加新成员,我们可以实现如下:

size addaccountmember(account* e); //添加帐户
{
 //获取下一个可用的id号
 size id=getnextaccountid();
 itsaccounts[id]=e;
 return id;
}
size addemployeemember(employee* e);//添加职员
{
 //获取下一个可用的id号
 size id=getnextemployeeid();
 itsemployees[id]=e;
 return id;
}
..

  接下来的删除方法仅有一个size(唯一标识)参数,实现如下:

void delaccount(size id); //删除指定帐户
{
itsaccounts.erase(id);
}
void delemployee(size id); //删除指定职员
{
itsemployees.erase(id);
}
..

  获取指定成员的方法如下:

account* getaccountmember(size id)
//获取指定帐户
{
return itsaccounts[id];
}
employee* getemployeemember(size id) //获取指定职员
{
return itsemployees[id];
}
..

  另外,我们还要为每一个表提供一个获取下一个可用id的成员函数:

//获取下一个可用职员号
size getnextemployeeid()
{
 if (itsemployees.empty())
  return 1;
 std::map<size,employee*>::iterator it=itsemployees.end();
 --it;
 return it->first+1;
}
//获取下一个可用帐户号
size getnextaccountid()
{
 if (itsaccounts.empty())
 return 1;
 std::map<size,account*>::iterator it=itsaccounts.end();
 --it;
 return it->first+1;
}
..

  第二步:分析

  以上实现的确达到了我们的设计目的,但仅从直观上来看我就觉得它应该还有改善的空间,最简单的原因:因为它的命名混乱,没有通用性,如:

addaccountmember, addemployeemember,..
delaccount, delemployee,..
getaccountmember, getemployeemember,..
getnextaccountid, getnextemployeeid,..

  对于同一种功能存在这么多不同名称的函数想起来就让我感到可怕,在我们的这个简单的例子中只对6个表实现了三种功能,我们需要为每个表实现4种不同名称的函数,结果,我们需要记住4*6=24个不同名称的函数及它们所对应的功能,如果,如果我们要对更多的表实现更多的功能..,真的不敢相象我们到底要实现多少个不同名称的函数。我想,不用等到函数接口数量爆炸,我的脑子就先爆炸了。如果能够对同一种功能的函数使用一组相同的名字如:

addmember
delmember
getmember
getnextmemberid


  那么,我们的接口名称数量就只与实现的功能多少成常数关系,而与我们要操作的表的个数无关了,整个程序就应该清晰多了。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons