您的位置:首页 > 编程语言

你是否做好了代码的备份?

2010-03-16 15:50 141 查看
//=====================================================================
//TITLE:
// 你是否做好了代码的备份?
//AUTHOR:
// norains
//DATE:
// Tuesday 16-March-2010
//Environment:
// WINDOWS XP
//=====================================================================

我认为,一个优秀的程序员,不仅需要代码写得漂亮,能快速解决问题,更需要懂得如何备份自己的代码。我想当程序员有一段时日的朋友,总会有那么一两次碰到需要恢复到之前代码的时候,那么你的代码备份的完善程度,将决定于你烦恼的多少。

一般来说,我觉得代码的备份应该基于如下原则:

1. 清晰明了,能够简单地看出备份的文件是哪个节点。
2. 当代码出现问题时,能够最简单地恢复到最近状态
3. 尽可能减小代码出问题引起的灾难。

  我就以我日常工作的备份方式作为本文的主题。当然,我不敢说我的备份方式是最好的,但我可以说是满足了以上所列的要求。仅此,作为抛砖引玉。
  
  首先,我会将整个工程文件拷贝到一个文件夹里,删掉一些生成的无用文件,比如:*.ncb,*.exe等。
  
  然后将该文件夹更名,以日期+英文字母的方式。日期就是当前的年月日,字母以A,B,C依次排列。这样的话,我们看前面的数字,就能知道该备份文件是什么时候开始的;英文字母则是当天的第几次备份。
  
  最后,则是将所有的文件,压缩成一个压缩包。这样的好处是,当文件夹里面的文件出问题时,能够从压缩包里面将文件解压出来。虽然这样是增加了不少磁盘空间,但相对来说,却大大降低了风险。



 

 

这里还有一个ReadMe.TXT的文件,用来记录每次备份的改动。文件里的内容,其实是以文件夹的名称作为索引的。摘录其中一段的备份数据如下:

2010.03.09A
1.CImager
1).CreateStreamFromFile函数增加一个形参,用来返回文件的大小
2).当目标平台为WINXP时,改采用IPicture接口进行图片显示
2.CEffect
1).当目标平台为WinXP时,AlphaBlend直接调用系统的函数,而不是之前的从DLL文件先获取函数入口。

2010.03.10A
1.CGesture
1).Gesture增加一个枚举变量:GestureMode
2).根据GestureMode的数值,做相应的手势动作
3).增加如下函数:OnMouseMove(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam),CreateGestureActionValue(const POINT &pt),DrawGestureAction(HDC hdc,const POINT &pt),IsGestureSwitchWnd(const POINT &pt),DrawGestureActionMove(HDC hdc,const POINT &ptBegin,BOOL bReverse),ResetGestureAction(GestureAction &gestureAction)
2.CUserWnd
1).增加WM_MOUSEMOVE消息的处理
2).增加如下函数:OnMouseMove(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam)
3).CCommand和CWndInterface作为虚继承
3.CSplashWnd
1).继承于CCommand类,并且构造初始化列表增加CCommand
4.CTypeWnd
1).增加手势的mode,lValid字段的检测
5.CEffect
1).EffectParam增加dwBeginPos变量
2).增加如下函数:GetOppositeEffect(const TSTRING &strEffect),GetOffsetPosition(const TSTRING &strEffect,const POINT &ptBegin,const POINT &ptEnd),ShowSplashWindow(BOOL bShow);
3).修正DrawEffectBottom绘制有误的bug
6.CComand
1).DrawToSplashWnd函数增加一个形参iBeginPos

2010.03.11A
1.CGesture
1).GestureInfo只保留窗口的信息
2).修正DrawGestureAction算法,不让动作从开始的距离开始绘制
3).增加如下函数:MirrorOffsetPosition(const TSTRING &strEffect,DWORD dwOffset),ConvertRealMouseOffset(const POINT &ptBegin,const POINT &ptEnd,LONG &lOffsetX,LONG &lOffsetY)
4).修正IsGestureSwitchWnd函数判断有误的BUG。


这样备份以后,当代码出现问题,那么恢复到某天的某个结点是非常简单的。但这却有个致命的缺陷,我们很难知道单个文件的更改情况。虽然我们可以根据readme.txt文档查找相关类的信息,但在如此浩荡的信息量中,我们很难保证不遗漏一两条信息。所以这时候我们只能借助于代码管理工具。

代码管理工具其实很多,功能也多种多样。在这里,我选用的是微软的VSS。没有什么别的原因,仅仅是因为其够简单。如何使用VSS我这里就不再大费口舌了,网上教程一大把,大家尽可以搜。我这里只是想说每一次的chech in。

其实我的check in很简单,其实是和readme.txt是一一对应的:



这样的好处也很明显,改动的信息我只需要写一次,剩下的,就是复制黏贴而已。并且这样,在一致性上面维护的也很好。

而这VSS的数据库,也如同之前的工程一样,每天需要备份。只不过方式有所不同,每天的备份,其实都只是备份其压缩文档而已。因为VSS的数据库实在太庞大,如果以单个工程的方式来进行,所耗费的时间和空间着实很惊人。

最后,也是极其重要,不可忽视的一环,就是备份的介质。我的做法是,VSS的数据库有单独的一个服务器,这样可以和工作机分离,也方便大家的协同合作。而每天的备份,都会在外部硬盘有相应的拷贝。我一般是用两个移动硬盘,里面的数据都是一样的,上面拷贝的都是每天备份的内容,以此降低单个硬盘硬盘损坏造成的灾难。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: