从一段旧代码想到的
2011-04-25 23:19
141 查看
今天一个偶然的机会打开了自己以前写的旧程序,时间大概是上世纪90年代后期(96-99年左右),代码是用C语言写的,运行在Windows 3.1或Windows 95环境下。看到它们,有一种看上学时照片的感觉,感觉是那么的青涩。拿出一段晒晒:
//-----------------------------------------------------------------------------
// 函数:NewPoint
// 功能:分配一个测点定义缓冲区。
// 入口参数:
// lpPNum 测点号指针。
// 出口参数:
// 如成功,返回在测点定义表中的偏移;如失败,返回0xffff。
//-----------------------------------------------------------------------------
WORD NewPoint(LPCSTR lpPNum)
{
WORD i;
LPTPOINT lpTmpPt;
// 在测点定义表中找空的缓冲区
for (i=0;i<PtTab.wCount;i++) if (PtTab.lpPt[i].tpDel) break;
if (i==PtTab.wCount) {
// 如未找到,则判断测点数是否已到最大值,如已到,则返回失败
if (PtTab.wCount+1>MAXPOINT) return(0xffff);
// 如未找到最大值,则测点总数加1。即在测点定义表的最后追加一个缓冲区
PtTab.wCount++;
}
// 初始化缓冲区
lpTmpPt=&PtTab.lpPt[i];
// 将删除标志(即缓冲区空标志)置1,作为后面具体定义时区分增加与修改的标志,
// 如是修改,则此标志必为0
lpTmpPt->tpDel=1;
// 拷贝测点号到缓冲区
lstrcpy(lpTmpPt->tpNum,lpPNum);
// 将前一此操作测点的定义复制到缓冲区
lstrcpy(lpTmpPt->tpName,HistPt.tpName);
lpTmpPt->tpType=HistPt.tpType;
lpTmpPt->tpOp=HistPt.tpOp;
// 赋缺省的状态与数值
lpTmpPt->tpState=PS_SUSP;
lpTmpPt->tpRValue=0;
lpTmpPt->tpDValue=0;
// 置缺省的状态变化时间为当前时间
_fmemcpy(&lpTmpPt->tpTime,&Time,sizeof(SYSTIME));
// 将偏移值返回
return(i);
}
这是当年开发的一个煤炭安全监控软件里增加新测点的函数。如果在当年看这段代码,感觉这应该是一段挺不错的代码,比如:注释很多,几乎每行都有注释;匈牙利命名法,使用像lp、w这样的前缀;结构、数组、宏定义,看起来都是有板有眼。
时间已经过去十几年了,计算机系统、开发语言、设计思想都有了很大转变,现在要写一段同样功能的代码,可能完全不同了。
最大的变化应该是面向对象技术的应用,测点和测点表都会从struct变为class,测点数组可能会用std::vector或std::list代替,并且用new来动态分配,宏定义也会换成常量或枚举。而上面这个创建新测点的函数,也会被封装到测点表这个类中。面向对象技术改变了我们思考和实践的方式,而且这个改变作用是巨大的。
再有就是一些设计思想的转变,比如对注释的看法。以前,注释多可能意味着可读性强。但《重构》一书中说:“你看到一段代码有着长长的注释,然后发现,这些注释之所以存在乃是因为代码很糟糕。”再看看上面这段代码,前半段,其实是查找一个空的测点位置,完全可以用Extract Method(提炼函数)重构方法将其移入另外一个函数,并给其一个准确的命名,而不需要注释。后半段,“代码已经清楚说明了一切,注释已经变得多余了。”
匈牙利命名法,已成为争议最大的命名法,其类型冗余常常大于它所带来的收益。它来自微软的一名匈牙利程序员,但现在微软的.Net和它的编程语言中,微软更换了这一法则,在C#中以骆驼命名法和帕斯卡命名法居多。
计算机系统的提升也改变着程序。早年16位OS上编程需要区分远指针和近指针,但现在32位环境下,C++指针变量前缀一般都是p,很少见到lp。
技术在进步,编程思想在转变,人的思维也在不断更新。也许再过十几年,现在听都没有听说过的新技术会大行其道,你回头再看看现在的代码,可能也会有像我今天的感觉。但无论怎样,请不要轻视我们的过去,因为没有过去的积累,就没有今天的进步。
//-----------------------------------------------------------------------------
// 函数:NewPoint
// 功能:分配一个测点定义缓冲区。
// 入口参数:
// lpPNum 测点号指针。
// 出口参数:
// 如成功,返回在测点定义表中的偏移;如失败,返回0xffff。
//-----------------------------------------------------------------------------
WORD NewPoint(LPCSTR lpPNum)
{
WORD i;
LPTPOINT lpTmpPt;
// 在测点定义表中找空的缓冲区
for (i=0;i<PtTab.wCount;i++) if (PtTab.lpPt[i].tpDel) break;
if (i==PtTab.wCount) {
// 如未找到,则判断测点数是否已到最大值,如已到,则返回失败
if (PtTab.wCount+1>MAXPOINT) return(0xffff);
// 如未找到最大值,则测点总数加1。即在测点定义表的最后追加一个缓冲区
PtTab.wCount++;
}
// 初始化缓冲区
lpTmpPt=&PtTab.lpPt[i];
// 将删除标志(即缓冲区空标志)置1,作为后面具体定义时区分增加与修改的标志,
// 如是修改,则此标志必为0
lpTmpPt->tpDel=1;
// 拷贝测点号到缓冲区
lstrcpy(lpTmpPt->tpNum,lpPNum);
// 将前一此操作测点的定义复制到缓冲区
lstrcpy(lpTmpPt->tpName,HistPt.tpName);
lpTmpPt->tpType=HistPt.tpType;
lpTmpPt->tpOp=HistPt.tpOp;
// 赋缺省的状态与数值
lpTmpPt->tpState=PS_SUSP;
lpTmpPt->tpRValue=0;
lpTmpPt->tpDValue=0;
// 置缺省的状态变化时间为当前时间
_fmemcpy(&lpTmpPt->tpTime,&Time,sizeof(SYSTIME));
// 将偏移值返回
return(i);
}
这是当年开发的一个煤炭安全监控软件里增加新测点的函数。如果在当年看这段代码,感觉这应该是一段挺不错的代码,比如:注释很多,几乎每行都有注释;匈牙利命名法,使用像lp、w这样的前缀;结构、数组、宏定义,看起来都是有板有眼。
时间已经过去十几年了,计算机系统、开发语言、设计思想都有了很大转变,现在要写一段同样功能的代码,可能完全不同了。
最大的变化应该是面向对象技术的应用,测点和测点表都会从struct变为class,测点数组可能会用std::vector或std::list代替,并且用new来动态分配,宏定义也会换成常量或枚举。而上面这个创建新测点的函数,也会被封装到测点表这个类中。面向对象技术改变了我们思考和实践的方式,而且这个改变作用是巨大的。
再有就是一些设计思想的转变,比如对注释的看法。以前,注释多可能意味着可读性强。但《重构》一书中说:“你看到一段代码有着长长的注释,然后发现,这些注释之所以存在乃是因为代码很糟糕。”再看看上面这段代码,前半段,其实是查找一个空的测点位置,完全可以用Extract Method(提炼函数)重构方法将其移入另外一个函数,并给其一个准确的命名,而不需要注释。后半段,“代码已经清楚说明了一切,注释已经变得多余了。”
匈牙利命名法,已成为争议最大的命名法,其类型冗余常常大于它所带来的收益。它来自微软的一名匈牙利程序员,但现在微软的.Net和它的编程语言中,微软更换了这一法则,在C#中以骆驼命名法和帕斯卡命名法居多。
计算机系统的提升也改变着程序。早年16位OS上编程需要区分远指针和近指针,但现在32位环境下,C++指针变量前缀一般都是p,很少见到lp。
技术在进步,编程思想在转变,人的思维也在不断更新。也许再过十几年,现在听都没有听说过的新技术会大行其道,你回头再看看现在的代码,可能也会有像我今天的感觉。但无论怎样,请不要轻视我们的过去,因为没有过去的积累,就没有今天的进步。
相关文章推荐
- 由一段游戏层代码想到的
- CLR系列:由一段代码所想到的
- 一段小小的C++代码(从保存H.264运动矢量过程中想到的)
- 软件测试(由软件工程检验一段代码是否正确想到的)
- 由一段会被人嘲笑的代码想到的
- 转:由一段游戏层代码想到的 (
- 从一段Deferred代码片段想到的
- 一段使linux中中文字体美化的有用代码
- 面试题:用 wait-notify 写一段代码来解决生产者-消费者问题
- 浏览器兼容性问题,是什么?是同一段js、cs代码,不同浏览器有不同效果,甚至bug
- 一段读取文件时显示进度条的代码(CSDN上收录)
- 块内像素循环的一段小代码理解
- 代替 marquee的一段jQuery代码
- 一段可自动点击运行的代码
- 一段代码,引发的思考。
- 我的一段实现分页的代码
- 状态机学习及对一段 java 代码的改写
- unity3d用鼠标拖动物体的一段代码 .
- easyUi中的一段漂亮代码之将list转换成tree.
- 分享一段网页跳转的代码