// 调用代码double price = 5.1D;int number = 9;double total = calculate(price, number);// 计算金额函数private double calculate(Double price, Integer number) {return price * number;}
// 调用代码double price = 5.1D;int number = 9;double total = calculate(price, number);// 计算金额函数private double calculate(double price, int number) {return price * number;}
// 获取订单总额函数public double getOrderAmount(List<Product> productList) {double amount = 0.0D;for (Product product : productList) {if (Objects.isNull(product) || Objects.isNull(product.getPrice())|| Objects.isNull(product.getNumber())) {continue;}amount += calculate(product.getPrice(), product.getNumber());}return amount;}// 计算金额函数private Double calculate(double price, double number) {return price * number;}
// 获取订单总额函数public double getOrderAmount(List<Product> productList) {double amount = 0.0D;for (Product product : productList) {if (Objects.isNull(product) || Objects.isNull(product.getPrice())|| Objects.isNull(product.getNumber())) {continue;}amount += calculate(product.getPrice(), product.getNumber());}return amount;}// 计算金额函数private double calculate(double price, double number) {return price * number;}
-
内部函数尽量使用基础类型,避免了隐式封装类型的打包和拆包;
-
内部函数参数使用基础类型,用语法上避免了内部函数的参数空指针判断;
-
内部函数返回值使用基础类型,用语法上避免了调用函数的返回值空指针判断。
// 调用代码UserVO[] users = queryUser();if (Objects.nonNull(users)) {for (UserVO user : users) {// 处理用户信息}}// 查询用户函数private UserVO[] queryUser() {// 查询用户列表List<UserDO> userList = userDAO.queryAll();if (CollectionUtils.isEmpty(userList)) {return null;}// 转化用户数组UserVO[] users = new UserVO[userList.size()];for (int i = 0; i < userList.size(); i++) {UserDO user = userList.get(i);users[i] = new UserVO();users[i].setId(user.getId());users[i].setName(user.getName());}// 返回用户数组return users;}
// 调用代码UserVO[] users = queryUser();for (UserVO user : users) {// 处理用户信息}// 查询用户函数private UserVO[] queryUser() {// 查询用户列表List<UserDO> userList = userDAO.queryAll();if (CollectionUtils.isEmpty(userList)) {return new UserVO[0];}// 转化用户数组UserVO[] users = new UserVO[userList.size()];for (int i = 0; i < userList.size(); i++) {UserDO user = userList.get(i);users[i] = new UserVO();users[i].setId(user.getId());users[i].setName(user.getName());}// 返回用户数组return users;}
// 调用代码List<UserVO> userList = queryUser();if (Objects.nonNull(userList)) {for (UserVO user : userList) {// 处理用户信息}}// 查询用户函数private List<UserVO> queryUser(){// 查询用户列表List<UserDO> userList = userDAO.queryAll();if(CollectionUtils.isEmpty(userList)) {return null;}// 转化用户列表List<UserVO> userVoList = new ArrayList<>(userList.size());for(UserDO user : userList) {UserVO userVo = new UserVO();userVo.setId(user.getId());userVo.setName(user.getName());userVoList.add(userVo);}// 返回用户列表return userVoList;}
// 调用代码List<UserVO> userList = queryUser();for (UserVO user : userList) {// 处理用户信息}// 查询用户函数private List<UserVO> queryUser(){// 查询用户列表List<UserDO> userList = userDAO.queryAll();if(CollectionUtils.isEmpty(userList)) {return Collections.emptyList();}// 转化用户列表List<UserVO> userVoList = new ArrayList<>(userList.size());for(UserDO user : userList) {UserVO userVo = new UserVO();userVo.setId(user.getId());userVo.setName(user.getName());userVoList.add(userVo);}// 返回用户列表return userVoList;}
-
保证返回的数组和列表不为null, 避免调用函数的空指针判断。
// 修改用户函数public void modifyUser(Long id, String name, String phone, Integer age,Integer sex, String address, String description) {// 具体实现逻辑}
// 修改用户函数public void modifyUser(User user) {// 具体实现内容}// 用户类private class User{private Long id;private String name;private String phone;private Integer age;private Integer sex;private String address;private String description;}
// 获取距离函数public double getDistance(double x1, double y1, double x2, double y2) {// 具体实现逻辑}
// 获取距离函数public double getDistance(Point point1, Point point2) {// 具体实现逻辑}// 点类private class Point{private double x;private double y;}
-
封装过多函数参数为类,使函数更便于扩展和维护;
-
封装成组函数参数为类,使业务概念更明确更清晰。
在匿名内部类(包括Lambda表达式)中可以直接访问外部类的成员,包括类的成员变量、函数的内部变量。正因为可以随意访问外部变量,所以会导致代码边界不清晰。
// 发送结算数据sendWorkerSettleData(WorkerPushDataType.CHECKER, () -> {Date beginDate = DateUtils.addDays(currDate, -aheadDays);Date endDate = DateUtils.addDays(currDate, 1);return auditTaskDAO.statCheckerSettleData(beginDate, endDate);});
// 发送结算数据sendWorkerSettleData(WorkerPushDataType.CHECKER, () -> statCheckerSettleData(currDate, aheadDays));// 统计验收员结算数据函数private List<WorkerSettleData> statCheckerSettleData(Date currDate, int aheadDays) {Date beginDate = DateUtils.addDays(currDate, -aheadDays);Date endDate = DateUtils.addDays(currDate, 1);return auditTaskDAO.statCheckerSettleData(beginDate, endDate);}
// 清除过期数据cleanExpiredData("用户日志表", new CleanExpiredDataOperator() {public List<Date> queryExpiredDate(Integer remainDays) {return userDAO.queryExpiredDate(remainDays);}public void cleanExpiredData(Date expiredDate) {userDAO.cleanExpiredData(expiredDate);}});// 清除过期数据函数private void cleanExpiredData(String tableName, CleanExpiredDataOperator ,cleanExpiredDataOperator) {// 功能实现代码}// 清除过期操作接口interface CleanExpiredDataOperator {// 查询过期日期public List<Date> queryExpiredDate(Integer remainDays);// 清除过期数据public void cleanExpiredData(Date expiredDate);}
// 清除过期数据cleanExpiredData("用户日志表", userDAO::queryExpiredDate,userDAO::cleanExpiredData);// 清除过期数据函数private void cleanExpiredData(String tableName, QueryExpiredDateOperator queryExpiredDateOperator, CleanExpiredDataOperator cleanExpiredDataOperator) {// 功能实现代码}// 查询过期日期接口interface QueryExpiredDateOperator {// 查询过期日期public List<Date> queryExpiredDate(Integer remainDays);}// 清除过期操作接口interface CleanExpiredDataOperator {// 清除过期数据public void cleanExpiredData(Date expiredDate);}
-
定义函数并指定参数,明确规定了匿名内部类的代码边界;
-
利用Lambda表达式简化匿名内部类实现,使代码更简洁。
// 是否通过函数public boolean isPassed(Double passRate) {if (Objects.nonNull(passRate) && passRate.compareTo(PASS_THRESHOLD) >= 0) {return true;}return false;}
// 是否通过函数public boolean isPassed(Double passRate) {return Objects.nonNull(passRate) && passRate.compareTo(PASS_THRESHOLD) >= 0;}
// 结算工资函数public double settleSalary(Long workId, int workDays) {// 根据是否合格处理if (isQualified(workId)) {return settleQualifiedSalary(workDays);} else {return settleUnqualifiedSalary(workDays);}}
// 结算工资函数public double settleSalary(Long workId, int workDays) {// 根据是否合格处理if (isQualified(workId)) {return settleQualifiedSalary(workDays);}return settleUnqualifiedSalary(workDays);}
// 查询用户函数public List<UserDO> queryUser(Long id, String name) {UserQuery userQuery = new UserQuery();userQuery.setId(id);userQuery.setName(name);List<UserDO> userList = userDAO.query(userQuery);return userList;}
// 查询用户函数public List<UserDO> queryUser(Long id, String name) {UserQuery userQuery = new UserQuery();userQuery.setId(id);userQuery.setName(name);return userDAO.query(userQuery);}
-
精简不必要的代码,让代码看起来更清爽
// 是否土豪用户函数private boolean isRichUser(User user) {return Objects.nonNull(user.getAccount())&& Objects.nonNull(user.getAccount().getBalance())&& user.getAccount().getBalance().compareTo(RICH_THRESHOLD) >= 0;}
// 是否土豪用户函数private boolean isRichUser(User user) {// 获取用户账户UserAccount account = user.getAccount();if (Objects.isNull(account)) {return false;}// 获取用户余额Double balance = account.getBalance();if (Objects.isNull(balance)) {return false;}// 比较用户余额return balance.compareTo(RICH_THRESHOLD) >= 0;}
有时候,当代码的精简性和可读性发生冲突时,个人更偏向于保留代码的可读性。
// 构建用户函数public UserVO buildUser(UserDO user) {UserVO vo = new UserVO();vo.setId(user.getId());vo.setName(user.getName());if (Objects.nonNull(user.getAccount())) {vo.setBalance(user.getAccount().getBalance());vo.setDebt(user.getAccount().getDebt());}return vo;}
// 构建用户函数public UserVO buildUser1(UserDO user) {UserVO vo = new UserVO();vo.setId(user.getId());vo.setName(user.getName());UserAccount account = user.getAccount();if (Objects.nonNull(account)) {vo.setBalance(account.getBalance());vo.setDebt(account.getDebt());}return vo;}
-
利用临时变量厘清逻辑,显得业务逻辑更清晰;
-
利用临时变量精简代码,看变量名称即知其义,减少了大量无用代码;
-
如果获取函数比较复杂耗时,利用临时变量可以提高运行效率;
-
利用临时变量避免函数的级联调用,可有效预防空指针异常。
// 修改用户状态函数private void modifyUserStatus(Long userId, Integer status, String unused) {userCache.modifyStatus(userId, status);userDAO.modifyStatus(userId, status);}
// 修改用户状态函数private void modifyUserStatus(Long userId, Integer status) {userCache.modifyStatus(userId, status);userDAO.modifyStatus(userId, status);}
// 删除用户函数private void deleteUser(User user) {userCache.delete(user.getId());userDAO.delete(user.getId());}
// 删除用户函数private void deleteUser(Long userId) {userCache.delete(userId);userDAO.delete(userId);}
-
仅保留函数需要的参数,明确了调用时需要赋值的参数,避免了调用时还要去构造些无用参数。
转发、点赞
。关注订阅号「Web项目聚集地」,回复「全栈」即可获取 2019 年最新 Java、Python、前端学习视频资源。
快来薅当当的羊毛 !
聊一聊 Java 泛型中的通配符
数据库不使用外键的 9 个理由

在看

本文分享自微信公众号 - Java后端(web_resource)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
相关文章
暂无评论...
