代码评审清单
- 格式:docx
- 大小:1.23 MB
- 文档页数:17
C#开发通用性代码审查清单1. 确保没有任何警告(warnings);2.如果先执行Code Analysis(启用所有Microsoft Rules)再消除所有警告就更好了;3. 去掉所有没有用到的usings,编码过程中去掉多余代码是个好习惯(参考:msdn);4. 在合理的地方检查对象是否为’null’,避免运行的时候出现Null Reference Exception ;5. 始终遵循命名规范,一般而言变量参数使用驼峰命名法,方法名和类名使用Pascal命名法(参考:msdn);6. 请确保你了解SOLID原则。
(根据维基百科定义:在程序设计领域,SOLID (单一功能、开闭原则、里氏替换、接口隔离以及依赖反转) 是由罗伯特·C·马丁在21世纪早期引入的记忆术首字母缩略字,指代了面向对象编程和面向对象设计的五个基本原则。
当这些原则被一起应用时,它们使得一个程序员开发一个容易进行软件维护和扩展的系统变得更加可能。
SOLID所包含的原则是通过引发编程者进行软件源代码的代码重构进行软件的代码异味清扫,从而使得软件清晰可读以及可扩展时可以应用的指南。
SOLID被典型的应用在测试驱动开发上,并且是敏捷开发以及自适应软件开发的基本原则的重要组成部分(参考:wiki/SOLID_面向对象设计)7. 代码可重用性:如果一块代码已经被使用超过一次,或者你希望将来使用它,请提取成一个方法。
将重复的工作做成通用的方法放在相关的类中,这样一旦你完成别人就可以使用了。
将常用功能开发成用户控件,这样可以跨项目重用它们(参考:①、②);8. 代码一致性:比方说,Int32写成int,String写成string,应该在代码里保持统一形式。
不能一会二写成int一会儿写成Int32;9. 代码可读性:代码应该是可维护的,便于其他开发者理解(参考:msdn);10. 释放非托管资源,比如文件I/O,网络资源等,一旦使用结束就应该释放它们,如果你想一旦超出使用范围就自动释放对象,可以使用usings将非托管代码括起来(参考:msdn);11. 合理实现异常处理(try/catch和finally块)和异常记录(参考:msdn);12. 确保代码中方法的行数不要过多,不超过30到40行;13. 及时用代码管理工具check-in/check-out代码(比如TFS) (参考:);14. 相互审查代码:和你的同事交换代码,实现内部审查;15. 单元测试:编写开发测试用例完成单元测试,确保代码被送到QA以前,基本测试完成(参考:msdn);16. 尽量避免for/foreach循环嵌套和if条件嵌套;17. 如果代码只会使用一次,请使用匿名类型(参考:msdn);18. 尽量使用LINQ查询和Lambda表达式,增加可读性(参考:msdn);19. 合理使用var、object和dynamic关键字。
代码评审检查表1.格式✧嵌套的IF是否正确地缩进✧注释是否准确并有意义✧是否使用有意义的标号✧代码是否基本上与开始时的模块模式一致✧是否遵循全套的编程标准2.程序语言的使用✧是否使用一个或一组最佳动词✧模块中是否使用完整定义的语言的有限子集✧是否使用的适当的转移语句3.数据引用错误✧是否引用了未初始化的变量✧数组和字符串的下标是整数值吗?下标总是在数组或字符串的大小范围之内吗?✧是否应该在使用常量的地方使用了变量✧变量是否被赋予了不同类型的值✧一个数据结构是否在多个函数或者子程序中引用,在每一个引用中明确定义了结构了吗4.数据声明错误✧所有变量都赋予正确的长度、类型和存储类了吗?如需要字符串的变量声明为字符数组了✧变量是否在声明的同时进行了初始化?是否正确初始化并与其类型一致?✧变量有相似的名称吗?是否自定义变量使用了系统变量名?✧存在声明过但是从未引用或只引用一次的变量吗?✧在特定模块中所有变量都显式声明了吗?如果没有,是否可以理解为该变量与更高级别的模块共享?5.计算错误✧计算中是否使用了不同数据类型的变量?如整型数与浮点数相加✧计算中是否使用了不同数据类型的变量?如字节与字相加✧计算时是否了解和考虑到编译器对类型和长度不一致变量的转换规则?✧赋值的目的变量是否小于赋值表达式的值✧在数值计算过程中是否可能溢出✧除数/模是否可能为0✧对于整型算术运算,特别是除法的代码处理是否丢失精度✧变量的值是否超出有意义的范围✧对于包含多个操作数的表达式,求值的次序是否混乱,运算的优先级是否正确6.比较错误✧比较正确吗?如小于与小于等于常发生混淆✧存在分数或者浮点值之间的比较吗?如果有,精度问题会影响比较吗✧每一个逻辑表达式都正确吗?逻辑计算如期进行了吗?求值次序有问题吗?✧逻辑表达式的操作数是逻辑值吗?如包含整型数的整型变量用于逻辑计算7.入口和出口的连接✧初始入口和最终出口是否正确✧对另一个模块的每一次调用是否恰当?如全部所需的参数是否传递给每一个被调用的模块?被传送的参数值是否正确的设置?对关键的被调用模块的意外情况是否处理?✧每个模块的代码是否只有一个入口和一个出口?8.存储器的使用✧每个域,在其第一次被使用前是否正确初始化?✧规定的域正确否?✧每个域是否有正确的变量类型声明9.控制流错误✧如果程序包含Begin-End、Do-While等语句组,End是否对应?程序、模块、子程序和循环能否终止?如果不能,可以接受吗?✧可能存在永远不停的循环码?✧存在循环从不执行吗?如果存在,可以接受吗?✧如果程序包含像Switch-Case等多分支语句,索引变量能超出可能的分支数目吗?如果超出,该情况能正确处理吗?✧是否存在丢掉一个错误,导致意外进入循环?✧代码执行路径是否已全部覆盖?是否能保证每条源代码语句至少执行一次?10.子程序参数错误✧子程序接收的参数类型、大小与调用代码发送的匹配吗?次序正确吗?✧如果子程序有多个入口点,引用的参数是否与当前入口点没有关联?✧常量当做形式参数传递时,是否意外在子程序中改动?✧子程序是否改变了仅作为输入值的参数?✧每一个参数的单位是否与相应的形参匹配?✧如果存在全局变量,在所有引用子程序是否有相似的定义和属性?11.输入输出错误✧软件是否严格遵守外部设备读写数据的专用格式✧文件或外设不存在或者未准备好的错误情况下有处理吗✧软件是否处理外部设备未连接、不可用或者读写过程中存储空间沾满等情况?✧软件以预期方式处理预计的错误了吗?✧检查错误提示信息的准确性、正确性、语法和拼写了吗12.逻辑和性能✧全部设计已实现否✧逻辑被最佳地编码否✧提取正确的错误/例外子程序否✧每一个循环执行正确的次数否13.维护性和可靠性✧清单格式适于提高可读性否✧标号和子程序符合代码的逻辑意义否✧对从外部接口采集的数据有确认否✧遵循可靠性编程要求否✧是否存在内存泄露的问题。
代码评审清单(Code Checklist )产品,项目组名称;_宅急送_________ 产品项号名称,公共_______________ 版本号:被检杳人簽字:—检杳內容: _ _检查人螯宇,_____________________ 检查日期’______________________说明:是杏尽童避免了嵌会的立•弔篦杂芳雄是否併行了必茅而充分的汗释拎K是否代码拥亍路径是否清晰S罰Chi航是否有決4分支控制逻短复杂度是否合浬是否诜行了必更1门充分的注释同个循坏怎是吞仅执行了羊而明确的巧毙占械比校需要挣常数玫在比较表达式的前面否代彳礎丧奸格ig化并能疝苴逻辑结枸尽量孑哎在循开丙岀观近程谐月奇个吐务可作远程谓用次数是否小于以冈1中因数是吞仕抱定范围内Joinb on矽页产恪匹0己问題淸单.冋幅沐阚窟改n期修改n期楡杳SQL r 是冈1语句』碍弓用乎符画单引号T^MO select *开预的语句,必姦指出旦饶宇SF严禁使用ins«t m2 Uiblc: values "t ? , ? , "?) >必须指1岀具依更0jt值広字段避兌隐含的炎型转换(不同数据类型字段明加)子宣询前后必须加上桔号邀免在我here使用,1* / 1=2’这*怯廿戎作为部分条件禁上使用椰图禁上使用XX in 0 or XX血CKm中的元素个数不应超过500)禁止使用or超辽500个其止使用not in・建议使冃not exist婪止在一条河语句中恃月3层以丄的嵌套如具勺多表连莪盯「应该有主从之分,尽重从一个表取数Where子句过滤条杵,索引列或过遞记录最多氏条林应験在前面字符邑连接必须使用“ rCaw when吾匀中巳能出珂二、k、u以及is mill运算袴左连接写送必須带”cxuei'关佬宰伝稈诅用蓟摇伎端启否有不必萼的冗輛摇Java代码审查检查丧类定义缺陷(CD)代码评申检査表软件代码检杳单(C语言)77 检鱼寮量和宏,数字帘金应该用宏未表不,检登宏足义中的数位、実型是合正佚月说明・1.本檢杳单为软件评頁朋检査较件产品惜俣和扶陷提供了指导。
java代码评审内容评审内容u ⼯具检查□ Eclipse警告□ FindBug□ CheckStyle□ Jupiter□ Subclipse 或者Subversiveu 代码注释内容(详细参考《代码注释规范》)□类注释内容□接⼝注释内容□⽅法注释内容□⽅法内部注释内容u 业务逻辑□业务逻辑实现的正确性□业务逻辑实现的完整性u 代码细节u 异常处理□接⼝⽅法声明需要抛出BusinessException□接⼝实现类最外层需要强制try….catch,对Exception进⾏marsh BusinessException包装□禁⽌出现try….catch后,没有对异常做任何处理的情况□在EJB边界对所有的异常进⾏marsh BusinessException包装□后台所有⽅法不再显⽰的进⾏异常的抛出声明,如有异常⽤wrappBusinessException包装成运⾏时异常直接抛出□前台代码直接抛出后台传递过来的异常□前台代码主动抛异常时,需要使⽤ExceptionUtils.wrappBusinessException;□前后台异常处理类统⼀使⽤nc.vo.pubapp.pattern.exception.ExceptionUtils□未⽤异常作为业务流程转换的判断u 效率□接⼝的定义使⽤参数数组来进⾏批量调⽤,⽽不是循环调⽤⾮批量接⼝□⽅法内部禁⽌出现循环执⾏相似重复的SQL语句□尽量使⽤绑定变量的sql□ sql关联的表不超过3个□ sql不采⽤外连接u 内存□ UFDobule常量必须使⽤UFDouble.ZERO, UFDouble.ONE□ UFBoolean常量必须⽤UFBoolean.TRUE, UFBoolean.FALSE□ UFBoolean的值必须采⽤UFBoolean.valueof(true|false|y|n|Y|N),的形式进⾏构造u 其他□临时表命名⽅式为:TEMP_(模块名称)_(具体作⽤) 例如:temp_gl_assid temp_fa_depdata □常量要使⽤NC枚举类□加锁应⽤统⼀的⼯具类,⼀定先加锁再查询□代码中访问数据库都⽤相应的VO类,禁⽌直接使⽤JDBC□⾯向接⼝编程□⽅法⼊⼝处不能对传⼊参数进⾏容错处理□ VO的get/set⽅法中不能包含业务逻辑□ VO中不能有业务⽅法,也不能有数据校验⽅法□避免全局变量注:代码评审不负责检查功能、逻辑是否正确,这些要靠单元测试和QA⼯作来解决。