收藏 分享(赏)

软件开发编码规范说明.doc

上传人:精品资料 文档编号:10589179 上传时间:2019-12-02 格式:DOC 页数:19 大小:103.70KB
下载 相关 举报
软件开发编码规范说明.doc_第1页
第1页 / 共19页
软件开发编码规范说明.doc_第2页
第2页 / 共19页
软件开发编码规范说明.doc_第3页
第3页 / 共19页
软件开发编码规范说明.doc_第4页
第4页 / 共19页
软件开发编码规范说明.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

1、2017软件开发编码规范说明梁峰 2017-5-31一、 高级语言 21.1 适用范围 21.2 程序风格 21.2.1. 代码缩进 21.2.2. 变量申明 21.2.3. 代码块长度 21.2.4. 代码换行 21.2.5. 空行及空格 31.3 命名 31.3.1. 变量命名 31.3.2. 常量命名 41.3.3. 函数或方法命名 41.3.4. 文件命名 41.4 注释 51.4.1. 代码注释 51.4.2. 变量注释 51.4.3. 函数注释 51.4.4. 文件注释 61.5 错误和异常处理 61.5.1. 错误处理 61.5.2. 异常处理 61.6 注意事项 91.6.1.

2、 变量的使用 91.6.2. 代码实现 91.7 日志规约 10二、 结构化查询语言 112.1. 程序风格 112.1.1. SQL 语句 .112.1.2. 存储过程 132.1.3. 存储过程命名 132.1.4. 变量命名 132.1.5. 游标命名 142.1.6. 常量命名 142.2. 建表规约 142.1. 安全规约 152.3. 注释 172.3.1. 代码注释 172.3.2. 存储过程注释 172.3.3. 常量及变量注释 172.4. 错误和和异常处理 172.5. 注意事项 18一、 高级语言1.1 适用范围主要针对JSP,CSS和JAVA高级编程语言,其它高级语言可

