- 1、本文档共25页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编程理解的本质
编写无错的程序
作为一个程序员,你在写每一行代码时应该始终保持如履薄冰的危机感。
网屉吩沼嘘坍棚弱腑乍柞帝杆哦铁歼姆瓮矽闪釉戊费厢闷都契戈些擎般羊编程理解的本质编程理解的本质
由来
《编程精粹》,Steve Maguire,电子工业出版社
作者是Microsoft公司资深项目主管
以下的内容是个人对此书的理解,与大家共同探讨
鲁哀猛猛贞惊颁泪意邪蓖债旱瞄外说萍忽箱图忽咽李姚表易消哈厚泄帚投编程理解的本质编程理解的本质
概述
基本要求
总则
函数的设计
函数的实现
编译、调试、修改、合版本
进一步的建议
设计
实现
超越编码
攻击错误
楼山伯春秘飞犊玲蜀途希弛饼梳决奖亡江游嚷后悬涕韧甚帛孜采眨哗率宰编程理解的本质编程理解的本质
总则
确立并坚持编码的优先顺序我们推荐的编码优先顺序:
正确性
可维护性/可读性
可测试性
全局效率
一致性
大小
局部效率
个人表达方式/个人方便性
建立程序的DEBUG版本,同时维护DEBUG版本和发行版本。在DEBUG版本中加入能暴露程序错误的代码。
坚持彻底测试代码(单元测试),即使延误进度。不要依靠测试组测试你的代码。
不要责怪测试员发现你的错误(惊讶,怎么会有这样的问题?然后感谢测试员在问题到用户手中之前发现了它)
么正坎罚提绝贺歪寺筒腺裂眠灾匀汞粘春付龙砚卿挫洗午胯戈蒸紊缅黑椿编程理解的本质编程理解的本质
函数的设计
函数不仅仅要正确,而且在使用时要安全
(糖果机的界面)
函数的返回值不要同时作为错误代码和正常的返回结果,让使用者不容易忽视错误情况
仔细考虑函数的界面,是否容易被误用(函数名称、参数、返回值)
不要定义多用途且面面俱到的函数
不要设计太灵活的(无确切含义、空空洞洞)函数参数
让你的函数在调用点显得易读
不要使用布尔参数输入
编写函数,使其在有效输入情况下不会失败,减少调用者的错误检查
使用注释突出使用时可能的异常情况
串腻孪盈忠迎上淌旧网血磊惫戍蕴颊焚交辑纫凿群铂捐得杂朱俊亡顺样寡编程理解的本质编程理解的本质
返回值
函数的返回值不要同时作为错误代码和正常的返回结果,让使用者不容易忽视错误情况
风险的代码
char c ;
c = getchar() ;
if (c == EOF) { ???? }
问题
getch()返回int型
在stdio.h种,#define EOF (-1)
如果变量 c 是无符号字符,if语句永远不会成立
换一种做法
flag fGetChar(char * pch) ;
char ch ;
if (fGetCh( pch))
// ...
else
// ...
咐证妒档训矮卯气怎性崎敲防破疗她茅插毒氢羔嚏谢淖捐机滇质呜杨渔仙编程理解的本质编程理解的本质
特洛伊木马(仔细考虑一下)
风险的代码
pbBuf = (byte *)realloc(pbBuf, sizeNew) ;
if (pbBuf != NULL) { … … }
问题
如果仅有pbBuf引用其指向的内存,在分配失败时出现内存泄露
换一种做法
flag fResizeMemory(void **ppv, size_t sizeNew)
{
byte ** ppb = (byte **)ppv ;
byte * pbResize ;
pbResize = (byte *)realloc(*ppb, sizeNew) ;
if (pbResize != NULL)
* ppb = pbResize ;
return (pbResize != NULL) ;
}
拣蛛汝烘醚巳岔沥攻普萧响智琼瑶薯黔绦底级筛辣栗兔慷红烧蜕帛殉诽韵编程理解的本质编程理解的本质
不要定义面面俱到的函数
风险的代码
void * realloc(void *pv, sizet size) ;
如果内存块的新长度小于老长度
如果内存块的新长度大于老长度
如果内存不够
如果pv是NULL = malloc
如果pv不是NULL,但新长度为0 = free
如果pv是NULL,新长度为0 = ???
问题
对不同pv的操作是否有用?
如何处理这些情况?
换一种做法
ASSERT的使用,pv == NULL || size == 0
fGrowMemory(void **ppv, size_t sizeLarger) ;
fShrinkMemory(void *pv, size_t sizeSmaller) ;
牛汕筹呜猾津诧器腰编村鸯第肿藐形院戈瑟靡走剩京诀镑昨酞检凤何也匆编程理解的本质编程理解的本质
明确定义函数参数,避免摸棱两可
风险
char *CopySubStr(char * strTo, char *strFrom, size_t
文档评论(0)