建议遵循的代码规范,大幅提升团队开发效率

 Java后端规范
 

下面是我在公司规范中摘写出来的一部分内容,这部分对绝大部分的团队都是使用的,希望能对大家有帮助! 

命名规范


1. 在 if/else/for/while/do 语句中必须使用大括号。 
说明:即使只有一行代码,也禁止不采用大括号的编码方式:if (condition) statements;
反例:

public void initInventoryAdjustmentReportJob() throws Exception {
    final JobNameEnum jobNameEnum = JobNameEnum.INIT_INVENTORY_ADJUSTMENT;

    // 需要执行的站点
    final List<MarketInfo> marketInfos = jobHelper.initExecuteMarketMergeEuNaIncludeUk(jobNameEnum);
    if (CollectionUtil.isEmpty(marketInfos)) return;

    // CenterId和国家映射关系
    final Map<String, String> centerIdMap = cowService.centerIdMap();

正例:

if (flag) {
    System.out.println("hello world");
}

2. 不允许任何魔法值(即未经定义的常量)直接出现在代码中。
说明:对于一些影响性能的参数值,后续可以考虑集成到Apollo配置中心
反例:

if (records.size() <= 5000) {
    inventoryAdjustmentsService.saveBatchSomeColumn(records);
} else {
    Lists.partition(records, 4000).forEach(v -> inventoryAdjustmentsService.saveBatchSomeColumn(v));
}

正例:

String KEY_PRE = "Id#taobao_1";

if (KEY_PRE.equals(key)) {
        //...
} 

  
3. Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。 
反例:

if (marketList.contains(marketId) || MarketHelper.SHARE_MARKET_ID.equals(marketId)){
    List<String> countryList = new ArrayList<>();
    if (warehouseById.getCountry().equals("EU")){
        countryList.addAll(Country.getEuCountryListNew());
    }else if (warehouseById.getCountry().equals("NA")){
        countryList.addAll(Country.getNaCountryListNew());
    }else{
        countryList.add(warehouseById.getCountry());
    }

    if (countryList.contains(ss.getCountry())){
        smartRepStorageVo.setOverseasShippedQuantity(nullTo0(smartRepStorageVo.getOverseasShippedQuantity()) + quantity);
    }
}

正例:

public void f(String str){
    String inner = "hi";
    if (inner.equals(str)) {
        System.out.println("hello world");
    }
}


4. 所有整型包装类对象之间值的比较,全部使用 equals 方法比较。 
说明:对于 Integer var = ? 在-128 至 127 之间的赋值,Integer 对象是在 IntegerCache.cache 产生, 会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都 会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方法进行判断。 
反例:

public static boolean isShareMarket(Integer marketId) {
    if (Objects.isNull(marketId)) return false;
    return StorageSerial.SHARE_MARKET_ID == marketId;
}

正例:

Integer a = 235;
Integer b = 235;
if (a.equals(b)) {
    // code
}


5. 包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词
反例:com.gerpgo.x.dao.KingdeeData
正例:com.gerpgo.x.dao.kingdee.data

6.类名使用 UpperCamelCase 风格,但以下情形例外:DO / BO / DTO / VO / AO / PO / UID 等,方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格, 例如: localValue / getHttpMessage() / inputUserId
反例:forcecode / UserDo / HTMLDto / XMLService / TCPUDPDeal / TAPromotion

正例:ForceCode / UserDO / HtmlDTO / XmlService / TcpUdpDeal / TaPromotion 7. 枚举类名带上 Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开,所有的枚举类型字段必须要有Javadoc注释,说明每个数据项的用途
说明:枚举其实就是特殊的常量类,且构造方法被默认强制是私有。 
反例:

public enum MarketOtherParams {
        MainWarehouseId,
        DefaultWarehouseId,

        TicketAssignPerson,        //Email回复
        TicketCallPerson,        //Call回复
        CharEncoding,
        NumberCountType,         //数值转换格式
        LoginMsg                    //预警消息
}

正例:

/**
 * 子账号生成状态枚举,请使用name比对
 * @Author: balen
 * @Date: 2021/6/22 11:31
 */
public enum GenerateStatusEnum {
    /**
     * 待执行
     */
    NEW,
    /**
     * 执行成功
     */
    SUCCESS,
    /**
     * 执行失败
     */
    FAIL
}


8. 将所有XxxConstant类名修改为XxxConstants,常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。不要使用一个常量类维护所有常量,要按常量功能进行归类,分开维护,说明:大而全的常量类,杂乱无章,使用查找功能才能定位到修改的常量,不利于理解,也不利于维护。例如:全局参数相关常量放在类GlobalConstants下;国家相关常量放在类 CountryConstants 下;通用常量放在类CommonConstants下;
反例:

public interface RocketmqConstant {

    String XXL_JOB_MQ_TRIGGER_TOPIC = "XXL_JOB_MQ_TRIGGER_TOPIC";

    String XXL_JOB_MQ_TRIGGER_TAG_LOGISTICS = "XXL_JOB_MQ_TRIGGER_TAG_LOGISTICS";

    String XXL_JOB_MQ_TRIGGER_PRODUCER_GROUP = "XXL_JOB_MQ_TRIGGER_PRODUCER_ERP_GROUP";

}
public class AdsStrategyConstant {
    /**
     * 默认时间格式化
     */
    public static final String FORMAT = DateUtil.YYYY_MM_DD;

    /**
     * 每小时订单量统计起止时间Key
     */
    public static final String LISTING_START_DATE = "listingStartDate";
    public static final String LISTING_END_DATE = "listingEndDate";

    /**
     * Acos起止时间Key
     */
    public static final String ACOS_START_DATE = "acosStartDate";
    public static final String ACOS_END_DATE = "acosEndDate";
}

正例:

/**
 * 全局参数
 * @author admin
 */
public class GlobalConstants {

   /**
    * 财务软件对接API密钥
    */
   public static final String FINANCE_API_KEY = "FINANCE_API_KEY";

}


9. 所有的类都必须添加类的描述信息、创建者、创建日期,类属性、方法的注释必须使用 Javadoc 规范,使用/**内容*/格式,不得使用// xxx 方式。 方法除了返回值、参数、 异常说明外,还必须指出该方法做什么事情,实现什么功能。 
说明: 对于注释的要求:第一、能够准确反映设计思想和代码逻辑;第二、能够描述业务含义,使别的程序员能够迅速了解到代码背后的信息。完全没有注释的大段代码对于阅读者形同天书,注释是给自己看的,即使隔很长时间,也能清晰理解当时的思路;注释也是给继任者看的,使其能够快速接替自己的工作。 
正例:

 /** 
* 类的描述信息
* @author Tom 
* @date 2021/08/27 
*/

/**
 * 查询SP广告 对应站点在时间段内对应的销售额
 * @param marketId 站点ID
 * @param dateBegin 开始时间
 * @param dateEnd 结束时间
 * @return 站点中msku时间段内对应的总销售额
 */
List<AllocationFeeThirdDataBase> getSPAdvertisementFee(Integer marketId, String dateBegin, String dateEnd);


10. 所有的时间类使用LocalDateTime或者LocalDate不再使用Date


集合规范


1. 判断集合为空用cn.hutool.core.collection.CollectionUtil.isEmpty()判断
正例:
// 判断集合为空
CollectionUtil.isEmpty(list);

// 判断集合不为空
CollectionUtil.isNotEmpty(list);

反例
list != null && list.size() > 0

数据库规范


1. 简单的查询应该使用Mybatis Plus框架自带的查询方法实现,不应该去xml在写这些简单通用的查询
正例:

LbqWrapper<Warehouse> wrapper = Wraps.<Warehouse>lbQ().eq(Warehouse::getType, Warehouse.Type.SELF.name());
    
List<Warehouse> warehouseList = warehouseService.list(wrappber);

反例:

@ResultMap(value = "BaseResultMap")
@Select("select * from e_warehouse where type = #{type}")
List<Warehouse> listByType(@Param("type") String type);

2. 禁止使用*查询,需要用到什么字段只查对应的字段即可(主要就是防止全表扫描,减少回表操作)
正例:
// 例如只要查id和name字段
final LbqWrapper<Warehouse> wrapper = Wraps.<Warehouse>lbQ()
        .eq(Warehouse::getType, Warehouse.Type.SELF.name())
        .select(Warehouse::getId, Warehouse::getName);

    反例:
// 例如只要查id和name字段,该方法查出了所有字段,其他字段查出来是没意义的
@ResultMap(value = "BaseResultMap")
@Select("select * from e_warehouse where type = #{type}")
List<Warehouse> listByType(@Param("type")String type);

3. 联表查询需要写在对应的xml中,不能写在Mapper.java文件
正例:

SELECT
          t1.id,
          t1.warehouse_id AS warehouseId,
          t1.product AS sku,
          t1.seller_sku AS msku,
          t1.fulfillable_quantity AS availableQuantity,
          t1.unsellable_quantity AS defectiveQuantity,
          t1.reserved_untreated AS reservedUntreated,
          t1.reserved_processed AS reservedProcessed,
          t3.small_image_url AS productImageUrl,
          t3.`name` AS productName,
          t3.product_type AS productType,
          t3.unit,
          t3.state  AS  productState
FROM e_storage t1
JOIN e_warehouse t2 ON t2.id = t1.warehouse_id
JOIN e_product t3 ON t3.sku = t1.product

反例:

// 在Mapper.java文件写联表查询阅读性非常差
@Select("<script>" +
        "SELECT " +
        "t1.product AS product , " +
        "sum(" +
        "t1.purchase_cost * " +
        "IF( t2.type = 'FBA', t1.fulfillable_quantity + t1.unsellable_quantity + t1.reserved_quantity, " +
        "t1.fulfillable_quantity + t1.unsellable_quantity )) / " +
        "sum(IF( t2.type = 'FBA', t1.fulfillable_quantity + t1.unsellable_quantity + t1.reserved_quantity, " +
        " t1.fulfillable_quantity + t1.unsellable_quantity)) AS purchaseCost " +
        "FROM `e_storage` t1 " +
        "LEFT JOIN e_warehouse t2 ON t1.warehouse_id = t2.id " +
        "where t1.product in  " +
        "<foreach item='sku' index='index' collection='skus'  open='(' separator=',' close=')'> " +
        "#{sku}" +
        "</foreach> " +
        "GROUP BY t1.product " +
        "</script>")
List<Storage> selectAverPurchaseCostBySkus(Set<String> skus);

4. 参考阿里巴巴规范

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/599381.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式学习<1>:建立工程、GPIO

嵌入式学习_part1 本部分笔记用于学习记录&#xff0c;笔记源头 >>b站江科大_STM32入门教程 建立工程、GPIO 开发环境&#xff1a;keil MDK、STM32F103C8T6 1 &#xff09;建立工程 &#xff08;1&#xff09;基于寄存器开发、基于标准库 或者 基于HAL库开发; &…

【代码随想录——哈希表】

1.哈希表理论基础 首先什么是 哈希表&#xff0c;哈希表&#xff08;英文名字为Hash table&#xff0c;国内也有一些算法书籍翻译为散列表&#xff0c;大家看到这两个名称知道都是指hash table就可以了&#xff09;。 那么哈希表能解决什么问题呢&#xff0c;一般哈希表都是用…

高素质高学历婚恋相亲交友平台有哪些?分享我的网上找对象成功脱单经历!

尽管觉得在社交软件上找到真爱的可能性很小&#xff0c;但我却时常看到别人成功的案例&#xff0c;这也让我跃跃欲试了。没想到&#xff0c;我真的成功了&#xff01;以下是我亲身使用过的一些方法&#xff0c;在此与大家分享&#xff0c;仅供参考哦&#xff01; &#x1f449;…

c++ cpp 在类中执行线程 进行恒定计算

在编程中&#xff0c;顺序执行是常见的模式&#xff0c;但是对cpu的利用率不是很高&#xff0c;采用线程池&#xff0c;又太麻烦了&#xff0c;原因是还得不断地把任务拆分&#xff0c;扫描返回值。 如果 初始化n个类的时候&#xff0c;传递数据自身即可异步计算&#xff0c;那…

六、文件查找

一、文件查找 1.查找文件内容 ​ 命令&#xff1a;grep keywords /dir_path/filename 2.查找系统命令 ​ 命令&#xff1a;which command 3.查找命令及配置文件位置 ​ 命令&#xff1a;whereis command 4.find查找 ​ find $find_path -name|-type|-perm|-size|-atime…

【前端】HTML基础(3)

文章目录 前言一、HTML基础1、表格标签1.1 基本使用1.2 合并单元格 2、列表标签2.1 无序列表2.2 有序列表2.3 自定义列表 3、 表单标签2.1 form标签2.2 input标签2.3 label标签2.4 select标签2.5 textarea标签 4、无语义标签5、HTML特殊字符 前言 这篇博客仅仅是对HTML的基本结…

RVM(相关向量机)、CNN_RVM(卷积神经网络结合相关向量机)、RVM-Adaboost(相关向量机结合Adaboost)

当我们谈到RVM&#xff08;Relevance Vector Machine&#xff0c;相关向量机&#xff09;、CNN_RVM&#xff08;卷积神经网络结合相关向量机&#xff09;以及RVM-Adaboost&#xff08;相关向量机结合AdaBoost算法&#xff09;时&#xff0c;每种模型都有其独特的原理和结构。以…

streamlit通过子目录访问

运行命令&#xff1a; streamlit hello 系统默认使用8501端口启动服务&#xff1a; 如果想通过子目录访问服务&#xff0c;可以这么启动服务 streamlit hello --server.baseUrlPath "app" 也可以通过以下命令换端口 streamlit hello --server.port 9999 参考&…

2024最新CTF入门的正确路线

目录 前言 一、什么是CTF比赛&#xff1f; 二、CTF比赛的流程 三、需要具备的知识 四、总结 前言 随着网络安全意识的增强&#xff0c;越来越多的人开始涉足网络安全领域&#xff0c;其中CTF比赛成为了重要的学习和竞赛平台。本人从事网络安全工作多年&#xff0c;也参加过…

甲小姐对话柳钢:CEO对股东最大的责任,是对成功的概率负责|甲子光年

只有看见最微小的事物&#xff0c;才能洞悉伟大的定律。 来源&#xff5c;甲子光年 作者&#xff5c;甲小姐 刘杨楠 编辑&#xff5c;栗子 商业史上&#xff0c;职业经理人成为“空降CEO”的故事往往胜少败多。 “究其原因有三条——容易自嗨、喊口号&#xff1b;不顾公司历…

笔试强训Day19 数学知识 动态规划 模拟

[编程题]小易的升级之路 题目链接&#xff1a;小易的升级之路__牛客网 思路&#xff1a; 按题目写即可 注意辗转相除法。 AC code&#xff1a; #include<iostream> using namespace std; int gcd(int a, int b) {return b ? gcd(b, a % b) : a; } int main() {int n…

三步学会苹果手机怎么关震动的方法!

苹果手机的震动功能在某些情况下可能会被认为是不必要的&#xff0c;比如在会议、课堂或者晚间睡眠时。因此&#xff0c;学会如何关闭苹果手机的震动功能是非常实用的。苹果手机怎么关震动&#xff1f;在本文中&#xff0c;我们将介绍三个步骤&#xff0c;帮助你关闭苹果手机的…

openEuler 22.03 GPT分区表模式下磁盘分区管理

目录 GPT分区表模式下磁盘分区管理parted交互式创建分区步骤 1 执行如下步骤对/dev/sdc磁盘分区 非交互式创建分区步骤 1 输入如下命令直接创建分区。 删除分区步骤 1 执行如下命令删除/dev/sdc1分区。 GPT分区表模式下磁盘分区管理 parted交互式创建分区 步骤 1 执行如下步骤…

ThingsBoard版本控制配合Gitee实现版本控制

1、概述 2、架构 3、导出设置 4、仓库 5、同步策略 6、扩展 7、案例 7.1、首先需要在Giitee上创建对应同步到仓库地址 ​7.2、giit仓库只能在租户层面进行配置 7.3、 配置完成后&#xff1a;检查访问权限。显示已成功验证仓库访问&#xff01;表示配置成功 7.4、添加设…

喜报 | 擎创科技荣获NIISA联盟2023年度创新技术特等奖!

为深入实施创新驱动发展战略&#xff0c;紧紧把握全球科技革命和产业变革方向&#xff0c;密切跟踪前沿科技新趋势&#xff0c;经科技部中国民营促进会业务主管部门批准以及国家互联网数据中心产业技术创新战略联盟&#xff08;以下简称联盟&#xff09;总体工作安排&#xff0…

前端nginx(windows操作系统)学习配置开发验证

Nginx概述 Nginx 作为负载均衡在 Linux 系统上具备很好的并发性能&#xff0c;并且占用极小的内存。但是在 Windows 系统上并不支撑较高并发&#xff0c;所以在Windows系统上选用Nginx作为负载均衡&#xff0c;需要考虑并发情况。 若并发需求低于 300&#xff0c;部署集群仅以…

LMdeploy推理实践

在inter-studio平台上&#xff0c;下载模型&#xff0c;体验lmdeploy 下载模型 这里是因为平台上已经有了internlm2模型&#xff0c;所以建立一个符号链接指向它&#xff0c;没有重新下载 ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b /root/如…

四级英语翻译随堂笔记

降维表达&#xff1a;中译英&#xff0c;英译英 没有强调主语&#xff0c;没有说明主语&#xff1a;用被动 但如果实在不行&#xff0c;再增添主语 不会就不翻译&#xff0c;不要乱翻译 以xxx为背景&#xff1a;against the backdrop of the xxx eg:against the backdrop of…

关于执行CLAM的代码的一些需要记录的点

文章链接&#xff1a;[2004.09666] Data Efficient and Weakly Supervised Computational Pathology on Whole Slide Images (arxiv.org) 代码链接&#xff1a;GitHub - mahmoodlab/CLAM: Data-efficient and weakly supervised computational pathology on whole slide images…
最新文章