一、项目背景
随着活动业务越来越多,如何保证在未知的业务需求下,尽可能的去减少开发人员的工作,实现软件的快速迭代,可以从以下两点解决上述问题:
1.对于具有相似整体流程的多份代码,从流程上找出共同点,对其进行抽象。
2.将整个流程拆分成可复用的组件单元,通过对这些单元的聚合,组装起整个流程。从而也实现了代码最大复用性。
二、方案设计
模块化编程包含执行单元和组件单元,对于执行单元,预先定义好一类业务公共使用的组件单元(如需要校验最大限制次数的活动类),这些单元组件可组装可拆卸。各个业务线上,具有明确业务含义的操作移到业务自己的独立单元里面去。
执行单元:初始化操作,业务验证、业务执行、事后处理。
组件单元(细粒度划分);用户信息,排期信息,优惠券信息,红包信息,商品信息。
其具有三层逻辑:
第一层:将所有操作抽象成初始化操作,业务验证、业务执行、事后处理四步的顶层抽象;
第二层:对顶层抽象按照操作类型或业务类型进行分类,组装公共的单元组件。
第三层:不同业务通过定制化或者重写已有扩展点,来实现具有业务特性的功能。
最终整体如下图所述:
三、方案实现
模块化编程流程.png四、方案实现
##顶级抽象:服务流程
public interface ActivityService {
default <T,S extends ActivityBaseParam> ResponseDTO<T> process(S context) {
try {
// 数据验证
ResponseDTO<T> result = check(context);
if (!result.successed()) {
return result;
}
// 数据执行
return execute(context);
} finally {
// 事后处理
return after(context);
}
}
// 初始化操作
<S extends ActivityBaseParam> void init(S context);
// 校验处理
<T,S extends ActivityBaseParam> ResponseDTO<T> check(S context);
//执行业务操作
<T,S extends ActivityBaseParam> ResponseDTO<T> execute(S context);
//执行后操作
<T,S extends ActivityBaseParam> ResponseDTO<T> after(S context);
}
##二级抽象
public abstract class AbstractActivityService implements ActivityService {
@Resource(name = "userCheckService")
private UserCheckService userCheckService;
@Resource(name = "scheduleCheckService")
private ScheduleCheckService scheduleCheckService;
/**
* 初始化操作
*/
@Override
public <S extends ActivityBaseParam> void init(S context) {
// 预留给业务实现层的扩展点
if (!isNfcInitInfo()){
return;
}
//限流操作
initNfcOperation(context);
}
/**
* 限流操作
* @param context
* @param <S>
*/
public <S extends ActivityBaseParam> void initNfcOperation(S context){
process(context);
return;
}
protected abstract Boolean isNfcInitInfo();
/**
* 基础数据校验
* @param context
* @param <T>
* @param <S>
* @return
*/
@Override
public <T,S extends ActivityBaseParam> ResponseDTO<T> check(S context) {
ResponseDTO responseDTO = userCheckService.isLogin(context.getUserId());
if (!responseDTO.successed()){
return responseDTO;
}
responseDTO = scheduleCheckService.checkActivityTime(context.getScheduleId());
if (!responseDTO.successed()){
return responseDTO;
}
// 预留给业务实现层的扩展点
return businessBaseInfoCheck(context);
}
/**
* 预留给业务实现层的扩展点
*/
public abstract <T,S extends ActivityBaseParam> ResponseDTO<T> businessBaseInfoCheck(S context);
/**
* 数据处理
*/
@Override
public <T,S extends ActivityBaseParam> ResponseDTO<T> execute(S context) {
return null;
}
/**
* 事后处理
*/
@Override
public <T,S extends ActivityBaseParam> ResponseDTO<T> after(S context) {
return null;
}
}
##业务自定义服务
@Service("CpaActivitySignUpService")
public class CpaActivityServiceImpl extends AbstractActivityService implements CpaActivityService {
@Override
protected Boolean isNfcInitInfo() {
return false;
}
@Override
public <T, S extends ActivityBaseParam> ResponseDTO<T> businessBaseInfoCheck(S context) {
return null;
}
@Override
public void index() {
// Long userId;
// Long schedule =
}
}
五、后续扩展
1.后续考虑做成配置化的方式形成业务规则,通过插拔某些组件形成新的规则。
网友评论