编码规范

网上的编码规范基本都是阿里的。所以我也是记录阿里的笔记

1.美元符号或者是下划线,不能作为变量的开始或者是结束

2.代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式

3.类名使用UpperCamelCase风格,必须遵从驼峰形式(某些情况诸如领域模型相关的命名除外);方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase风格,必须遵从驼峰形式(类和后面的区别在于第一子字母是大写还是小写)

4.常量命名全部大写,单词间用下划线隔开

5.包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词

6.抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类的名称开始,以Test结尾

7.对于Service和DAO类,基于SOA的理念,暴露出来的服务一定是接口,内部的实现类用Impl的后缀与接口区别(这里想想平时在controller层里面@Autowrite写的是接口还是实现类就明白了)

8.如果使用到了设计模式,建议在类名中体现出具体模式

9.包名统一使用单数形式;类名如果有复数含义,类名可以使用复数形式

10.不允许出现任何魔法值(即未经定义的常量)直接出现在代码中

11.不要使用一个常量类维护所有常量,应该按常量功能进行归类,分开维护

12.尽量不要在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,并且是整个应用的基础常量

13.long或者Long初始赋值时,必须使用大写的L,不能是小写的l,小写容易跟数字1混淆,造成误解

14. 接口类中的方法和属性不要加任何修饰符号(public 也不要加),保持代码的简洁性,并加上有效的Javadoc注释

15. 所有的覆写方法,必须加@Override注解

16.可变参数必须放置在参数列表的最后。(提倡同学们尽量不用可变参数编程)(就是最好用)

17.不能使用过时的类或方法 如:Thread.stop();

18.循环体内,字符串的联接方式,使用StringBuilder的append。注意,修改字符串不要用string,你可能感觉上面没有什么,但是用String会一直创建新的对象,一直占用堆的空间

19.final可以提高程序响应效率

19.慎用Object的clone方法来拷贝对象(没有怎么用过,不太了解)

20.所有的相同类型的包装类对象之间值的比较,全部使用equals方法比较

21.所有的POJO类属性必须使用包装数据类型

22.RPC方法的返回值和参数必须使用包装数据类型

23.所有的局部变量【推荐】使用基本数据类型 通常我们都会用is_disabled字段在数据库中表示某一个表的记录是否被逻辑删除,而这个字段,在Java代码中被映射成什么类型呢? Boolean?如果被映射成包装类型,那么数据库里面的这个字段就可以为null,有些读者会说,这并没有什么问题啊。可是,数据库is_disabled字段如果为null,代表什么逻辑含义呢? 这条记录究竟是有效还是无效? 如果这个字段不能为null,那么将其映射成基本类型是一个皆大欢喜的事情:既保证了数据库数据的完整性,我们在初始化的时候还可以忽略这个字段,因为boolean天生的默认值就是false 方法命名

24.Service/DAO层方法命名规约 - 获取单个对象的方法用get做前缀 - 获取多个对象的方法用list做前缀 - 获取统计值的方法用count做前缀 - 插入的方法用save(推荐)或insert做前缀 - 删除的方法用remove(推荐)或delete做前缀 - 修改的方法用update做前缀 方法和属性

25.定义DO/DTO/VO等POJO类时,不要设定任何属性默认值

26. 构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在init方法中

27.当一个类有多个构造方法,或者多个同名方法,这些方法应该按顺序放置在一起,便于阅读

28.类内方法定义顺序依次是:公有方法或保护方法 > 私有方法 > getter/setter方法

29.setter方法中,参数名称与类成员变量名称一致,this.成员名=参数名。在getter/setter方法中,尽量不要增加业务逻辑

30.缩进采用4个空格,禁止使用tab字符

31.单行字符数限不超过 120 个

32.IDE的text file encoding设置为UTF-8; IDE中文件的换行符使用Unix格式,不要使用windows格式

33. 方法体内的执行语句组、变量的定义语句组、不同的业务逻辑之间或者不同的语义之间插入一个空行 并发处理

34.获取单例对象需要保证线程安全,其中的方法也要保证线程安全

35.创建线程或线程池时请指定有意义的线程名称,方便出错时回溯

36.线程资源必须通过线程池提供,不允许在应用中自行显式创建线程

37. 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor去创建

38.多线程并行处理定时任务时,Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常,其它任务便会自动终止运行,使用ScheduledExecutorService则没有这个问题

39.使用CountDownLatch进行异步转同步操作,每个线程退出前必须调用countDown方法,线程执行代码注意catch异常,确保countDown方法可以执行, 避免主线程无法执行至countDown方法,直到超时才返回结果回溯

40.volatile解决多线程内存不可见问题。对于一写多读,是可以解决变量同步问题,但是如果多写,同样无法解决线程安全问题

41.HashMap在容量不够进行resize时由于高并发可能出现死链

42.ThreadLocal无法解决共享对象的更新问题,ThreadLocal对象建议使用static修饰。这个变量是针对一个线程内所有操作共有的,所以设置为静态变量, 所有此类实例共享此静态变量 注释规约

43. 所有的枚举类型字段必须要有注释,说明每个数据项的用途

44.与其"半吊子"英文来注释,不如用中文注释把问题说清楚。专有名词与关键字保持英文原文即可

45.注释掉的代码尽量要配合说明,而不是简单的注释掉

46.好的命名、代码结构是自解释的,注释力求精简准确、表达到位 数据库规约

47.是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsigned tinyint( 1表示是,0表示否)

48.表名、字段名必须使用小写字母或数字;禁止出现数字开头,禁止两个下划线中间只出现数字

49. 表名不使用复数名词

50.唯一索引名为uk_字段名;普通索引名则为idx_字段名

51.表的命名最好是加上业务名称_表的作用

52. 库名与应用名称尽量一致

53.小数类型为decimal,禁止使用float和double

54. 如果存储的字符串长度几乎相等,使用char定长字符串类型

55.varchar是可变长字符串,不预先分配存储空间,长度不要超过5000 明确日期和时间,日期使用date类型并使用xxDate进行Java字段命名,时间使用date_time类型并使用xxTime进行Java字段命名,以示区分

56.表必备三字段:id, gmt_create, gmt_modified

57.如果存储长度大于此值,定义字段类型为text,独立出来一张表,用主键来对应,避免影响其它字段索引效率

58. 如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释

59. 字段允许适当冗余,以提高性能,但是必须考虑数据同步的情况

60.单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表

61.业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引

62.超过三个表禁止join

63.在varchar字段上建立索引时,必须指定索引长度

64.页面搜索严禁左模糊或者全模糊

65.如果有order by的场景,请注意利用索引的有序性

66.建组合索引的时候,区分度最高的在最左边 禁止超过2个表的join语句出现在程序中 另外有关严禁使用全模糊查找,建组合索引时,区分度最高的往左放这些原则,在一定程度上会改变我们编写程序的习惯,所以应该时刻注意。

67.不要使用count(列名)或count(常量)来替代count(*)

68.在代码中写分页查询逻辑时,若count为0应直接返回,避免执行后面的分页语句

69.不得使用外键与级联,一切外键概念必须在应用层解决

70. 如果非得使用if()...else if()...else...方式表达逻辑,【强制】请勿超过3层,超过请使用状态设计模式

71.循环体中的语句要考量性能,以下操作尽量移至循环体外处理,如定义对象、变量、获取数据库连接,进行不必要的try-catch操作 这一条值得说一下,因为有些代码会走得比较深,写着写着就忘了它处于循环体的内部了。所以保持一个谨慎的心态比较重要。

后面要是在实践中遇到其他的会再补充

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值