福大周润发队——beta冲刺代码规范

这个作业属于哪个课程 2021春软件工程实践S班 (福州大学)
这个作业要求在哪里 团队作业六——beta冲刺+事后诸葛亮
团队名称 福大周润发队
团队成员 柯少彬、陈皓宇、梁扬新、林明昊、池毓地、李家成、黄凯荣、黄钰栋、陈力涵
这个作业的目标 beta冲刺代码规范的约定
其他参考文献 阿里巴巴Java开发手册

命名风格

  1. 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
  2. 类名使用UpperCamelCase风格,必须遵从驼峰形式,但以下情形例外:DO/ BO / DTO/ VO/ AO。
  正例:MarcoPolo/ UserDO/ XmlService/ TcpUdpDeal/ TaPromotion
  反例:macroPolo/ UserDo/ XMLService/ TCPUDPDeal/ TAPromotion
  1. 方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase风格,必须遵从驼峰形式。
    正例:localValue/ getHttpMessage()/ inputUserId

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

常量定义

  1. 不允许任何魔法值(即未经定义的常量)直接出现在代码中。
    反例:Stringkey="Id#taobao_"+tradeId;cache.put(key, value)
  2. 如果变量值仅在一个范围内变化,且带有名称之外的延伸属性,定义为枚举类。下面正例中的数字就是延伸信息,表示星期几。
    正例:public Enum{ MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6), SUNDAY(7);}

注释规约

  1. 类、类属性、类方法的注释必须使用Javadoc规范,使用/**内容*/格式,不得使用//xxx方式.
  2. 所有的抽象方法(包括接口中的方法)必须要用Javadoc注释、除了返回值、参数、异常说明外,还必须指出该方法做什么事情,实现什么功能。
  3. 对于注释的要求:第一、能够准确反应设计思想和代码逻辑;第二、能够描述业务含义,使别的程序员能够迅速了解到代码背后的信息。完全没有注释的大段代码对于阅读者形同天书,注释是给自己看的,即使隔很长时间,也能清晰理解当时的思路;注释也是给继任者看的,使其能够快速接替自己的工作。
  4. 特殊注释标记,请注明标记人与标记时间。注意及时处理这些标记,通过标记扫描,经常清理此类标记。线上故障有时候就是来源于这些标记处的代码。

安全规约

  1. 用户输入的SQL参数严格使用参数绑定或者METADATA字段值限定,防止SQL注入,禁止字符串拼接SQL访问数据库。

MySQL数据库

  1. 表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsignedtinyint(1表示是,0表示否)。
  2. 表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。说明:MySQL在Windows下不区分大小写,但在Linux下默认是区分大小写。因此,数据库名、表名、字段名,都不允许出现任何大写字母,避免节外生枝。
  正例:aliyun_admin,rdc_config,level3_name
  反例:AliyunAdmin,rdcConfig,level_3_name
  1. 字段允许适当冗余,以提高查询性能,但必须考虑数据一致。冗余字段应遵循:1)不是频繁修改的字段。2)不是varchar超长字段,更不能是text字段。
    正例:商品类目名称使用频率高,字段长度短,名称基本一成不变,可在相关联的表中冗余存储类目名称,避免关联查询。

服务器

  1. 服务器内部重定向使用forward;外部重定向地址使用URL拼装工具类来生成,否则会带来URL维护不一致的问题和潜在的安全风险。
  2. 给JVM设置-XX:+HeapDumpOnOutOfMemoryError参数,让JVM碰到OOM场景时输出dump信息。

SQL语句

  1. 不要使用count(列名)或count(常量)来替代count(),count()是SQL92定义的标准统计行数的语法,跟数据库无关,跟NULL和非NULL无关。
  2. 使用ISNULL()来判断是否为NULL值。说明:NULL与任何值的直接比较都为NULL。
    (1)NULL<>NULL的返回结果是NULL,而不是false。
    (2)NULL=NULL的返回结果是NULL,而不是true。
    (3)NULL<>1的返回结果是NULL,而不是true。

并发处理

  1. 获取单例对象需要保证线程安全,其中的方法也要保证线程安全。
  2. 创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。
正例:public class TimerTaskThread extends Thread {     
        public TimerTaskThread(){         
              super.setName("TimerTaskThread");...
        }
  1. 线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。
  2. SimpleDateFormat是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类。
  3. 高并发时,同步调用应该去考量锁的性能损耗。能用无锁数据结构,就不要用锁;能锁区块,就不要锁整个方法体;能用对象锁,就不要用类锁。
  4. 使用CountDownLatch进行异步转同步操作,每个线程退出前必须调用countDown方法,线程执行代码注意catch异常,确保countDown方法被执行到,避免主线程无法执行至await方法,直到超时才返回结果。
  5. 在并发场景下,通过双重检查锁(double-checkedlocking)实现延迟初始化的优化问题隐患(可参考The"Double-CheckedLockingisBroken" Declaration),推荐解决方案中较为简单一种(适用于JDK5及以上版本),将目标属性声明为volatile型。
  6. ThreadLocal无法解决共享对象的更新问题,ThreadLocal对象建议使用static修饰。这个变量是针对一个线程内所有操作共享的,所以设置为静态变量,所有此类实例共享此静态变量,也就是说在类第一次被使用时装载,只分配一块存储空间,所有此类的对象(只要是这个线程内定义的)都可以操控这个变量。
posted @ 2021-06-08 15:01  福大周润发  阅读(29)  评论(4编辑  收藏  举报