美文网首页vue
2020年5月,vue项目代码重构中关于代码设计的思考

2020年5月,vue项目代码重构中关于代码设计的思考

作者: 瓢鳍小虾虎 | 来源:发表于2020-05-31 10:46 被阅读0次

代码过程中出现的种种问题

例如:

重复定义接口,组件;

废弃的组件没人敢删;

store数据重复定义;

业务表单字段控权逻辑复杂,越维护越多之前的没人敢动;

一套代码兼容多地区业务中,没有对多地区业务做隔离导致的“改了东坏了西”。

大多人员没有写注释的习惯。

这些种种的问题暴露出一个很大的问题,就是代码缺乏管理,团队临时拼凑组建,权责不明确,该做好管理工作的人没有把好关,在代码设计思路上没有与其他人达成统一,最终形成统一的开发指导规范。

代码设计上的理解

代码设计原则

单一职责原则SRP:一个对象/方法只做一件事。例如:单例模式,代理模式,装饰模式,迭代器模式等

最少知识原则LKP:减少对象之间的联系,避免改一处,相关的多个对象受到影响。例如:中介者模式

开放-封闭原则:好的设计应该在遇到新需求的时候去增加代码,而不是修改旧代码。例如:发布-订阅模式,模板方法模式,策略模式,代理模式,职责链模式

业务组件重构思路

1. store

公共信息只在store维护一份。

从分层角度:store分为全局级别,子系统级别;

从维护角度:为了避免多人协作开发中store信息重复声明,action重复编写。store在全局以modules方式分类维护保持一份。

最终策略:系统全局系信息在store维护以modules方式维护,各个子系统需要哪个就在系统自己的store中注册进去。

store的拆分尽量以业务原子功能为单位,比如:登陆注册,账户,项目,统计,审查,抽查,上传下载,人员管理,权限管理等。

一些系统级别的store数据(state)初始化逻辑,可以在aop层面去考虑着做(比如路由钩子中),在具体业务模块,只需要从getter中拿来直接做业务逻辑。

数据引入方式:

// 直接引用方式

getProject () {

  return this.$store.getters['projectModule/getProjectInfo']

}

// 辅助函数方式:直接引用accountModule模块中的getters

...mapGetters(

  'accountModule',

  ['getAccount']

)

// 辅助函数方式:引用accountModule模块中的getters,可以起别名

...mapGetters(

  'accountModule',

  { getPermissions: 'getPermissions' }

)

2. 业务组件结构

从分层角度:

组件内部是view层,纯展示,包含自有的跟业务无关的交互功能;

外部是业务container层,负责接收业务数据,整理成组件能识别的数据结构,同时负责接收view组件的反馈,以便向外层传递数据。

从分类角度:

尽管功能类似,但是使用场景和展现样子完全不同的组件分割成2个,不要揉到一起,避免不必要的耦合。

container层如果包含了无交叉的业务线,使用设计模式给分隔开来,避免不同业务逻辑互相影响。

3. 代码拆分组合实现细节

目前比较倾向于mixin,在vue组件中,使用mixin可以很自然的把抽离出来的规则或者配置再融入到业务组件中,可以方便的使用上下文。

mixin文件内部:

抽离工具方法

引入配置

组装mixin对象

这里有个细节问题就是,vue框架内部用的是严格模式,在confC里面不允许直接使用arguments,所以声明了参数

个别业务配置内部:

业务组件中使用:

4. 关于组件的交互控权

这个相对复杂,一个组件整体,或者一个组件内部的输入项,都可能需要单独控权。

最终控制的效果有2种:display和disabled,最终使用哪种跟业务需求有关。

影响的因素有很多:

1)组件自带交互操作或者联动效果。

2)权限控制(模块级权限?更细的操作级权限?跟系统的权限设计有关,有些特殊的场景游客权限就能操作,可以前端把权限整合到store统一处理)

3)角色控制(角色本质上还是权限,可以看作一个权限包,这个跟系统设计有关,很多时候后端权限控制没有那么精细)

4)流程控制(包括新建,保存,提交,回退,完结等)

5)系统配置(类似于实施过程中配置的业务参数)

以上的因素在不同业务系统中可能不一样,但是有一点肯定的是,随着业务的迭代,影响因素会越来越多,代码如果不把控好,就会变得越来越难以维护。

组件或者组件的输入项,影响它的交互(display和disabled分开处理)的因素(以上的5种)不能重复声明,否则会开启挖坑模式,越来越难维护。

打个比方:v-if=“规则1 || 规则2 || 规则3”,这个规则1规则2规则3都是迭代过程中追加的控权逻辑,如果有2个都包含权限的引入判断,就是不允许的。

下图是某版本的代码,重在描述意图:

computed中:

表单模板中:

5. 关于组件传参

1)有些页面需要用的业务参数繁多,是因为后端接口设计不够优雅,对前端暴露了太多细节,让前端处理。例如一个业务行为要调多个接口,或者一个数据请求要传很多辅助参数。这些情况需要后端的接口优化,前端配合调整,才能做好。

2)还有些业务参数的传递,是从父组件到子组件链式传递的,尽量不要这么做,如果需要,可以考虑把业务参数声明在store中,注册进当前子系统,在更高的层面统一管理,这也是一种发布-订阅模式,满足了最小知识原则。

相关文章

  • 2020年5月,vue项目代码重构中关于代码设计的思考

    代码过程中出现的种种问题 例如: 重复定义接口,组件; 废弃的组件没人敢删; store数据重复定义; 业务表单字...

  • 为什么要代码重构?如何重构?常见重构技巧

    关于重构 为什么要重构 代码重构漫画 项目在不断演进过程中,代码不停地在堆砌。如果没有人为代码的质量负责,代码总是...

  • 27 - 重构之Why、What、When、How

    关于重构 重构代码对一个工程师能力的要求,要比单纯写代码高得多。重构需要你能洞察出代码存在的坏味道或者设计上的不足...

  • 组合函数实现代码复用

    最近在 Vue.js 项目重构中,体会到了 Composable 的代码复用价值. 这里梳理一下. 业务中, 很...

  • 漫谈项目设计&重构&性能优化

    重构的好处: 重构能够改进软件设计,随着项目需求的变更,项目体积的变大早已与最初的设计大相径庭,代码结构变得凌乱、...

  • 「重构」读书笔记

    重构不是目的,而是工具。 为何重构 改进软件设计 维持或改进代码的设计意图,避免代码结构流失 消除重复代码,方便未...

  • 项目代码重构

    总结问题,代码结构优化,业务逻辑优化,同时实现日志格式化... 代码优化建议 代码长度和宽度 屏幕一页能完整展示一...

  • 【VUE+TS】1.0 Vue3.0+TS打造企业级组件库

    目的 使用vue单元测试库保证代码质量开源项目的开发发布流程设计合理的设计广泛适用的API如何保证代码质量vue3...

  • ruhe

    如何重构代码? 代码重构的基本原则:项目中不能出现重复代码? 什么叫重复代码?重复代码分n种; 1、文本类重复,即...

  • 重构(一) -- 一个入门实例

    本文主要参考《重构:改善既有代码的设计》 什么是重构 重构是在不改变代码外在行为的前提下,对代码做出修改,以改进程...

网友评论

    本文标题:2020年5月,vue项目代码重构中关于代码设计的思考

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