技巧|结合业务一些常用开发技巧记录手札

前言

业务开发目前对于绝大多数的程序员接触最基本的就是简单,复杂的业务开发,绝大部分的公司都是业务驱动型公司,因此业务开发的过程中会存在很多很奇怪的需求,本篇博文会长期记录在业务开发过程中自己总结的一些常用开发技巧或者心得体会.

  • IDEA
  • MacOs/Windows
  • Git

优化

场景1

当调用第三方接口,同步合同状态的时候,但我们对外输入的时候需要按照其他状态进行转化几个其他的外部状态,由于很多时候需要两个状态枚举值之间可以互相转换,其实就是两个不同的枚举值进行转化建立一个mapping关系;

public class CaseStatusConverter {
    private static final Map<OutCaseStatusEnum, CaseStatusEnum> statusMap = Maps.newEnumMap(OutCaseStatusEnum.class);
    static {
        statusMap.put(OutCaseStatusEnum.UNCOMMITTED, CaseStatusEnum.UNCOMMITTED);
        statusMap.put(OutCaseStatusEnum.COMMITTING, CaseStatusEnum.PROCESSING);
        statusMap.put(OutCaseStatusEnum.COMMITTED, CaseStatusEnum.PROCESSING);
        statusMap.put(OutCaseStatusEnum.PRE_QUALIFIED, CaseStatusEnum.PROCESSING);
        statusMap.put(OutCaseStatusEnum.NOT_PAID, CaseStatusEnum.PROCESSING);
        statusMap.put(OutCaseStatusEnum.ALREADY_PAID, CaseStatusEnum.PROCESSING);
        statusMap.put(OutCaseStatusEnum.ALREADY_INITIATED, CaseStatusEnum.PROCESSING);
        statusMap.put(OutCaseStatusEnum.IN_PROCESS, CaseStatusEnum.PROCESSING);
        statusMap.put(OutCaseStatusEnum.FINISHED, CaseStatusEnum.FINISHED);
        statusMap.put(OutCaseStatusEnum.ALREADY_ARCHIVED, CaseStatusEnum.FINISHED);
        statusMap.put(OutCaseStatusEnum.COMMIT_ERROR, CaseStatusEnum.WITHDRAWN_REJECTED);
        statusMap.put(OutCaseStatusEnum.WITHDRAWN, CaseStatusEnum.WITHDRAWN_REJECTED);
        statusMap.put(OutCaseStatusEnum.REJECTED, CaseStatusEnum.WITHDRAWN_REJECTED);
    }
    public static CaseStatusEnum convertCaseStatus(OutCaseStatusEnum outCaseStatus) {
        return statusMap.get(outCaseStatus);
    }
}

OutCaseStatusEnum对应的状态值为从三方获取的状态值,而CaseStatusEnum对应对外使用的案件状态,在需要转化的地方可以直接使用类中静态方法进行转换;类比当需要此类转换的时候都可以采用这种方式进行转换;

场景2

在业务开发的过程进行需要的各个实体类之间转换,Entity转换成Bo,或者Bo转换成VO对象,此类博文比较多,关于这里就给出平时使用比较简单的转换方式,主要依赖org.springframework.beans.BeanUtils进行属性复制,这里使用主要依赖两者对象属性名称存在差异较小;

public class EntityUtils {
  public static <T> T convert(Object source, Class<T> targetClass) {
    if (source == null) {
      return null;
    }
    T target = null;
    try {
      target = targetClass.newInstance();
    } catch (InstantiationException | IllegalAccessException e) {
      e.printStackTrace();
      throw new RuntimeException(e.getMessage());
    }
    BeanUtils.copyProperties(source, target);
    return target;
  }
  public static <T> List<T> convertList(List<? extends Object> sources,
      Class<T> targetClass) {
    if (CollectionUtils.isEmpty(sources)) {
      return null;
    }
    List<T> targets = new ArrayList<T>();
    for (Object source : sources) {
      T target = null;
      try {
        target = targetClass.newInstance();
      } catch (InstantiationException | IllegalAccessException e) {
        e.printStackTrace();
      }
      BeanUtils.copyProperties(source, target);
      targets.add(target);
    }
    return targets;
  }
  public static <T> List<T> convertListEmpty(List<? extends Object> sources,
      Class<T> targetClass) {
    if (CollectionUtils.isEmpty(sources)) {
      return new ArrayList<T>();
    } else {
      return convertList(sources, targetClass);
    }
  }
}

