您好,欢迎访问三七文档
质量过程-建议性实践-高效编码部门:IT技术部撰写:叶刚文档编号:文档修改记录版本号主要作者修改记录完成日期1.0马广杰、叶刚创建2011-02-121.0.1叶刚修订:1.添加有效性注释2.子程序设计(聚合、耦合)2011-09-081.0.1叶刚修订:1.添加主题之高质量主程序2011-09-201.0.2叶刚修订:1.防御性编程2011-10-20编码的Checklist编号范围是C001–C999标准定义重要性定义重要一般参考检查表表头项目名称:项目编号:检查人:检查日期:共检查项:(个)有效检查项:(个)通过项:(个)通过率:(个)命名规范序号审查检查项重要性通过情况情况说明C001变量命名要清晰地描述所代表的客观实体,方法命名要清晰地描述所作的工作;重要是[]否[]免[]C002变量名的长度为9到15个字符,方法名为15到20个字符;是[]否[]免[]C003命名避免使用数字;是[]否[]免[]C004常量使用名词或名词词组命名,并使用“下划线”分割大写单词的方式,如DEFAULT_VALUE;是[]否[]免[]C005私有成员变量使用名词或名词词组命名,并使用“下划线”加“骆驼命名法”的方式,如_userName;是[]否[]免[]C006保护成员变量使用名词或名词词组命名,并使用“骆驼命名法”的方式,如userName;是[]否[]免[]C007公有成员变量使用名词或名词词组命名,并使用“Pascal命名法”的方式,如UserName;是[]否[]免[]C008局部变量和参数使用名词或名词词组命名,并使用“骆驼命名法”的方式,如userName;是[]否[]免[]C009属性使用名词或名词词组命名,并使用“Pascal命名法”的方式,如UserName;是[]否[]免[]C010方法使用动词或动宾短语命名,并使用“Pascal命名法”的方式,如GetUser();重要是[]否[]免[]C011事件使用名词或名词词组命名,并使用“Pascal命名法”的方式;是[]否[]免[]C012类、结构、枚举(枚举类和枚举值)使用名词或名词词组命名,并使用“Pascal命名法”的方式,如User;是[]否[]免[]C013异常类使用名词或名词词组命名,并使用“Pascal命名法”加“Exception”的方式;重要是[]否[]免[]C014接口使用名词或名词词组命名,并使用“I”加“Pascal命名法”的方式,如IUser;重要是[]否[]免[]C015命名空间使用名词或名词词组命名,并使用“Pascal命名法”的方式;是[]否[]免[]C016文件名要和类名相同;是[]否[]免[]C017变量名中如果含有计算限定词的话,是否将其放在最后(如SaleTotal)?是否在名称中用Count或Index来代替了Num?是[]否[]免[]C018简单循环中的循环控制变量的名字,常用的是i、j、k等;如果循环体较长是嵌套循环的话,应用有含义的名称,从而避免了控制变量的冲突;重要是[]否[]免[]C019是否用更富于含义的名称来代替了被叫作temp的临时变量?是[]否[]免[]C020用暗含非真即假的名字来给逻辑方法命名,如用Is作为逻辑变量名的前缀;重要是[]否[]免[]创建子程序序号审查检查项重要性通过情况情况说明C021考虑过如何测试子程序了吗?重要是[]否[]免[]C022是否从模块化水平或者满足时间和内存需求角度考虑过效率问题?是[]否[]免[]C023是否寻找过有帮助的算法?是[]否[]免[]C024是从几个设计方案中选择了最好的,还是随意选择了一个方案?是[]否[]免[]主题之【高质量子程序】创建子程序理由降低复杂性避免重复代码段限制改动带来的影响隐含顺序改进性能进行集中控制隐含数据结构隐含指针操作隐含全局变量促进重新使用代码段计划开发一个软件族改善某一代码段可读性改善可移植性分隔复杂操作独立非标准语言函数的使用简化复杂的布尔测试程序名称要恰当对于过程的名字,可以用一个较强的动词带目标的形式(动宾词组)。如PrintReport()对于函数名字,可以使用返回值的描述。如CurrentPenColor()避免无意义或者模棱两可的动词。如用FormatAndPrintOutput()来代替HandleOutPut()是一个很不错的名字描述子程序所做的一切。例如将FormatAndPrintOutput()替换为FormatOutput()和PrintOutput()两个方法是一个不错的选择名字的长度要符合需要,控制在9到20为宜,但不是绝对。强内聚性内聚性指一个子程序的内部各部分之间的联系程度建议的内聚性功能内聚性,功能内聚性是最强也是最好的一种内聚,程序执行一项并且仅仅是一项工作顺序内聚性,顺序内聚性是指在子程序内包含需要按特定顺序进行的、逐步分享数据而又不形成一个完整功能的操作通讯内聚性,通讯内聚性是在一个子程序中,两个操作只是使用相同数据,而不存在其它任何联系时产生的临时内聚性,因为同时执行的原因才被放入同一个子程序里,这时产生临时内聚性不建议的内聚性过程内聚性,当子程序中的操作是按某一特定顺序进行的,就是过程内聚性。与顺序内聚性不同,过程内聚性中的顺序操作使用的并不是相同数据逻辑内聚性,当一个子程序中同时含有几个操作,而其中一个操作又被传进来的控制标志所选择时,就产生了逻辑内聚性偶然内聚性,当同一个子程序中的操作之间无任何联系时,为偶然内聚性松散耦合性耦合指的是子程序之间的联系程度耦合标准耦合规模。指两个子程序之间联系的数量多少密切性。指的是两个子程序之间联系的直接程度可见性。可见性是指两个子程序之间联系的显著程度灵活性。灵活性是指改变两个子程序之间联系的容易程度耦合层次简单数据耦合。如果两个子程序之间传递的数据是非结构化的,并且全部都是通过参数表进行。数据结构耦合。如果在两个程序之间传递的数据是结构化的,它们之间就是数据结构耦合。控制耦合。如果一个子程序通过传入另一个子程序的数据通知它该作什么,那么这两个子程序就是控制耦合。全局数据耦合。如果两个子程序使用同一个全局数据,那它就是全局数据耦合。不合理耦合。如果一个子程序使用了另外一个子程序中代码,或者它改变了其中的局部变量,那么它们就是不合理耦合的。这种耦合也称之为“内容耦合”。CHECKLIST创建子程序是否检查过先决条件已经满足了?定义子程序将要解决的问题了吗?结构设计是否足够清楚,使得你可以给子程序起个好名字?考虑过如何测试子程序了吗?是否从模块化水平或者满足时间和内存需求角度考虑过效率问题?是否查阅过参考书,以寻找有帮助的算法?是否用详尽的PDL设计子程序?在必要时,是否在逻辑设计步骤前考虑了数据?是否检查过PDL,它很容易理解吗?是否注意到了足以使你返回到结构设计阶段的警告(使用了全局数据,更适合其它子程序的操作,等等)。是否使用了PDL到代码流程,是否把PDL作为编码基础并把原有的PDL转为注释?是否精确地把PDL翻译成了代码?在做出假设时,验证它们了吗?是从几个设计方案中选择了最好的,还是随意选择了一个方案?高质量子程序总体问题创建子程序的理由充分吗?如果把一个子程序中的某些部分独立成另一个子程序会更好的话,你这样做了吗?是否用了明显而清楚的动宾词组对过程进行命名?是否是用返回值的描述来命名函数?子程序的名称是否描述了它做的所有工作?子程序的内聚性是不是很强的功能内聚性?它只做一件工作并做得很好吗?子程序的耦合是不是松散的?两个子程序之间的联系是不是小规模、密切、可见和灵活的?防御性编程断言是否用于验证假设?子程序对于非法输入数据进行防护了吗?子程序是否能很好地进行程序终止?子程序是否能很好地处理修改情况?是否不用很麻烦?子程序是否信息隐蔽、松散耦合,以及使用“防火墙”数据外的代码?注:PDL(程序设计语言)用模拟英语的语句来精确描述每一个特定操作。避免使用最终程序语言的语句在设计意向这一层次上写PDL。当PDL写好之后,就可以根据它来编码,而PDL则成为程序语言的注释。这可以省去大量的注释工作。如果PDL遵循了这一指导方针,那么注释将是非常完备而且富有意义的。序号审查检查项重要性通过情况情况说明C025子程序是否还可以拆分出另一个独立的子程序?重要是[]否[]免[]C026子程序的内聚性是不是很强的功能内聚性?它只做一件工作并做得很好吗?是[]否[]免[]C027子程序的耦合是不是松散的?两个子程序之间的联系是不是小规模、密切、可见和灵活的?是[]否[]免[]C028子程序长度是100到150行之间吗?重要是[]否[]免[]C029子程序对于非法输入数据进行防护了吗,如子程序中是否采取了措施来防止出现被“0”除错误?重要是[]否[]免[]C030子程序是否检查返回值?重要是[]否[]免[]C031用编译程序编译代码时是否是无警告的?是[]否[]免[]C032形式参数与实际参数匹配吗?是[]否[]免[]C033子程序中参数的排列合理吗?与相似子程序中的参数排列顺序匹配吗?是[]否[]免[]C034子程序中参数个数是不是7个或者更少,是否用到了每一个参是[]否[]免[]数?C035如果子程序是一函数,是否在所有情况下它都会返回一个值?是[]否[]免[]主题之【防御性编程】主要思想其中心思想是,即使一个子程序被传入了坏数据,它也不会被伤害,哪怕这个数据是由其它子程序错误而产生的。聪明的程序员就以这点为依据开发软件。最有效的防错性编码途径是一开始就不要引入错误。可以采用逐步设计方法、在编码前先写好PDL、进行低层次设计、审查等都可以防止错误引入。因此,应优先考虑它们。不过,你可以把防错性编程与这些技术组合起来使用。如何防御保护程序免遭非法输入数据的破坏缺乏安全性的差劲程序的标志:垃圾进,垃圾出应该做到:1.垃圾进,什么都不出;2.垃圾进,错误提示出;3.不允许垃圾进检查所有来源于外部的数据值“外部”指文件、用户、网络、数据库、接口等等数值范围、长度、合法性等,狡猾的攻击,如缓冲区溢出、sql脚本注入、html或xml代码等检查子程序所有输入参数值检查参数值,同上决定如何处理错误的输入数据见“错误处理技术”断言是一个在假设不正确时会大声抗议的函数或宏指令。断言对于大型的复杂程序或可靠性要求极高的程序来说尤其有用。通过使用断言,程序员能更快速的排查出因修改代码或别的原因而造成的不匹配接口假定和错误。断言只是用在开发和维护阶段基本假定的类型举例输入/输出参数的取值处于预期的范围内吗?子程序开始(或结束)执行时文件或流处于打开(或关闭)状态吗?子程序开始(或结束)执行时文件或流的读写位置处于开头(或结尾)吗?文件或流的读写已用只读、只写或可读写方式打开了吗?仅用于输入的变量值没有被子程序修改过吗?指针或对象非空吗?传入子程序的数组或其它容器至少能容纳X个数据元素吗?表已经初始化,存储的数据真实吗?子程序开始或结束时,某个容器是空的或满的吗?使用断言的指导建议用错误处理技术来处理预期会发生的状况,用断言来处理绝不应该发生的状况断言用来检查代码中的bug,错误处理用来检查有害的输入数据避免把需要执行的代码放到断言中例如Debug.Assert(PerformAction());当关闭断言功能时,编译器很大可能把代码排除在外了用断言来注解并验证前条件和后条件前条件是一个义务,后条件是一个责任。断言是说明前条件和后条件的有利工具对于高健壮性的代码,应该先使用断言再处理错误错误处理技术返回中立值继续执行,返回无危害的数值,如0换用下一个正确的数据返回前次相同的数据如游戏颜色渲染换用最接近的合法值如倒车场景把警告信息记录到日志文件中注意安全性返回一个错误码通知系统错误发生的方法:设置一个状态变量的值用状态值作为函数的返回值用语言内建的异常机制抛出一个异常调用错误处理子程序或对象(
本文标题:高效编码规范
链接地址:https://www.777doc.com/doc-5502270 .html