Map产品重构内容以及方法

1.产品需要剔除掉MFC库相关的东西,实现跨平台。如果一个产品能够和平台无关,那么他将活的更加长久。并且模块间要减少耦合,程序重构过程中,必不可少的是VA,可以批量改名等,或者使用VS的全局替换函数,比如替换BOOL时候,注意确保选中区分大小写、全字匹配选项

   主要步骤:

  • CString 、LPCTSTR转换为std::string,需要包含<string.h>,std::string可以看成是char类型的vector,string类自己不提供对字符串的一些变换操作,比如转换成大小写,我们可以transform(str.begin(), str.end, toupper)。类自己仅仅提供有限的函数str.size, str.length等。如果要用UNIOCDE就直接使用std::wstring即可。当字符串类型做为函数参数的时候,请使用常量引用const std::string& str。
  • BOOL、FALSE、TRUE直接转换成bool, true, false,其他windows自定义的类型,尽量使用原始类型,或者自定义类型,比如DWORD我们直接写成unsigned long,或者对于不方便的直接宏转换定义,#define myMax(a,b)            (((a) > (b)) ? (a) : (b))
  • CArray、CTypedPtrArray等直接转换成std::vector,如果涉及到大量删除、插入操作,可以考虑std::list。程序中会使用方法GetData()来直接读写raw data,对于vector,我们使用 &vec[0]这种方式直接访问实际数据,不应该使用&vec.begin(),详情请参考《Effective STL》, CArray的InsertAt、RemoveAt使用insert(vec.begin()+offset, element), erase(vec.begin()+offset, element)方式来替换(自己想的,不知正确否,请关注advance等)。在使用vector之前,为了提高效率可以考虑使用vec.reserve()提前指定这个vec的容量,避免其在增长过程中反复的重新申请内存并拷贝原来数据。另在释放的时候,vec.clear之后,尽量使用vector<*>().swap(vec) 这种方式释放已经申请的内存。CArray::SetSize我们可以使用vec的resize()替换,他们都将改变容器的大小,并且为新增加的位置调用默认构造函数填充。另外,CArray::SetAtGrow也是经常使用,在指定的索引位置设置元素的值如果不存在则自动增长到这里。转换过来,我们判断是否超过vec的大小,超过了也使用resize调整大小,这里需要注意,如果SetAtGrow使用的是index,那么resize调用的时候应该是index + 1

2. 重构过程中发现大量代码臭味道,比如,

  • 文件中使用了某个其他文件的类,我们却不包含头文件,这在VS下面,我们使用了预编译头stdafx对这种情况我们可以顺利便宜通过,可是在其他没有预编译的环境则行不通,所以,哪里用到就在哪里包含,然而在头文件中尽量少包含别人的头文件,为了减少耦合,我们可以使用前导声明,比如class A;struct B;等。
  • 文件名一律使用小写字母,在其他操作系统下面,大小写是区分的,所以你在文件中包含#include "a.h"和#include "A.h"是有区别的,甚至你在A前面多了一个空格也是编译不过的#include " a.h"

>>>>>>>>>>>>>>>>>>>>>>>>>>>待续<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

posted @ 2010-04-01 17:48  wangshuming  阅读(305)  评论(0编辑  收藏  举报