前言

前面我们讲了Java编程过程中的命名和注释、代码风格,今天我们来讲一些比较实用的Java编程技巧,帮你切实地提高代码可读性。这部分技巧比较琐碎,也很难罗列全面,我仅仅总结了一些我认为比较关键的,更多的技巧需要你在实践中自己慢慢总结、积累。

1. 把代码分割成更小的单元块

大部分人阅读代码的习惯都是,先看整体再看细节。所以,我们要有模块化和抽象思维,善于将大块的复杂逻辑提炼成类或者函数,屏蔽掉细节,让阅读代码的人不至于迷失在细节中,这样能极大地提高代码的可读性。不过,只有代码逻辑比较复杂的时候,我们其实才建议提炼类或者函数。毕竟如果提炼出的函数只包含两三行代码,在阅读代码的时候,还得跳过去看一下,这样反倒增加了阅读成本。

这里我举一个例子来进一步解释一下。代码具体如下所示。重构前,在 invest () 函数中,最开始的那段关于时间处理的代码,是不是很难看懂?重构之后,我们将这部分逻辑抽象成一个函数,并且命名为 isLastDayOfMonth,从名字就能清晰地了解它的功能,判断今天是不是当月的最后一天。这里,我们就是通过将复杂的逻辑代码提炼成函数,大大提高了代码的可读性。

// 重构前的代码public void invest(long userId, long financialProductId) {Calendar calendar = Calendar.getInstance();calendar.setTime(date);calendar.set(Calendar.DATE, (calendar.get(Calendar.DATE) + 1));if (calendar.get(Calendar.DAY_OF_MONTH) == 1) {​    return;}//...}// 重构后的代码:提炼函数之后逻辑更加清晰public void invest(long userId, long financialProductId) {if (isLastDayOfMonth(new Date())) {​    return;}//...}public boolean isLastDayOfMonth(Date date) {Calendar calendar = Calendar.getInstance();calendar.setTime(date);calendar.set(Calendar.DATE, (calendar.get(Calendar.DATE) + 1));if (calendar.get(Calendar.DAY_OF_MONTH) == 1) {return true;}return false;}

2. 避免函数参数过多

我个人觉得,函数包含 3、4 个参数的时候还是能接受的,大于等于 5 个的时候,我们就觉得参数有点过多了,会影响到代码的可读性,使用起来也不方便。针对参数过多的情况,一般有 2 种处理方法。

考虑函数是否职责单一,是否能通过拆分成多个函数的方式来减少参数。示例代码如下所示:

public void getUser(String username, String telephone, String email);// 拆分成多个函数public void getUserByUsername(String username);public void getUserByTelephone(String telephone);public void getUserByEmail(String email);

将函数的参数封装成对象。示例代码如下所示:


// 将参数封装成对象public class Blog {title: 33-改善代码质量的20条编程规范private String summary;private String keywords;private Strint content;private String category;private long authorId;}public void postBlog(Blog blog);

除此之外,如果函数是对外暴露的远程接口,将参数封装成对象,还可以提高接口的兼容性。在往接口中添加新的参数的时候,老的远程接口调用者有可能就不需要修改代码来兼容新的接口了。

3. 勿用函数参数来控制逻辑

不要在函数中使用布尔类型的标识参数来控制内部逻辑,true 的时候走这块逻辑,false 的时候走另一块逻辑。这明显违背了单一职责原则和接口隔离原则。我建议将其拆成两个函数,可读性上也要更好。我举个例子来说明一下。

public void buyCourse(long userId, long courseId, boolean isVip);// 将其拆分成两个函数public void buyCourse(long userId, long courseId);public void buyCourseForVip(long userId, long courseId);不过,如果函数是 private 私有函数,影响范围有限,或者拆分之后的两个函数经常同时被调用,我们可以酌情考虑保留标识参数。示例代码如下所示:// 拆分成两个函数的调用方式boolean isVip = false;//... 省略其他逻辑...if (isVip) {buyCourseForVip(userId, courseId);} else {buyCourse(userId, courseId);}// 保留标识参数的调用方式更加简洁boolean isVip = false;//... 省略其他逻辑...buyCourse(userId, courseId, isVip);

除了布尔类型作为标识参数来控制逻辑的情况外,还有一种 “根据参数是否为 null” 来控制逻辑的情况。针对这种情况,我们也应该将其拆分成多个函数。拆分之后的函数职责更明确,不容易用错。具体代码示例如下所示:

