1. 概述

门户代码部分,前端部分代码所有的代码都杂糅在一起,不符合单一职责原则和开闭原则,后端代码命名和公共的代码没有抽像出来。

下面分别介绍下前后端代码如何重构

2. 后端代码重构

2.1 接口命名

InsColumnDefData 这个是之前的命名,这个命名一看不知道是做什么用的。

改成 IColumnDataService ,从接口名上可以看出这个是栏目的数据服务接口

2.2 增加基础类实现

之前在接口实现中,每一个类 都有 这样的代码。

private  String setting;

private  String colId;

public void setSettingValue(String setting,String colId){
        setSetting(setting);
        setColId(colId);
    }

及GETTER,SETTER这样的方法。

我将这些都做成了一个基类。

public abstract class BaseColumnDataServiceImpl implements IColumnDataService {

    private  String setting;

    private  String colId;

    /**
     * 设置查询对象
     * @return
     */
    @Override
    public void setSettingValue(String setting,String colId){
        setSetting(setting);
        setColId(colId);
    };
}

其他的栏目类型实现都继承这个类,这样代码就简化了很多。

3.前端代码简化

这里的问题

不符合单一职责原则

这个代码的功能太复杂,每增加一个类型的栏目。

不符合开闭原则

每增加一个类型,都需要修改这个文件,会导致代码维护起来困难。

3.1 将代码职责分离

将代码的职责分散,不同栏目的类型代码,分别进行抽离,当增加一种新的栏目类型,不影响到这个栏目主代码。

修改后的代码:

import extendPortal from "@/api/portal/core/extendPortal";
//这里增加模块,我们只需要修改 extendPortal
mixins:[extendPortal],
import bpmPortal from "@/api/portal/core/bpmPortal";
import messageBoxPortal from "@/api/portal/core/messageBoxPortal";
import schedulePortal from "@/api/portal/core/schedulePortal";
import newsPortal from "@/api/portal/core/newsPortal";

/**
 * 栏目类型扩展。
 */
export default {
    mixins:[bpmPortal,messageBoxPortal,schedulePortal,newsPortal]
}

栏目类型扩展

/**
 * 新闻扩展。
 */
export default {
    data(){
        return {
            newType: '',
        }
    },
    methods:{
        init_NewsBel(){
            this.getNewType();
            //调用父类的加载数据的方法。
            this.loadData();
        },
        //阅读新闻公告
        getInsNews(pkId) {
            var self_ = this;
            InsNewsApi.getInsNews({
                curVm: this, data: { pkId: pkId, single: true }, widthHeight: ['1000px', '700px']
            }, function (self_, data) {
            });
        },
        //获取新闻类型
        getNewType() {
            var setting = JSON.parse(this.insColumnDef.setTing);
            if (setting && setting.newType) {
                this.newType = setting.newType;
            }
        }
    }
}

我们如果需要增加一种栏目类型,那么就增加一个文件即可,符合开闭原则。

3.2 加载数据的方法修改

loadData(){
        InsPortalDefApi.getDataByColId(this.colId).then(res => {
            this.data = res;
        });
    },
    loadColumn() {
      var type=this.insColumnDef.typeName;
      var typeName="init_" + type;
      //在特定的扩展中如果有 init_类型的方法,那么就调用该方法。
      if( this[typeName]){
          this[typeName]();
      }
      //否则根据栏目ID获取数据。
      else{
          this.loadData();
      }
    }

栏目通过 loadColumn 方法进行加载数据。有些情况下栏目需要根据栏目的类型去加载特定的数据。

我们规定在 栏目的 扩展实现中 增加 如下的方法

init_ +栏目类型。

3.3 统一TAB组件

之前的TAB组件是单独一个组件进行处理的,现在将这个代码删除了。

这里tab的模板实现需要遵循以下的代码规范。

<a-tab-pane v-for="(obj,index) of data"  :tab="obj.name" :key="index">
            <portal-layoutview ref="innerLayout"  :insColumnDef="obj.insColumnDef"></portal-layoutview>
          </a-tab-pane>

这里 必须使用 ref="innerLayout"

文档更新时间: 2021-05-13 10:57   作者:zyg