标签:
良好的安全的程序,比看起来简洁的程序要好100倍
最好是去找一种好的方案,同时避免发生灾难,而不要去试图寻找最佳的方案。
1、软件构建
(1)定义问题。问题定义为用户出发,提出什么问题。
(2)需求分析。需求描述系统应该做什么。明确用户驾驭系统的功能。可以避免开发中的争论,而不是程序员自己定义需求,我做APP时,由于没有完整的需求,所以后面要重新设计。需求真的很重要,稳定的需求是软件开发的圣杯。但是随着客户参与项目时间越长,就会提出需求变更,一般为25%。但是应该在构建期间解决需求,否则成本会越来越高。如果变更太频繁,应该建立一套变更程序。确保进度、成本和需求的关系客户知道。并根据需要调整方法。
(3)软件构建。首先应对系统做综述。对主要构造块进行说明。各功能模块与其他交互越少越好。定义主要的类,802法则,80%的功能由20%的类完成。描述主要文件和数据库表的设计。对业务规则说明。用户界面设计,如果在需求阶段没有完成,应该在这里有详细说明,并能够模块化。资源管理,包括内存、线程、句柄。安全性,包括数据加密等。性能。可伸缩性。互用性。国际化。输入输出。错误处理,90%的代码用来处理异常、错误情况,应该定义规则。容错性。买还是造,有些功能已经可以买到,如电子表格处理工具等。
(4)详细设计。这里也有专门的设计师完成。由5步组成,1、系统结构。2、拆成包或各个模块。3、分解为类。4、子程序。5、子程序的设计,这里可以由编码者完成
(5)编码与调试。程序员完成。
(6)单元测试。程序员完成。
(7)集成测试
(8)系统集成
(9)系统测试
(10)系统维护
2、类
由抽象数据类型(ADT)加上继承和多态就成为类,ADT即将一系列对数据操作的集合。其设计的目的为隐藏细节等。所以对于数据都要采用private。访问为采用子程序。类的创建过程:
(1)类的总体设计,如数据和子程序。
(2)编写子程序
(3)复查和测试整个类。
3、伪代码编程
这是以后必须用的一种编程习惯,可以提高易读性,便于维护。同时减少代码质量,提高效率,减少错误的发生。步骤如下:
(1)分析子程序的功能,相关输入输出,隐含条件,处理过程。出错处理等。
(2)先用英语写程序头注释,介绍功能。然后用英语按照流程写伪代码。
(3)将头部注释,写好函数头。
(4)全部//注释,将注释翻译成语句,如果无法翻译,还是比较模糊,那么应该继续写伪代码,直到清晰为止。如果太长,可以用子程序。一行下面写一句或几句程序(控制结构)。
(5)编写过程中,应该用到防御式编程思想。
4、防御式编程
在遇到绝对不可能发生的情况下,如何保护自己,就跟开车一样。如:检查外部来源的值,如文件数据等。子程序输入参数值。输入数据错误怎么处理
断言:绝不可能发生的情况,只在开发模式下用,不放入产品中。对于高健壮性的程序而言,先处理断言,再处理错误。
错误处理:需要做的有错误码,返回值,显示错误,告警日志,关闭程序等处理。
异常:同样用来处理系统函数或一些不应该发生的情况。避免使用空catch。在构造函数和析构函数中不应该使用catch。
调试:如c++中可以用#define DEBUG确定只在调试模式下代码起作用。
这里教会了子程序中编程的思想。
5、变量
变量应在靠近第一次使用的地方声明,需要注意的问题有:变量存活时间尽可能短,变量应具有单一用途。
变量命名:应该描述变量的完整意思。
规则:限定词如total、sum、average、max、min、record要放在后面。
循环用词为teamCount、teamIndex.
状态命名:ready、type、needed
布尔变量:done、error、found、success、ok、available、complete
枚举命名:Color_Red等
类或接口中命名:首字母大写
子程序:首字母小写
成员变量:m_Read
全局变量:g_
常量: 大写用_隔开
对象:首字母小写
访问器子程序使用set和get为前缀
名字缩写:去掉非前置原因以及保留开始和最后一个字母等。不要使用数字。
6、类型
整数:除零错误。整数溢出。检查中间结果溢出。
浮点数:避免使用=判断,应该用减号
数组:边界
第13章
1、全局数据
对于全局数据,应该用访问器子程序来取代全局数据,这样做的好处有:
(1)可是避免操作错
(2)统一修改结构时更加方便,只要改动一处代码
(3)加锁比较方便,直接在子程序中加锁即可。
启示:APP项目中,这一点我放在了CommonInfo类中,全部用Static,但是缺少了子程序访问。
第15章
1、if else 和case
这里需要注意的地方是,一般用了if 就要考虑是否真的不需要else。对于我做的初始化数据那一块,如果失败了,没有考虑到。所以才出现问题。
所以无论如何加一个else子句,如果什么都没有,就在里面写上注释(即不需要else的原因)
if后面的判断,如果比较长的话,考虑用布尔函数。
2、case
用default来检测错误:如果defalut没有做其它处理,而且正常情况下也不会进入,那么就加入诊断消息,如写入错误日志,或者在屏幕上提示。这一点必须要注意。
在JAVA和c++中case后只能是整数。
3、循环
应该让人看到循环条件就知道这个循环是干什么的,里面应该是一个黑盒子,维护者不要看子程序就能明白
(1)下标不要用i/j/k,应该用实际的变量。如payCodeIdx divisionIdx 总数如numPayCodes。这样约定的话 人家一眼就能看出来,而且不会有下标出问题的情况,命名方式也比较简单,加上Idx就可以,这是我以前做试题的时候,遇到的问题,就是下标修改和使用错误,一直调试不出来,这样做就不会出问题了。
(2)循环结构应该清晰,如果太长就应该用子程序。创建方式,由内而外,最多不超过3层。
第17章
1、错误处理和goto
不要使用goto,当需要进行错误处理,需要跳转时,考虑try-finnaly,跳转到finally中,如果不支持它,那么用状态标记。
第18章
1、表驱动法
对于一些逻辑判断太多的情况,很多个if else组成,如根据年龄段来计算信息。这个时候可以用表来存储。
在java或者c++中可以用hash表,同时用键值转换,将一个年龄段转化为一个值。
如果情况呈现阶梯性,则不要用hash表,而用阶梯法。同时若情况很多,阶梯表的查询就不要采用顺序查询,而应该考虑二分查找等。
还有一种方法是,建立索引。索引一个表,而数据再放到一个表。这个其实没有hash表好用。
所以如果用hash表解决麻烦,就用阶梯法。
第19章
1、布尔型
(1)对于判断而言,不要用0和1来替代布尔的true和false。这个问题要改,这样也可以表面由=0等引起的问题。而对于具体的数值,应该用常量。
(2)简化判断表达式,这里用布尔函数实现。
(3)编写肯定的布尔表达式。
2、嵌套不要超过3个
这个时候考虑用子程序,或者用case等来进行简化。否则程序非常难以理解。如果程序写完,自己都看起来很累的话,那么就要改进,否则程序很难维护。
这个是我在做c++中选择曲线程序中碰到过的问题。一定可以简化的。
3、控制子程序的复杂度
将选择判断作为一个决策点,总的决策点不要超过10个,一般在6个以上就要考虑简化子程序了。
这一点要谨记,否则管理起来就很麻烦。
第20章
代码写完之后,要详细检查,阅读代码每小时能够检测出来的缺陷要比测试高出80%左右。检查发现一个错误只要3.5小时,而测试要花费15-25个小时。
软件重构和返工在不成熟的软件开发周期中可能消耗大约50%的时间。
设计过程中,开发人员平均每小时会引入1到3个缺陷,在编码阶段会平均每小时引入5到8个缺陷。
复查和结对编程是提高软件质量的一种重要手段,特备是代码复查,我以后一定要复查两遍。
第21章
以后在程序中,自己开发一个脚手架,用来对程序进行单元测试,即测试子程序的性能,输入和输出,这个是必须要做的。
对于程序中的告警,一定要处理。
对子程序进行调试修改时,保存原来的源代码。一次只修改一处。
第26章
提升性能
(1)少使用系统函数,因为系统函数很慢,精度很高,很多时候我们不需要这么高的精度。如log2 不如直接写出它的值。
(2)减少系统运算量,如加法代替乘法、乘法代替幂、利用三角恒等式代换等价的三角函数、用long 或int代替 longlong 整数、
用整数代替浮点数、用float代替double、用移位代替乘2等。
(3)子程序改为内联函数
(4)追求效率时,如果一直达不到要求,使用更加低级的语言,如汇编或C
1、对于使用工具IDE、测试工具、文档生成工具、代码自动生成工具,以后都要有所了解,对自己有利的一定要学习。
提高代码质量最好的方式是学习相关著名开源软件的做法,并利用人家已经实现的部分。
2、自己做单元测试。
第31章 布局
1、对于控制块 如if(){}写法为
if(){
}
这样来写,因为很多都是自动生成,直接回车就可以。
2、case写法
case:
...;
break;
这样对于子程序或者比较多的情况比较好。也比较整齐
3、一行中不要做两次操作,如不要把++n放在里面
4、每行只声明一个变量,尽量靠近变量第一次使用的地方声明。
int a;
int b;
这样看起来更加清晰。
5、C++中指针的* 要靠近变量,靠近类型的话只对第一个变量有效。
6、注释前面留一个空行。注释单独一行,这个从伪代码而来。
7、各功能块之见要分行。
8、子程序布局
在子程序参数过多时,布局如下:
bool funcName(
int a;
int b;
)这种格式,否则就按照一般格式。
9、类布局
类文件中 类的功能注释为
//****************************
//...
//***********************
子程序注释为
//-------------------------
//..
//------------------------
子程序之见要空行
一般注释为
//...
上面空一行
第35章 注释技术
1、行尾注释只用来声明数据。包括数据范围,单位,含义。包括全局数据的声明。并用一个一看就知道是全局变量的符号。如g_
2、注释控制结构。在之前要注释意图。之后如果太长的话要在}//if这样表示,看起来更加清晰。
3、子程序注释。子程序除了开头表明意图外,若使用全局变量,也应该做声明。在子程序内部,如果参数过长,则应该按照规范些,并在定义数据后面注释。
4、JavaDoc这个工具以后要使用。
第33 个人性格
1、要充分理解自己的程序,而不是用编译器来通过,确定取消所有警告。
2、提供实际的状况报告,否则最后苦的是自己,不需要再上级面前装自己。
3、多看别人优秀的开源程序,这是提高自己的很重要的方式。
4、乐于承认错误。
5、项目估计时,要坚定自己的立场,否则用加班什么的来完成,最后超过时间还会落得一个不讲信用的下场。
6、培养习惯很重要,优秀的程序员是在头几年就很优秀的,所以一开始就应该培养自己的良好习惯,才能不断提高。
7、碰到问题时,若花半个小时还没有解决,应该花10分钟重新思考问题,试着将它绕过去,寻找新的解决方案。再花一个小时重新设计。
代码大全笔记
标签:
原文地址:http://blog.csdn.net/u012599545/article/details/51149180