e <typename T> Struct Type2Type { typedef T OriginalType; }; 它没有任何数值,但其不同型别却足以区分各个Type2Type实体,而这正是我们所要的。现在,让我们来先解决addMember成员函数中的获取下一个可用ID号的函数,我们可以定义一个重载的函数如下:
size getNextMemberID(Loki:: Type2Type<Employee>) //对应职员操作 { if (itsEmployees.empty()) return 1; std::map<size,Employee*>::iterator it=itsEmployees. end(); --it; return it->first+1; } size getNextMemberID(Loki:: Type2Type<Account>) //对应帐户操作 略.. 相应的,删除类函数定义如下:
void delMember(size ID, Loki:: Type2Type<Account>) void delMember(size ID, Loki:: Type2Type<Employee>) 获取类函数定义如下:
Account* getMember(size ID, Loki:: Type2Type<Account>) Employee* getMember(size ID, Loki:: Type2Type<Employee>) 这样,我们的函数接口就比刚开始的方法更清晰,我们的大脑中要记住的函数名就要少多了。 第二次改进:使用模板技术减少接口函数数量经过第一次的改进,我们的接口结构比初始的方案要更清晰,但它似乎还存在一个问题:软件大师Martin Fowler在他的著作《重构――改善既有代码的设计》中将之列为代码的坏味道之首――代码重复。我们可以看到,添加、删除、获取的函数实现中,几乎完全是一样的实现逻辑,只不过所操作的map变量不同而已,如下(以添加为例):
size addMember(Account* e); //添加帐户 { //获取下一个可用的ID
|