具体使用的过程中使用直接使用该类中静态方法,但是这里提别提醒:source必须不能为空,业务操作需要进行非空判断;

public CaseBo basicInfo(String uid, Long caseId) {
  log.info("获取案件基础信息,uid:{},caseId:{}", uid, caseId);
  CaseEntity caseEntity = caseEntityMapper.selectByIdAndUid(caseId, uid);
  if (caseEntity == null) {
    return null;
  } else {
    return EntityUtils.convert(caseEntity, CaseBo.class);
  }
}

场景三

在业务开发的过程中需要针对各种状态来判断用户是否有业务权限操作,例如删除合同,撤销案件等业务场景,这样在的每个业务场景需要校验权限的地方需要写很多重复代码,这样不如依靠在按照状态进行区分,分割成不同List使用List中方法contains进行业务权限判断:

public static boolean isCanWithdrawn(String outCaseStatusEnum) {
  List<String> canWithdrawnList = new ArrayList<>();
  canWithdrawnList.add(OutCaseStatusEnum.UNCOMMITTED.name());
  canWithdrawnList.add(OutCaseStatusEnum.COMMITTING.name());
  canWithdrawnList.add(OutCaseStatusEnum.COMMITTED.name());
  canWithdrawnList.add(OutCaseStatusEnum.PRE_QUALIFIED.name());
  canWithdrawnList.add(OutCaseStatusEnum.NOT_PAID.name());
  return canWithdrawnList.contains(outCaseStatusEnum);
}

public static boolean isCanFinished(String outCaseStatusEnum) {
  List<String> canFinishedList = new ArrayList<>();
  canFinishedList.add(OutCaseStatusEnum.FINISHED.name());
  canFinishedList.add(OutCaseStatusEnum.ALREADY_ARCHIVED.name());
  canFinishedList.add(OutCaseStatusEnum.WITHDRAWN.name());
  canFinishedList.add(OutCaseStatusEnum.REJECTED.name());
  return canFinishedList.contains(outCaseStatusEnum);
}

public static boolean isArbitrationAccepted(String outCaseStatusEnum) {
  List<String> arbitrationAcceptedList = new ArrayList<>();
  arbitrationAcceptedList.add(OutCaseStatusEnum.PRE_QUALIFIED.name());
  arbitrationAcceptedList.add(OutCaseStatusEnum.NOT_PAID.name());
  return arbitrationAcceptedList.contains(outCaseStatusEnum);
}

public static boolean isArbitrationRegistration(String outCaseStatusEnum) {
  List<String> arbitrationRegistrationList = new ArrayList<>();
  arbitrationRegistrationList.add(OutCaseStatusEnum.ALREADY_PAID.name());
  arbitrationRegistrationList.add(OutCaseStatusEnum.ALREADY_INITIATED.name());
  return arbitrationRegistrationList.contains(outCaseStatusEnum);
}

public static boolean isArbitrationFinished(String outCaseStatusEnum) {
  List<String> arbitrationFinishedList = new ArrayList<>();
  arbitrationFinishedList.add(OutCaseStatusEnum.ALREADY_PAID.name());
  arbitrationFinishedList.add(OutCaseStatusEnum.ALREADY_INITIATED.name());
  return arbitrationFinishedList.contains(outCaseStatusEnum);
}

这里主要是使用List中方法contains进行代码小小的优化,消除冗余重复的代码;

结语

以上只是在工作过程发现比较好代码结构,好的优化方法,在这里记录一下,可能代码结构很简单,有的时候只是一个很好的优化就会改变一个复杂的代码结构,代码看起来比较干净,好的代码写的会像诗一样的完美,这里只是简单总结还有很多待总结,持久更新…

关于我

Hello,我是球小爷,热爱生活,求学七年,工作三载,而今已快入而立之年,如果您觉得对您有帮助那就一切都有价值,赠人玫瑰,手有余香❤️. 最后把我最真挚的祝福送给您及其家人,愿众生一生喜悦,一世安康!

附录

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值