美文网首页
活动模块化编程方案

活动模块化编程方案

作者: 向梦而来 | 来源:发表于2020-11-26 11:45 被阅读0次

    一、项目背景

    随着活动业务越来越多,如何保证在未知的业务需求下,尽可能的去减少开发人员的工作,实现软件的快速迭代,可以从以下两点解决上述问题:
    1.对于具有相似整体流程的多份代码,从流程上找出共同点,对其进行抽象。
    2.将整个流程拆分成可复用的组件单元,通过对这些单元的聚合,组装起整个流程。从而也实现了代码最大复用性。

    二、方案设计

    模块化编程包含执行单元和组件单元,对于执行单元,预先定义好一类业务公共使用的组件单元(如需要校验最大限制次数的活动类),这些单元组件可组装可拆卸。各个业务线上,具有明确业务含义的操作移到业务自己的独立单元里面去。
    执行单元:初始化操作,业务验证、业务执行、事后处理。
    组件单元(细粒度划分);用户信息,排期信息,优惠券信息,红包信息,商品信息。
    其具有三层逻辑:
    第一层:将所有操作抽象成初始化操作,业务验证、业务执行、事后处理四步的顶层抽象;
    第二层:对顶层抽象按照操作类型或业务类型进行分类,组装公共的单元组件。
    第三层:不同业务通过定制化或者重写已有扩展点,来实现具有业务特性的功能。
    最终整体如下图所述:

    模块化编程.png

    三、方案实现

    模块化编程流程.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.后续考虑做成配置化的方式形成业务规则,通过插拔某些组件形成新的规则。

    相关文章

      网友评论

          本文标题:活动模块化编程方案

          本文链接:https://www.haomeiwen.com/subject/zsyaiktx.html