JAVA代码开发规范

规范如果太严会限制程序员的创新,规范如果没有,会写出的代码五花八门,本文尝试从个人代码的体验来说说那些应该作为规范,哪些不适合强制。

1. 命名

命名是最重要的规范,但给出比如驼峰命名是远远不够的,需要对程序中用到的「业务术语」和「技术术语」进行约束。

1.1 问题示例

比如,在「文件备份程序」GitHub地址的开发过程中,我经常要用到各种文件命名(文件夹路径字符串,文件夹路径对象,文件夹文件对象,文件路径字符串,文件路径对象,文件的文件对象,压缩的源文件夹<字符串,文件对象,路径对象>,压缩的目标文件.....),不同时期,不同的类,命名完全不同,代码很难阅读。(有的File结尾的表示字符串,有的表示文件对象;Path结尾的有时候表示字符串,有时候表示Path对象),代码一度阅读涉及文件的操作,都很费劲。

1.2 解决方案

文件命名规范

| 实体 | 类型 | 命名 | | ---------- | ------ | ----------- | | 文件 | File | xxxFile | | 文件夹 | File | xxxDir | | 文件路径 | Path | xxxFilePath | | 文件夹路径 | Path | xxxDirPath | | 文件路径 | String | xxxFileStr | | 文件夹路径 | String | xxxDirStr |

压缩文件命名规范

| 实体 | 类型 | 命名 | | ------------ | ---- | ----------- | | 压缩源文件夹 | File | sourceDir | | 目的压缩文件 | File | destZipFile | | 压缩源文件 | File | sourceFile | | 解压文件 | File | zipFile | | 解压文件夹 | File | destDir |

文件对比术语规范

| 实体 | 命名 | 说明 | | ---- | ------- | ------------------------------------------------------------ | | 摘要 | digest | 计算文件是否变更,目前通过MD5或文件长度 | | 版本 | version | 对文件夹整体生成摘要文件,统一的摘要文件,可以称为文件的一个版本。 |

2. 基本语法

2.1 控制语句

  • 优先选择用Stream ,forEach简化写法

  • 如果需要访问非final,使用普通循环写法

2.1类与record

  • 【推荐】优先选用record表示值对象或简单实体,业务复杂对象使用Class设计为实体,包含业务操作

2.2 接口

  • 【推荐】无不同实现可以不选用接口
  • 【强制】有不同实现选用接口

3. 通过新版JDK获取更强的代码的表现力

代码的表现力,是指在不影响阅读的前提下,代码越短越好。

先对比先两段代码,你觉得哪个更好? List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(5); list.add(3); VS var list = List.of(1, 5, 3); 可以明显感觉到,下面一种写法不仅代码量更少,也更容易阅读。我们应该选择不影响阅读体验的条件下,尽可能短的代码。随着java新语法的推进,语言的表现力也在增强,下面列举一些表现力更强的写法: 弱类型定义 var的语法,局部变量不用类型也是表达的增强,根据上下文可以很方便的阅读类型。

3.1 lamda

List<String> list = map.get("key"); if (list == null) { list = new ArrayList<>(); } VS List<String> list = map.computeIfAbsent("key", key -> new ArrayList<>()); lamda可以方便的把处理过程作为参数传递,可以很方便的实现「模板方法」设计模式。重用函数的执行骨架,协调调度传入的lamda过程。

3.2 流-lamda增强集合

jdk8开始支持的流其实是结合lamda做的一些语法糖。对集合常见操作比如遍历,map和reduce运算,提供了lamda支持。对集合的操作以前你关心怎么做,现在只需要关心做什么。 List<String> names = new ArrayList<>(); for (User user : users) { names.add(user.getName()); } VS List<String> names = users.stream().map(user -> user.name).collect(Collectors.toList());

3.3 链式写法

链式写法省略了重复的主语,表达力更强。 var article = new Article(1L, "testUser"); article.setTitle("title"); article.setContent("content"); article.setOrderNum(100); VS var article = new Article(1L, "testUser").setTitle("title").setContent("content").setOrderNum(100);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值