3、参照执行。1.2 程序风格1.2.1. 代码缩进程序块(包括函数、过程、结构的定义及循环、判断等语句)要严格采用缩进风格编写,对齐只使用空格键,不使用TAB键,所有的缩进为4个空格。1.2.2. 变量申明在函数内部申明变量时,必须在函数的开始位置。1.2.3. 代码块长度单个函数的程序行数不得超过200行。一个程序文件的长度不得超过5000行代码。1.2.4. 代码换行1. 较长的语句(80 字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。2. 不允许把多个短语句写在一行中,即一行只允许写一条语句(如 if 、

4、for 、do 、while、case 、switch 等语句自占一行)。3. 程序块的分界符必须各自独占一行并且位于同一列,同时与引用它们的语句左对齐。1.2.5. 空行及空格1. 通过摘要注释分隔的两个代码块之间、局部变量和它后边的语句之间、函数之间留一个空行。2. 在所有关键字和逗号之后要留一个空格,方法名之后不要留空格,紧跟左括号“(”,以与关键字区别。3. 如果“;”不是一行的结束符号,其后要留空格,如 for (initialization; condition; update)。4. 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=” “=”、“”这类

5、操作符前后不加空格。1.3 命名1.3.1. 变量命名1. 变量的名字须使用“名词”或者“形容词名词”。 变量的命名要求符合匈牙利命名法则,即开头字母用变量的类型(第一个字母小写),其余部分用变量的英文意思或其英文意思的缩写(尽量避免用中文的拼音),中间单词的第一个字母要大写。即: 变量名=变量类型+变量的英文意思(或缩写)。2. 变量名称须准确、完整地描述变量的含义。循环计数变量的名称须有含义。如果循环语句的长度超过了两行或者存在着嵌套循环,避免使用i、j 或 k 之类的变量,须使用有意义的变量,有利于程序的理解。(单字符的变量名一般只用于生命期非常短暂的变量)。3. 对于所有布尔型变量的命

6、名,能够直接从名称上看出为真的条件。枚举类型的变量名称须包含基础类型,以方便分辨变量的类型。例如,用Color 变量表示 ColorRed 和 ColorGreen 枚举类型的值。4. 在所有全局变量前首字母必须使用v, 接口指针必须使用“pi”,后跟接口名称缩写。在申明变量时要避免局部变量与公共变量同名、块内部变量与它外部变量同名。1.3.2. 常量命名常量的命名须代表抽象的实体,而非它们所代表的值,即对于涉及物理状态或者含有物理意义的常量,不允许直接使用不易理解的数字,必须用有意义的枚举或宏来代替。所有常量名均全部大写,由英文或其缩写,单词间以_隔开,如int MAX_NUM。1.3.3.

7、 函数或方法命名函数或方法的命名应该尽量用英文表达出函数或方法完成的功能。遵循动宾结构的命名法则,函数或方法名中动词在前,类的成员函数或方法须只使用“动词”, 第一个字母是小写,但是中间单词的第一个字母是大写。如果是返回一个成员变量的值,名称一般为get+成员变量名,如若返回的值是bool变量,一般以is作为前缀。如果是修改一个成员变量的值,名称一般为:set + 成员变量名。函数或方法名的长度不得少于8个字母。1.3.4. 文件命名文件的名字应该使用名词。每个单词第一个字母须大写。文件的命名应该尽量用英文表达出文件的内容。避免使用单词的缩写,除非它的缩写已经广为人知,如HTTP。文件的名字中

8、应能反映出文件的类型(针对不同的编程语言,有不同类型的文件。要求文件名的长度不得少于5个字母。对于文件中类的命名,前缀用大写字母J,后跟类的功能,中间单词第一个字母要大写。1.4 注释1.4.1. 代码注释注释将增加代码的清晰度。注释需简洁、明了,含义准确,防止注释二义性,避免在注释中使用缩写,特别是非常用缩写。注释不允许包括其他的特殊字符。可以先写注释,后写代码,但对代码的注释不可放在代码下面,须放在代码上方或右方相邻位置。1.4.2. 变量注释1. 对于变量的注释必须紧跟在变量的后面说明变量的作用。对于所有有物理含义的变量、常量、数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充

9、分自注释的,在声明时都必须加以注释,说明其物理含义。原则上对于每个变量都应该注释,但对于意义非常明显的变量,可以不注释。2. 对于全局变量必须有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等进行说明。1.4.3. 函数注释1. 对于函数,须在函数头部从函数的目的、功能、输入参数、输出参数、返回值、调用关系(函数、表)、“算法”、“日期”等方面进行注释。不允许在一行代码或表达式的中间插入注释。在定义函数原型时,须对每一个参数加以注释。2. 对于函数体内的分支语句(条件分支、循环语句等)必须编写注释,对于前后顺序不能颠倒的情况,建议在注释中增加序号。对于从一个cas

10、e 子句进入后续的 case 子句,须用注释“ Fall through”明确标记。当代码段较长,特别是多重嵌套时,这样做可以使代码更清晰,更便于阅读。3. 如果部分代码不再使用,但还要保存,须使用#if UNUSED 标识。如果部分代码目前不能使用,但最后肯定要用,须使用#if LATER 标识。使用“TODO: comment”标记未完成代码,“ BUG: comment”标记错误代码。1.4.4. 文件注释1. 每个源文件有效注释量必须占代码量的 20以上。必须在每个源文件的头部进行注释,注释须包含:版权说明、版本号、生成日期、作者、主要函数及其功能的简要说明、与其它文件的关系、修改日志

11、(说明对文件的修改内容、修改原因以及修改日期)。2. 修改代码的同时必须修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。1.5 错误和异常处理1.5.1. 错误处理系统在正常状态下以及无重载和硬件失效状态下,不应产生任何异常。发生异常或错误时,对于应用服务层不允许抛出异常中断服务程序的运行,须由系统自行处理保持程序正常运行,必须采用日志机制来报告异常,包括异常发生的时刻,错误说明,可能的原因、严重程度,发生异常或错误的位置等。1.5.2. 异常处理不允许使用异常实现来控制程序的正常流程,异常实现只用于异常和错误发生时如何使程序回到正常流程。在捕获语句的抛出异常子句中,必须抛出原

12、始异常,用以维护原始错误的堆栈分配。1. 【强制】Java 类库中定义的一类 RuntimeException 可以通过预先检查进行规避,而不应该通过 catch 来处理,比如:IndexOutOfBoundsException,NullPointerException 等等。说明:无法通过预检查的异常除外,如在解析一个外部传来的字符串形式数字时,通过 catch NumberFormatException 来实现。 正例:if (obj != null) . 反例:try obj.method() catch (NullPointerException e) . 2. 【强制】异常不要用来做

13、流程控制,条件控制,因为异常的处理效率比条件分支低。3. 【强制】对大段代码进行 try-catch,这是不负责任的表现。catch 时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。对于非稳定代码的 catch 尽可能进行区分异常类型,再做对应的异常处理。4. 【强制】捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。5. 【强制】有 try 块放到了事务代码中,catch 异常后,如果需要回滚事务,一定要注意手动回滚事务。6. 【强制】finally 块必须对资

14、源对象、流对象进行关闭,有异常也要做try-catch。 说明:如果 JDK7 及以上,可以使用 try-with-resources 方式。7. 【强制】不能在 finally 块中使用 return,finally 块中的 return 返回后方法结束执行,不会再执行 try 块中的 return 语句。8. 【强制】捕获异常与抛异常,必须是完全匹配,或者捕获异常是抛异常的父类。 说明:如果预期对方抛的是绣球,实际接到的是铅球,就会产生意外情况。9. 【推荐】方法的返回值可以为 null,不强制返回空集合,或者空对象等,必须添加注释充分说明什么情况下会返回 null 值。调用方需要进行 n

15、ull判断防止 NPE 问题。 说明:本手册明确防止 NPE 是调用者的责任。即使被调用方法返回空集合或者空对象,对调用者来说,也并非高枕无忧,必须考虑到远程调用失败、序列化失败、运行时异常等场景返回 null 的情况。10. 【推荐】防止 NPE,是程序员的基本修养,注意 NPE 产生的场景: 返回类型为基本数据类型,return 包装数据类型的对象时,自动拆箱有可能产生 NPE。反例:public int f() return Integer 对象 , 如果为 null,自动解箱抛 NPE。 数据库的查询结果可能为 null。 集合里的元素即使 isNotEmpty,取出的数据元素也可能为

16、 null。 远程调用返回对象时,一律要求进行空指针判断,防止 NPE。 对于 Session 中获取的数据,建议 NPE 检查,避免空指针。 级联调用 obj.getA().getB().getC();一连串调用,易产生 NPE。正例:使用 JDK8 的 Optional 类来防止 NPE 问题。11. 【推荐】定义时区分 unchecked / checked 异常,避免直接抛出newRuntimeException(),更不允许抛出 Exception 或者 Throwable,应使用有业务含义的自定义异常。推荐业界已定义过的自定义异常, 如:DAOException / Service

17、Exception 等。12. 【参考】在代码中使用“抛异常”还是“返回错误码”,对于公司外的http/api 开放接口必须使用“错误码”;而应用内部推荐异常抛出;跨应用间 RPC 调用优先考虑使用 Result 方式,封装 isSuccess()方法、“错误码”、“错误简短信息”。 说明:关于 RPC 方法返回方式使用 Result 方式的理由: 使用抛异常返回方式,调用方如果没有捕获到就会产生运行时错误。 如果不加栈信息,只是 new 自定义异常,加入自己的理解的 error message,对于调用端解决问题的帮助不会太多。如果加了栈信息,在频繁调用出错的情况下,数据序列化和传输的性能损

18、耗也是问题。13. 【参考】避免出现重复的代码(Dont Repeat Yourself),即 DRY 原则。说明:随意复制和粘贴代码,必然会导致代码的重复,在以后需要修改时,需要修改所有的副本,容易遗漏。必要时抽取共性方法,或者抽象公共类,甚至是共用模块。正例:一个类中有多个 public 方法,都需要进行数行相同的参数校验操作,这个时候请抽取:private boolean checkParam(DTO dto) . 1.6 注意事项1.6.1. 变量的使用1. 公共变量是增大模块间耦合的重要原因之一,在开发过程中能不用公共变量尽量不要使用。2. 临时或局部变量,使用时必须首先初始化,严禁

19、使用未经初始化的变量作为右值。初始化类的实例时,除非十分必要,否则不要赋 null 值,在创建新对象时必须检查返回值,或者采用标准方法处理内存管理错误。3. 尽量不要提供 public 和 protected 的成员变量,应使用属性来代替。1.6.2. 代码实现1. 不要在程序中使用运算符的默认优先级,应使用括号明确表达式的操作顺序。2. 对于要返回指针但可能出错的函数,应返回一个 BOOL 值和指向参数的指针。3. 每个接口不应该只有一个成员,最多也不应超过 20 个,尽量使每个接口中包含 35 个成员,并且接口成员中不要包含事件。4. 如果只有成员函数或操作符,应该使用类,而不用结构。5.

20、 定义类成员时,应明确定义其属性 public、protected 或 private,并按照此顺序分组定义。在类中不要说明全局数据成员,可以使用内嵌访问函数,以提高性能。6. 不要使用虚函数,如多态,除非必须使用,因为虚函数的开销较大,如果使用多态,其基类的构造函数必须是虚函数。为了清楚其间,重载虚方法时,应明确说明为 virtual。7. 在实现构造函数时,最好不要实现复杂费时的功能,但要确保初始化所有数据成员。同时要保证构造函数、析构函数不能失败,应在一个方法中实现内存分配,或潜在的错误处理。如果部分资源在析构函数执行之前释放,要确保全部域复位,如释放对象并将指针置为 NULL,以避免多

21、次释放出现异常。8. 每个类最好存放在单独的文件中,并且一个文件只能有一个命名空间,避免将多个命名空间放在同一个文件里面,每个命名空间对应一个目录。1.7 日志规约1. 【强制】应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架 SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。 import org.slf4j.Logger;import org.slf4j.LoggerFactory;private static final Logger logger = LoggerFactory.getLogger(Abc.

22、class);2. 【强制】日志文件推荐至少保存 15 天,因为有些异常具备以“周”为频次发生的特点。3. 【强制】应用中的扩展日志(如打点、临时监控、访问日志等)命名方式:appName_logType_logName.log。logType:日志类型,推荐分类有stats/desc/monitor/visit 等;logName:日志描述。这种命名的好处:通过文件名就可知道日志文件属于什么应用,什么类型,什么目的,也有利于归类查找。正例:mppserver 应用中单独监控时区转换异常。如:mppserver_monitor_timeZoneConvert.log 说明:推荐对日志进行分类,

23、如将错误日志和业务日志分开存放,便于开发人员查看,也便于通过日志对系统进行及时监控。4. 【强制】对 trace/debug/info 级别的日志输出,必须使用条件输出形式或者使用占位符的方式。 说明:logger.debug(“Processing trade with id: “ + id + “ symbol: “ + symbol); 如果日志级别是 warn,上述日志不会打印,但是会执行字符串拼接操作,如果 symbol 是对象,会执行 toString()方法,浪费了系统资源,执行了上述操作,最终日志却没有打印。 正例:(条件) if (logger.isDebugEnabled(

24、) logger.debug(“Processing trade with id: “ + id + “ symbol: “ + symbol); 正例:(占位符) logger.debug(“Processing trade with id: symbol : “, id, symbol); 5. 【强制】避免重复打印日志,浪费磁盘空间,务必在 log4j.xml 中设置additivity=false。正例: 6. 【强制】异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字 throws 往上抛出。 正例:logger.error(各类参数或者对象 toStr

25、ing + “_“ + e.getMessage(),e); 7. 【推荐】谨慎地记录日志。生产环境禁止输出 debug 日志;有选择地输出info 日志;如果使用 warn 来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘撑爆,并记得及时删除这些观察日志。说明:大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点。记录日志时请思考:这些日志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处?8. 【参考】可以使用 warn 日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适从。注意日志输出的级别,error 级别只记录系统逻辑出错、异

26、常等重要的错误信息。如非必要,请不要在此场景打出 error 级别。二、 结构化查询语言2.1. 程序风格2.1.1. SQL 语句1. 【强制】不要使用 count(列名)或 count(常量)来替代 count(*),count(*)是 SQL92 定义的标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL无关。说明:count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为NULL 值的行。2. 【强制】count(distinct col) 计算该列除 NULL 之外的不重复行数,注意 count(distinct col1, col2) 如果其中一列全

27、为 NULL,那么即使另一列有不同的值,也返回为 0。3. 【强制】当某一列的值全是 NULL 时,count(col)的返回结果为 0,但sum(col)的返回结果为 NULL,因此使用 sum()时需注意 NPE 问题。正例:可以使用如下方式来避免 sum 的 NPE 问题:SELECT IF(ISNULL(SUM(g),0,SUM(g) FROM table; 4. 【强制】使用 ISNULL()来判断是否为 NULL 值。注意:NULL 与任何值的直接比较都为 NULL。 说明: NULL1 的返回结果是 NULL,而不是 true。5. 【强制】 在代码中写分页查询逻辑时,若 cou

28、nt 为 0 应直接返回,避免执行后面的分页语句。6. 【强制】不得使用外键与级联,一切外键概念必须在应用层解决。 说明:(概念解释)学生表中的 student_id 是主键,那么成绩表中的student_id 则为外键。如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新,则为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。7. 【强制】禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。8. 【强制】数据订正时,删除和修改记录时,要先 select,避免出现误删

29、除,确认无误才能执行更新语句。9. 【推荐】in 操作能避免则避免,若实在避免不了,需要仔细评估 in 后边的集合元素数量,控制在 1000 个之内。10. 【参考】如果有全球化需要,所有的字符存储与表示,均以 utf-8 编码,注意字符统计函数的区别。说明:SELECT LENGTH(“轻松工作“); 返回为 12 SELECT CHARACTER_LENGTH(“轻松工作“); 返回为 4 如果要使用表情,那么使用 utfmb4 来进行存储,注意它与 utf-8 编码的区别。11. 【参考】 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但 TRUN

30、CATE 无事务且不触发 trigger,有可能造成事故,故不建议在开发代码中使用此语句。说明:TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同。2.1.2. 存储过程a) 在存储过程内部申明变量时,必须在存储过程的开始位置;b) 通过摘要注释分隔的两个语句块之间、局部变量和它后边的语句之间留一个空行。2.1.3. 存储过程命名用户存储过程要按照:USP _ + 系统模块缩写+ 功能标识 +表名(不带前缀)或功能的英文单词或英文单词缩写的方式命名。 2.1.4. 变量命名存储过程中变量名全部采用小写,局部变量名使用“v_”开头,输入参数以“i_开头,输出

31、参数以“o_”开头,输入输出参数用io_开头。所有输入参数必须显示声明。当变量代表列时,应使用%TYPE属性对变量命名。2.1.5. 游标命名游标应统一用后缀 “_cur” 命名。2.1.6. 常量命名常量应统一用 cn_ 的前缀命名。2.2. 建表规约 1. 【强制】表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint( 1 表示是,0 表示否) 。 说明:任何字段如果为非负数,必须是 unsigned。正例:表达逻辑删除的字段名 is_deleted,1 表示删除,0 表示未删除。2. 【强制】表名、字段名必须使用小写字母或数字,禁止出现数

32、字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。正例:getter_admin,task_config,level3_name 反例:GetterAdmin,taskConfig,level_3_name 3. 【强制】表名不使用复数名词。 说明:表名应该仅仅表示表里面的实体内容,不应该表示实体数量,对应于 DO 类名也是单数形式,符合表达习惯。4. 【强制】禁用保留字,如 desc、range、match、delayed 等,请参考 MySQL官方保留字。5. 【强制】主键索引名为 pk_字段名;唯一索引名为 uk_字段名;普通

33、索引名则为 idx_字段名。说明:pk_ 即 primary key;uk_ 即 unique key;idx_ 即 index 的简称。6. 【强制】小数类型为 decimal,禁止使用 float 和 double。说明:float 和 double 在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不正确的结果。如果存储的数据范围超过 decimal 的范围,建议将数据拆成整数和小数分开存储。7. 【强制】如果存储的字符串长度几乎相等,使用 char 定长字符串类型。8. 【强制】varchar 是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度大于此值,定义

34、字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索引效率。9. 【强制】表必备三字段:id, gmt_create, gmt_modified。说明:其中 id 必为主键,类型为 unsigned bigint、单表时自增、步长为1。gmt_create, gmt_modified 的类型均为 date_time 类型。10. 【推荐】表的命名最好是加上“业务名称_表的作用” 。正例:tiger_task / tiger_reader / mpp_config 11. 【推荐】库名与应用名称尽量一致。12. 【推荐】如果修改字段含义或对字段表示的状态追加时,需要及时更新字段

35、注释。13. 【推荐】字段允许适当冗余,以提高查询性能,但必须考虑数据一致。冗余字段应遵循: 不是频繁修改的字段。 不是 varchar 超长字段,更不能是 text 字段。 正例:商品类目名称使用频率高,字段长度短,名称基本一成不变,可在相关联的表中冗余存储类目名称,避免关联查询。14. 【推荐】单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。 说明:如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。15. 【参考】合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。正例:如下表,其中无符号值可以避免误存负数,且扩大了表

36、示范围。2.1. 安全规约1. 【强制】隶属于用户个人的页面或者功能必须进行权限控制校验。说明:防止没有做水平权限校验就可随意访问、修改、删除别人的数据,比如查看他人的私信内容、修改他人的订单。2. 【强制】用户敏感数据禁止直接展示,必须对展示数据进行脱敏。说明:查看个人手机号码会显示成:158*9119,隐藏中间 4 位,防止隐私泄露。3. 【强制】用户输入的 SQL 参数严格使用参数绑定或者 METADATA 字段值限定,防止 SQL 注入,禁止字符串拼接 SQL 访问数据库。4. 【强制】用户请求传入的任何参数必须做有效性验证。说明:忽略参数校验可能导致: page size 过大导致内

37、存溢出 恶意 order by 导致数据库慢查询 任意重定向 SQL 注入 反序列化注入 正则输入源串拒绝服务 ReDoS说明:Java 代码用正则来验证客户端的输入,有些正则写法验证普通用户输入没有问题,但是如果攻击人员使用的是特殊构造的字符串来验证,有可能导致死循环的结果。5. 【强制】禁止向 HTML 页面输出未经安全过滤或未正确转义的用户数据。6. 【强制】表单、AJAX 提交必须执行 CSRF 安全过滤。说明:CSRF(Cross-site request forgery)跨站请求伪造是一类常见编程漏洞。对于存在CSRF 漏洞的应用/网站,攻击者可以事先构造好 URL,只要受害者用户

38、一访问,后台便在用户不知情情况下对数据库中用户参数进行相应修改。7. 【强制】在使用平台资源,譬如短信、邮件、电话、下单、支付,必须实现正确的防重放限制,如数量限制、疲劳度控制、验证码校验,避免被滥刷、资损。说明:如注册时发送验证码到手机,如果没有限制次数和频率,那么可以利用此功能骚扰到其它用户,并造成短信平台资源浪费。2.3. 注释2.3.1. 代码注释注释将增加代码的清晰度。注释需简洁、明了,含义准确,防止注释二义性,避免在注释中使用缩写,特别是非常用缩写。注释不允许包括其他的特殊字符。注释要单独成行,放在语句前面,可采用单行或多行注释。2.3.2. 存储过程注释a) 每个存储过程有效注释

39、量必须占代码量的 20以上。必须在每个存储过程的头部进行注释,注释须包含:功能描述、作者、生成日期、返回值、与其它存储过程的关系(调用了哪些存储过程和被哪些存储过程调用),主要算法的简要说明、修改日志(注明修改内容、修改原因以及修改日期)。b) 修改代码的同时必须修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。c) 每条 SQL 语句和分支条件表达式原则上都应该注释,但对于意义非常明显的,可以不注释。2.3.3. 常量及变量注释对于常量及变量必须说明被保存值的含义及合法取值的范围。原则上对于每个常量及变量都应该注释,但对于意义非常明显的常量及变量,可以不注释。2.4. 错误和和

40、异常处理2. 凡是涉及到表操作(insert,update,select,delete)的 sql 语句,都必须进行错误捕捉,不能将错误带到后面的语句。3. 从表中取数的语句,应严格区分 NO_DATA_FOUND(无数据返回,用户级错误)和 TOO_MANY_ROWS(数据异常导致,系统级错误)的错误,并将相应错误信息填入错误信息。4. 所有存储过程(函数)在入口处统一先将返回错误代码(errCode)设置为 42, 出口一律在存储过程的结束部分,不允许中间返回,功能处理成功结束后再将错误代码(errCode)设置为 0(成功),避免程序过程中因错误未能正确捕获,导致功能未能完成,而程序却成

41、功返回的情况出现,所有存储过程(函数)结束前应统一捕获系统异常,所有捕获异常处都要定义 WHEN OTHER 子程序,以便捕获所有没有显示处理或其他类型的异常。2.5. 注意事项1. 查询的 Where 过滤原则,应使过滤记录数最多的条件放在最前面。2. SELECT 子句中应避免使用 SELECT *。3. 多使用 DECODE 函数来避免重复扫描相同记录或重复连接相同的表。4. 尽量多使用 COMMIT,以提高系统性能。5. 当 SQL 语句中要连接多个表时, 应使用表的别名并把别名前缀于每个列上以减少解析时间并6. 减少那些由列歧义引起的语法错误。7. 尽量用 EXISTS 替代 IN、用 NOT EXISTS 替代 NOT IN 以提高查询效率。8. 避免在 SELECT 子句中使用 DISTINCT. 一般可以考虑用 EXISTS 替换, EXISTS 使查询更为迅速,如可能最好是用多表连接代替 EXISTS 子句。9. WHERE 条件中尽量减少使用常量比较,改用主机变量。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报