public List<Transaction> selectTransactions(Long userId, Date startDate, Date endDate) {if (startDate != null && endDate != null) {​    // 查询两个时间区间的 transactions}if (startDate != null && endDate == null) {​    // 查询 startDate 之后的所有 transactions}if (startDate == null && endDate != null) {​    // 查询 endDate 之前的所有 transactions}if (startDate == null && endDate == null) {​    // 查询所有的 transactions}}// 拆分成多个 public 函数,更加清晰、易用public List<Transaction> selectTransactionsBetween(Long userId, Date startDate, Date endDate) {return selectTransactions(userId, startDate, endDate);}public List<Transaction> selectTransactionsStartWith(Long userId, Date startDate) {return selectTransactions(userId, startDate, null);}public List<Transaction> selectTransactionsEndWith(Long userId, Date endDate) {return selectTransactions(userId, null, endDate);}public List<Transaction> selectAllTransactions(Long userId) {return selectTransactions(userId, null, null);}private List<Transaction> selectTransactions(Long userId, Date startDate, Date endDate) {// ...}

更多原创阅读:https://javawu.com

Java程序员必备奇淫巧技篇(上)相关推荐

  1. B站疯传|200个Java程序员必备词汇

    相信很多学生在学习英语的时候都有这样那样的问题,因此也困扰着太多想要学习编程的小伙伴. 其实学习编程,常用的单词就那么多,只要把必备的单词学会,你的代码也能写的很6,编程和英语的关系就是这么简单纯粹. ...

  2. Java 程序员必备的 15 个框架,前 3 个地位无可动摇!

    2019独角兽企业重金招聘Python工程师标准>>> Java 程序员方向太多,且不说移动开发.大数据.区块链.人工智能这些,大部分 Java 程序员都是 Java Web/后端开 ...

  3. Java程序员必备的10个大数据框架

    当今IT开发人员面对的最大挑战就是复杂性,硬件越来越复杂,OS越来越复杂,编程语言和API越来越复杂,我们构建的应用也越来越复杂.根据外媒的一项调查报告,小千列出了Java程序员在过去12个月内一直使 ...

  4. Java程序员必备的几款开发工具,高效才是硬道理!

    作为一名优秀的Java程序员,怎能没有几款得心应手的高效开发工具呢!市面上类库.工具千千万,下面我就给大家推荐几款高效的Java开发工具. 一.Eclipse Eclipse做为一款开发源代码的Jav ...

  5. Java程序员必备的几款开发工具

    工欲善其事,必先利其器.作为一名优秀的Java程序员,怎能没有几款得心应手的高效开发工具呢!市面上类库.工具千千万,下面就给大家推荐几款高效的Java开发工具. 1.UItraEdit UltraEd ...

  6. 程序流程图_干货收藏 | Java 程序员必备的一些流程图

    阅读本文大概需要 6 分钟. 转载自:https://juejin.im/post/5d214639e51d4550bf1ae8df 1.Spring 的生命周期 Spring 作为当前 Java 最 ...

  7. Java 程序员必备的一些流程图

    1.spring的生命周期 2.TCP三次握手,四次挥手 3.线程池执行流程图 4.JVM内存结构 5.Java内存模型 6.springMVC执行流程图 7.JDBC执行流程 8.spring cl ...

  8. 多图 | Java 程序员必备的一些流程图

    1.spring的生命周期 2.TCP三次握手,四次挥手 3.线程池执行流程图 4.JVM内存结构 5.Java内存模型 6.springMVC执行流程图 7.JDBC执行流程 8.spring cl ...

  9. 池流程图_干货收藏 | Java程序员必备的一些流程图

    前言: 整理了一些Java基础流程图/架构图,做一下笔记,大家一起学习. 1.spring的生命周期 Spring作为当前Java最流行.最强大的轻量级容器框架,了解熟悉spring的生命周期非常有必 ...

最新文章

  1. 简单介绍numpy实现RNN原理实现
  2. github 笔记
  3. 推荐9款优秀的 HTML5 音乐播放器
  4. matlab 涡轮流量计_秦皇岛卫生级流量计定制
  5. boost::gil::color_spaces_are_compatible用法的测试程序
  6. [css] 重置(初始化)css的作用是什么?
  7. JavaScript中的数组 1
  8. 21世纪经济网APP
  9. Akka 2 Actor 源码
  10. 黑客是什么,什么是黑客,它起源于什么,黑客是干什么的 ,真的,有所谓的“黑客帝国”吗?
  11. 4G知识总结(LTE网络架构、关键技术、物理层、移动性管理)
  12. socks5认证过程
  13. html学习——按钮与多选框
  14. HTML5物流大数据服务平台后台模板
  15. 24券创始人杜一楠的失败检讨书:我的“孩子”是如何死去的?
  16. 微信公众号支付(二)
  17. 京东一元抢宝系统的数据库架构优化
  18. opengl android 纹理贴图 代码,Android 使用opengl es的纹理贴图白屏问题请教。
  19. STEP标准执行方法-ISO-10303-21
  20. 互联网家装是伪命题?

热门文章

  1. 军职在线大学生计算机基础,军职在线演讲与口才答案第一章
  2. 虚拟视点图像的生成001
  3. b站营销成功因素浅分析
  4. [解题报告] CSDN竞赛第六期
  5. 索引超出矩阵维度(《无人驾驶车辆模型预测控制》第一版)
  6. 超分(Super-Resolution, SR )
  7. postgresql tuple介绍
  8. jQuery个人总结
  9. cocoscreator layabox 使用jszip.js
  10. 六天速通javaweb(后续深入学在这丰富)