代码运行规范

本文详细阐述了编程中的命名、代码格式、OOP、并发处理、数据库操作等规范,旨在提升代码质量和团队协作效率。

命名风格 :
1.不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
2.严禁使用拼音与英文混合的方式,不允许直接使用中文的方式。
3.类名使用 UpperCamelCase 风格,必须遵从驼峰形式,
4.常量命名全部大写,单词间用下划线隔开
5.抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类 命名以它要测试的类的名称开始,以 Test 结尾
6.包名统一使用小写
7.杜绝完全不规范的缩写,避免望文不知义
8.接口类中的方法和属性不要加任何修饰符号。尽量不要在接口里定义变量,如果一定要定义变量,肯定是 与接口方法相关,并且是整个应用的基础常量。
常量定义
1.不允许未经定义的常量直接出现在代码中。
2.long 或者 Long 初始赋值时,必须使用大写的 L,不能是小写的 l,小写容易跟数字 1 混淆,造成误解。
代码格式
1.大括号的使用约定。如果是大括号内为空,则简洁地写成{}即可,不需要换行;如果 是非空代码块则:
1) 左大括号前不换行。
2) 左大括号后换行。
3) 右大括号前换行。
4) 右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。
2. 左小括号和字符之间不出现空格;同样,右小括号和字符之间也不出现空格。详见 第 5 条下方正例提示。 反
3.单行字符数限制不超过 120个,超出需要换行
1) 第二行相对第一行缩进 4 个空格,从第三行开始,不再继续缩进,参考示例。
2) 运算符与下文一起换行。
3) 方法调用的点符号与下文一起换行。
4) 在多个参数超长,在逗号后换行。
5) 在括号前不要换行,见反例。

4.方法参数在定义和传入时,多个参数逗号后边必须加空格。 method("a", "b", "c");  
5.没有必要增加若干空格来使某一行的字符与上一行对应位置的字符对齐。 

