目录
-
普通代码
- 首先声明:这篇文章是根据此文章《大数据技术与结构》,将现在的项目代码结构进行的二次调整的练习实战!
- 多层次if/else代码内容:
下面方法作用是:根据不同的类型进行对应的service处理!!!不是我写的,是同事写的。
/**
* 项目上报
* resultObj 中需要返回 上报时,还进行上报操作的数据对象 . 参考 TDCB_ZXZQFXJH 中的 oldTNewZxzq
* @param xmGuid 项目ID
* @param ywLx 业务类型
* @Return: com.gisquest.realestate.vo.ResponseBodyVo<java.lang.Object>
* @Author: xiongYiMing , 2019-05-22 07:46:26
* @Modify:
*/
@Override
@Transactional(rollbackFor = Exception.class)
public ResponseBodyVo<Object> shangbao(String xmGuid, String ywLx) {
ResponseBodyVo<Object> resultObj= new ResponseBodyVo<Object>();
// 参照 XmchServiceImpl 里书写自己的业务类型判断
if(YwlxCommon.TDCB_ZXZQFXJH.equals(ywLx)) {
TNewZxzq tNewZxzq = new TNewZxzq();
tNewZxzq.setZxzqguid(xmGuid);
resultObj = iZxzqFxjhService.shangBao(tNewZxzq,new Object());
} else if(YwlxCommon.TDCB_ZQSJFXJH.equals(ywLx)){
// 债券实际发行计划
TNewzxzqfxqk tNewzxzqfxqk = new TNewzxzqfxqk();
tNewzxzqfxqk.setFxqkGuid(xmGuid);
resultObj = iZqsjfxqkService.shangBao(tNewzxzqfxqk,new Object());
}else if(YwlxCommon.TDCB_ZQHKQK.equals(ywLx)){
TNewzqhkqk tNewzqhkqk = new TNewzqhkqk();
tNewzqhkqk.setZqhkqkGuid(xmGuid);
resultObj = iZqhkqkService.shangBao(tNewzqhkqk, new Object());
} else if(YwlxCommon.TDCB_CBXM.equals(ywLx)){//储备项目
Cbxm cbxm = new Cbxm();
cbxm.setCbxmGuid(xmGuid);
resultObj = cbxmService.shangBao(cbxm, new Object());
} else if(YwlxCommon.TDCB_ZJNDYS.equals(ywLx)){//资金年度预算
Cbxmbdys cbxmbdys = new Cbxmbdys();
cbxmbdys.setCbxmbdysGuid(xmGuid);
resultObj = zjndysService.shangBao(cbxmbdys, new Object());
} else if(YwlxCommon.TDCB_XMWCQK.equals(ywLx)){//项目完成情况
Cbxmwcqk cbxmwcqk = new Cbxmwcqk();
cbxmwcqk.setWcqkGuid(xmGuid);
resultObj = xmwcqkService.shangBao(cbxmwcqk, new Object());
} else if (YwlxCommon.TDCB_NDTDJH.equals(ywLx)){
resultObj = ndcbtdjhService.shangbao(xmGuid);
}
if( successStatus.equals(resultObj.getStatus().toString())){
// 1. 进行工作台操作
resultObj = procesShenhe(resultObj, xmGuid, ywLx);
}
return resultObj;
}
看了此文章《大数据技术与结构》,上述简单操作感觉switch语句更加适合一些。
将同事的代码改造成switch...case...,默认default存在,及时什么也不写。
public ResponseBodyVo<Object> shangbao(String xmGuid, String ywLx) {
ResponseBodyVo<Object> resultObj = new ResponseBodyVo<Object>();
switch (ywLx) {
case YwlxCommon.TDCB_ZXZQFXJH:
TNewZxzq tNewZxzq = new TNewZxzq();
tNewZxzq.setZxzqguid(xmGuid);
resultObj = iZxzqFxjhService.shangBao(tNewZxzq, new Object());
break;
case YwlxCommon.TDCB_ZQSJFXJH:
// 债券实际发行计划
TNewzxzqfxqk tNewzxzqfxqk = new TNewzxzqfxqk();
tNewzxzqfxqk.setFxqkGuid(xmGuid);
resultObj = iZqsjfxqkService.shangBao(tNewzxzqfxqk, new Object());
break;
case YwlxCommon.TDCB_ZQHKQK:
TNewzqhkqk tNewzqhkqk = new TNewzqhkqk();
tNewzqhkqk.setZqhkqkGuid(xmGuid);
resultObj = iZqhkqkService.shangBao(tNewzqhkqk, new Object());
break;
case YwlxCommon.TDCB_CBXM://储备项目
Cbxm cbxm = new Cbxm();
cbxm.setCbxmGuid(xmGuid);
resultObj = cbxmService.shangBao(cbxm, new Object());
break;
case YwlxCommon.TDCB_ZJNDYS://资金年度预算
Cbxmbdys cbxmbdys = new Cbxmbdys();
cbxmbdys.setCbxmbdysGuid(xmGuid);
resultObj = zjndysService.shangBao(cbxmbdys, new Object());
break;
case YwlxCommon.TDCB_XMWCQK://项目完成情况
Cbxmwcqk cbxmwcqk = new Cbxmwcqk();
cbxmwcqk.setWcqkGuid(xmGuid);
resultObj = xmwcqkService.shangBao(cbxmwcqk, new Object());
break;
case YwlxCommon.TDCB_NDTDJH:
resultObj = ndcbtdjhService.shangbao(xmGuid);
break;
default:
}
if (successStatus.equals(resultObj.getStatus().toString())) {
// 1. 进行工作台操作
resultObj = procesShenhe(resultObj, xmGuid, ywLx);
}
return resultObj;
}
-
思路--案例重构代码
思路讲解:1、可从上面案例得知是通过枚举比对,处理不同的业务逻辑,也就是说每个都有自己的interface定义,所以为了不影响自己的interface,我们需要抽象出一个公共的interface,并且让每一个去继承他。
1、将每个对应service的interface中的上报抽到Shangbao.class中
如:
public interface CbxmService {
ResponseBodyVo<Object> shangBao(Cbxm cbxm, Object object);
}
......
变成如下
/**
* @Description : common【service的公共接口】
* @Auth : Xuhy
* @Date : 2019-08-09
* @Time : 10:11
*/
public interface Shangbao {
ResponseBodyVo<Object> shangBao(String xmGuid);
/* // YwlxCommon.TDCB_ZXZQFXJH
ResponseBodyVo<Object> shangBao(TNewZxzq tNewZxzq, Object object);
// YwlxCommon.TDCB_ZQSJFXJH
ResponseBodyVo<Object> shangBao(TNewzxzqfxqk tNewzxzqfxqk, Object object);
// YwlxCommon.TDCB_ZQHKQK
ResponseBodyVo<Object> shangBao(TNewzqhkqk tNewzqhkqk, Object object);
// YwlxCommon.TDCB_CBXM
ResponseBodyVo<Object> shangBao(Cbxm cbxm, Object object);
// YwlxCommon.TDCB_ZJNDYS
ResponseBodyVo<Object> shangBao(Cbxmbdys cbxmbdys, Object object);
// YwlxCommon.TDCB_XMWCQK
ResponseBodyVo<Object> shangBao(Cbxmwcqk cbxmwcqk, Object object);
// YwlxCommon.TDCB_NDTDJH
ResponseBodyVo<Object> shangbao(String xmGuid);*/
}
问:为什么这么写呢?
答:每个service都有自己的interface,为了不影响自己的Impl,将其抽象成一个公共的接口,自己的interface extend即可。
public interface CbxmService extends Shangbao{
// 继承之后将原先的shangBao注释
// ResponseBodyVo<Object> shangBao(Cbxm cbxm, Object object);
}
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
/**
* @Description :
* @Auth : Xuhy
* @Date : 2019-08-08
* @Time : 15:42
*/
public class ShangbaoFactory {
static Map<String, Shangbao> shangbaoMap = new HashMap<>();
static {
shangbaoMap.put(YwlxCommon.TDCB_ZXZQFXJH, new ZxzqFxJhServiceImpl());
shangbaoMap.put(YwlxCommon.TDCB_ZQSJFXJH, new ZqsjfxqkServiceImpl());
shangbaoMap.put(YwlxCommon.TDCB_ZQHKQK, new ZqhkqkServiceImpl());
shangbaoMap.put(YwlxCommon.TDCB_CBXM, new CbxmServiceimpl());
shangbaoMap.put(YwlxCommon.TDCB_ZJNDYS, new ZjndysServiceImpl());
shangbaoMap.put(YwlxCommon.TDCB_XMWCQK, new XmwcqkServiceImpl());
// 更多shangbao操作
}
public static Optional<Shangbao> getShangbao(String operator) {
return Optional.ofNullable(shangbaoMap.get(operator));
}
}
-
详解--重构项目代码
上述的if/else或者switch,都是处理工作台的公共逻辑,以ywLx区分!当然也会在自己的业务界面处理服务。
-
重构自身Ctrl
@RestController
@RequestMapping(value = "/cbxm")
public class CbxmController {
@Autowired
private CbxmService cbxmService;
@RequestMapping(path = "/shangBao/{cbxmGuid}/{xmMc}", method = RequestMethod.GET)
@OperateLogAnnotate(operation = "上报", ywLx = YwlxCommon.TDCB_CBXM, ywGuidField = "cbxmGuid", xmMcField = "xmMc")
public ResponseBodyVo<Object> shangBao(@ApiParam("cbxmGuid")@PathVariable("cbxmGuid") String cbxmGuid, @ApiParam("xmMc")@PathVariable("xmMc") String xmMc) {
ResponseBodyVo<Object> responseBodyVo = cbxmService.shangBao(cbxmGuid);
return responseBodyVo;
}
}
//=========================================================================
// 将自己代码的shangBao注释
public interface CbxmService extends Shangbao{
// ResponseBodyVo<Object> shangBao(String xmGuid);
}
//=========================================================================
@Service
public class CbxmServiceimpl implements CbxmService {
@Override
@TxTransaction(isStart = true)
@Transactional(rollbackFor = Exception.class)
public ResponseBodyVo<Object> shangBao(String xmGuid) {
......
}
}
-
重构公共Ctrl
@RestController
@RequestMapping(value = "/xmsb")
public class XmsbController {
@Autowired
private IXmsbService iXmsbService;
@ApiOperation("上报的公共接口")
@RequestMapping(value = "/shangbao/{xmGuid}/{xmMc}/{ywLx}", method = RequestMethod.GET)
@OperateLogAnnotate(operation = "上报", ywLx = "ywLx", ywGuidField = "xmGuid", xmMcField = "xmMc")
public ResponseBodyVo<Object> shangbao(@PathVariable("xmGuid") String xmGuid,
@PathVariable("xmMc") String xmMc,
@PathVariable("ywLx") String ywLx){
System.out.println("shangbao");
return iXmsbService.shangbao(xmGuid, ywLx);
}
}
-
不重构公共interface
//public interface IXmsbService extends Shangbao{ --error
public interface IXmsbService {
ResponseBodyVo<Object> shangbao(String xmGuid, String ywLx);
}
-
重构公共实现类
/**
* @Created by xiongYiMing on 2019/5/22 0022 20:13
*/
@Service
@Transactional
public class XmsbServiceImpl implements IXmsbService {
/**
* 成功状态
*/
String successStatus = "200";
/*@Override
@Transactional(rollbackFor = Exception.class)
public ResponseBodyVo<Object> shangbao(String xmGuid, String ywLx) {
ResponseBodyVo<Object> resultObj = new ResponseBodyVo<Object>();
switch (ywLx) {
case YwlxCommon.TDCB_ZXZQFXJH:
TNewZxzq tNewZxzq = new TNewZxzq();
tNewZxzq.setZxzqguid(xmGuid);
resultObj = iZxzqFxjhService.shangBao(tNewZxzq, new Object());
break;
case YwlxCommon.TDCB_ZQSJFXJH:
// 债券实际发行计划
TNewzxzqfxqk tNewzxzqfxqk = new TNewzxzqfxqk();
tNewzxzqfxqk.setFxqkGuid(xmGuid);
resultObj = iZqsjfxqkService.shangBao(tNewzxzqfxqk, new Object());
break;
case YwlxCommon.TDCB_ZQHKQK:
TNewzqhkqk tNewzqhkqk = new TNewzqhkqk();
tNewzqhkqk.setZqhkqkGuid(xmGuid);
resultObj = iZqhkqkService.shangBao(tNewzqhkqk, new Object());
break;
case YwlxCommon.TDCB_CBXM://储备项目
Cbxm cbxm = new Cbxm();
cbxm.setCbxmGuid(xmGuid);
resultObj = cbxmService.shangBao(cbxm, new Object());
break;
case YwlxCommon.TDCB_ZJNDYS://资金年度预算
Cbxmbdys cbxmbdys = new Cbxmbdys();
cbxmbdys.setCbxmbdysGuid(xmGuid);
resultObj = zjndysService.shangBao(cbxmbdys, new Object());
break;
case YwlxCommon.TDCB_XMWCQK://项目完成情况
Cbxmwcqk cbxmwcqk = new Cbxmwcqk();
cbxmwcqk.setWcqkGuid(xmGuid);
resultObj = xmwcqkService.shangBao(cbxmwcqk, new Object());
break;
*//*case YwlxCommon.TDCB_NDTDJH:
resultObj = ndcbtdjhService.shangbao(xmGuid);
break;*//*
default:
}
if (successStatus.equals(resultObj.getStatus().toString())) {
// 1. 进行工作台操作
resultObj = procesShenhe(resultObj, xmGuid, ywLx);
}
return resultObj;
}*/
@Override
@Transactional(rollbackFor = Exception.class)
public ResponseBodyVo<Object> shangbao(String xmGuid, String ywLx) {
Shangbao targetShangbao = ShangbaoFactory
.getShangbao(ywLx)
.orElseThrow(() -> new IllegalArgumentException("Invalid Operator"));
return targetShangbao.shangBao(xmGuid);
}
}
其他博客主的理解用法