OOP 规约
1.Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals
2.所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较
对于 Integer var = ? 在-128 至 127 范围内的赋值,Integer 对象是在 IntegerCache.cache 产生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行 判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑, 推荐使用 equals 方法进行判断
3. 关于基本数据类型与包装数据类型的使用标准如下
1)所有的 POJO 类属性必须使用包装数据类型。
2)RPC 方法的返回值和参数必须使用包装数据类型。
3)所有的局部变量使用基本数据类型。
4.序列化类新增属性时,请不要修改 serialVersionUID 字段,避免反序列失败;如 果完全不兼容升级,避免反序列化混乱,那么请修改 serialVersionUID 值。
5.POJO 类必须写 toString 方法。如果继承了另一个 POJO 类,注意在前面加一下 super.toString。
集合处理
1.关于 hashCode 和 equals 的处理
1) 只要重写 equals,就必须重写 hashCode。
2) 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的 对象必须重写这两个方法
3) 如果自定义对象做为 Map 的键,那么必须重写 hashCode 和 equals
String 重写了 hashCode 和 equals 方法
2. ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException
3. 在 subList 场景中,高度注意对原集合元素个数的修改,会导致子列表的遍历、增 加、删除均产生 ConcurrentModificationException 异常。
4.使用集合转数组的方法,必须使用集合的 toArray
List list = new ArrayList(2);
list.add(“guan”);
list.add(“bao”);
String[] array = new String[list.size()];
array = list.toArray(array);
5.使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方 法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。
6.不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁
Iterator it = a.iterator();
while (it.hasNext()) {
String temp = it.next();
if (删除元素的条件) {
it.remove();
}
}
并发处理
1.获取单例对象需要保证线程安全,其中的方法也要保证线程安全
说明:资源驱动类、工具类、单例工厂类都需要注意。
2.创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。
3.线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。
4.线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样 的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
5.SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为 static,必须加锁,或者使用 DateUtils 工具类。
6.高并发时,同步调用应该去考量锁的性能损耗。能用无锁数据结构,就不要用锁;能 锁区块,就不要锁整个方法体;能用对象锁,就不要用类锁。
说明:尽可能使加锁的代码块工作量尽可能的小,避免在锁代码块中调用 RPC 方法。
7.对多个资源、数据库表、对象同时加锁时,需要保持一致的加锁顺序,否则可能会造 成死锁。
说明:线程一需要对表 A、B、C 依次全部加锁后才可以进行更新操作,那么线程二的加锁顺序 也必须是 A、B、C,否则可能出现死锁。
8.并发修改同一记录时,避免更新丢失,需要加锁。要么在应用层加锁,要么在缓存加 锁,要么在数据库层使用乐观锁,使用 version 作为更新依据。
9.多线程并行处理定时任务时,Timer 运行多个 TimeTask 时,只要其中之一没有捕获 抛出的异常,其它任务便会自动终止运行,使用 ScheduledExecutorService 则没有这个问题。
控制语句
1.在一个 switch 块内,每个 case 要么通过 break/return 等来终止,要么注释说明程 序将继续执行到哪一个 case 为止;
在一个 switch 块内,都必须包含一个 default 语句并且 放在最后,即使它什么代码也没有。
2.在 if/else/for/while/do 语句中必须使用大括号。即使只有一行代码,避免使用 单行的形式:if (condition) statements;
注释规约
1.类、类属性、类方法的注释必须使用 Javadoc 规范,使用/内容/格式,不得使用 //xxx 方式
2.所有的抽象方法(包括接口中的方法)必须要用 Javadoc 注释、除了返回值、参数、 异常说明外,还必须指出该方法做什么事情,实现什么功能。
3.所有的类都必须添加创建者和创建日期。
4.方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释 使用/
/注释,注意与代码对齐
5.所有的枚举类型字段必须要有注释,说明每个数据项的用途。
其它
1.后台输送给页面的变量必须加!var——中间的感叹号。说明:如果var=null或者不存在,那么!{var}——中间的感叹号。 说明:如果 var=null 或者不存在,那么!varvar=null{var}会直接显示在页面上。
2.获取当前毫秒数 System.currentTimeMillis(); 而不是 new Date().getTime();
异常处理
1.对大段代码进行 try-catch,这是不负责任的表现。catch 时请分清稳定代码和非稳 定代码,稳定代码指的是无论如何不会出错的代码。对于非稳定代码的 catch 尽可能进行区分 异常类型,再做对应的异常处理。
2.捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请 将该异常抛给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的 内容。
MySQL 数据库
1.表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint
2.表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只 出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑
3.表名不使用复数名词
4.禁用保留字,如 desc、range、match、delayed 等
5.主键索引名为 pk_字段名;唯一索引名为 uk_字段名;普通索引名则为 idx_字段名
6.小数类型为 decimal,禁止使用 float 和 double
7.如果存储的字符串长度几乎相等,使用 char 定长字符串类型。
8.varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长 度大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索 引效率。
SQL 语句
1.不要使用 count(列名)或 count(常量)来替代 count(
),count(distinct col) 计算该列除 NULL 之外的不重复行数
2.在代码中写分页查询逻辑时,若 count 为 0 应直接返回,避免执行后面的分页语句。
3.使用 ISNULL()来判断是否为 NULL 值。注意:NULL 与任何值的直接比较都为 NULL。
4.不得使用外键与级联,一切外键概念必须在应用层解决。
5.如果有全球化需要,所有的字符存储与表示,均以 utf-8 编码,注意字符统计函数 的区别。
ORM 映射
1.在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。
2.POJO 类的布尔属性不能加 is,而数据库字段必须加 is_,要求在 resultMap 中进行 字段与属性之间的映射。
3.不要用 resultClass 当返回参数,即使所有类属性名与数据库字段一一对应,也需 要定义;反过来,每一个表也必然有一个与之对应。
4.sql.xml 配置参数使用:#{}, #param# 不要使用${} 此种方式容易出现 SQL 注入
5.不允许直接拿 HashMap 与 Hashtable 作为查询结果集的输出。
安全规约
1.隶属于用户个人的页面或者功能必须进行权限控制校验。
2.用户敏感数据禁止直接展示,必须对展示数据进行脱敏。
说明:查看个人手机号码会显示成:158****9119,隐藏中间 4 位,防止隐私泄露。
3.用户输入的 SQL 参数严格使用参数绑定或者 METADATA 字段值限定,防止 SQL 注入, 禁止字符串拼接 SQL 访问数据库
4.用户请求传入的任何参数必须做有效性验证。
5.禁止向 HTML 页面输出未经安全过滤或未正确转义的用户数据。
6.表单、AJAX 提交必须执行 CSRF 安全过滤。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值