关注点分离的概念和糟糕的分离策略的坏处

前述

这是vue.js设计模式的第三章的3.3节代码放在开头,可以先折叠起来,需要的是再打开查看

问题前述:我们已经通过提取函数的方式,将validator将对象字面量中提取了出来成为一个独立函数validateVariant。这带来的好处就是测试的时候可以单独测试这个函数。使我们的测试代码更健壮和可维护。见以下代码

js 复制代码
<script>

export function validateVariant(variant) {

    if (!['success', 'warning', 'error'].includes(variant)) {

        throw Error(

            `variant is required and must` +

            `be either 'success', 'warning' or 'error'.` +

            `You passed: ${variant}`

        )

    }

    return true

}

export default {

    props: {

        variant: {

            type: String,

            required: true,

            validator: validateVariant

        }

    }

}

</script>
js 复制代码
import { render, screen } from '@testing-library/vue'

import Message, { validateVariant } from './message.vue'

describe('Message', () => {

    it('renders variant correctly when passed', () => {

        // omitted for brevity ...

    })

    it('validates valid variant prop', () => {

        ;['success', 'warning', 'error'].forEach(variant => {

            expect(() => validateVariant(variant)).not.toThrow()

        })

    })

    it('throws error for invalid variant prop', () => {

        expect(() => validateVariant('invalid')).toThrow()

    })

})

关键概念:关注点分离

在测试中,我们有针对UI的测试,通常测试中带有classList等页面元素的判断;也有针对业务逻辑的测试,比如props中的validator,当开发一个组件的时候,这个验证校验接收符合业务的值并通过,不通过则发送一个警告或者错误(见上述)。

为了让问题更清晰,想象你的公司专注于设计系统,而你有着一些使用Figma或Sketch的设计师,设计了一些button和信息这样的组件。他们决定了组件要支持三个表示不同信息的变量:success,warning 和 error。 而你是一个前端开发人员。在这个例子中,你专注于在Vue的框架下工作,你将会编写具有特定类名的Vue组件,这些类名使用设计师提供的CSS。 而未来,你可能也会需要构建具有相同CSS和流程的React或者Angular组件。这三个不同的框架或者说集成,都可以使用相同的validator的测试,这是核心的业务逻辑。

相同的validator的测试,指的是validataor属性的值是一个具有相同逻辑的验证函数,无论在什么平台,这个函数的核心逻辑都不会改变。

这个区别是很重要的。当我们使用测试框架方法(就像render方法)或Dom Api,我们是在验证Vue UI层工作是否如我们想的一样。而针对props的校验函数的测试则是针对我们的核心逻辑的测试。这些不同有时被称为"关注点"。一部分代码是关注UI,而另外则是关注核心逻辑。

如何辨别

分离他们是很棒的做法。这让你的代码更容易被理解和维护。这个概念被称为"关注点分离"。我们将贯穿整本书来重新讨论这个问题

如果你想要知道代码是关于UI的部分还是业务逻辑的部分。问一下自己这个问题:"如果我将代码迁移到React上,我能否重新使用这份代码和对应的测试"

在这个例子中,你可以在迁移到React中复用验证函数validator和相关的测试。这个函数关心的是业务逻辑,而不需要关心这个函数相关的UI框架(当然了,仅仅是一个函数是不依赖于UI框架的)。无论是Vue或者React,我们都将支持三个信息的变量。而Vue原本的相关的组件和组件测试,都不得不用React重新编写。

理论上,你不想你的业务逻辑耦合到你选择的框架中。框架会变化,但是你的业务逻辑不大可能发生重大的变化。

糟糕的分离策略的坏处

我看过很糟糕的关注点分离导致了公司花费了上万的成本。他们的开发到了增加一个特性是具有相当风险并且开发效率很慢的程度,因为他们的核心业务跟UI结合得太过紧密。重写UI则意味着重写业务逻辑。

这里说明了,糟糕的关注点分离策略,会导致迭代的成本巨大且风险不可控。而原因则在于核心业务跟UI层结合的过于紧密

结尾

下一节是案例分析,其中举例了糟糕的代码结合方式是怎么样的。以及好的关注点分离如何帮助代码在不同框架之间迁移的。

相关推荐
bysking33 分钟前
【前端-组件】定义行分组的表格表单实现-bysking
前端·react.js
王哲晓1 小时前
第三十章 章节练习商品列表组件封装
前端·javascript·vue.js
fg_4111 小时前
无网络安装ionic和运行
前端·npm
理想不理想v1 小时前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试
酷酷的阿云1 小时前
不用ECharts!从0到1徒手撸一个Vue3柱状图
前端·javascript·vue.js
微信:137971205871 小时前
web端手机录音
前端
齐 飞1 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
神仙别闹1 小时前
基于tensorflow和flask的本地图片库web图片搜索引擎
前端·flask·tensorflow
aPurpleBerry2 小时前
JS常用数组方法 reduce filter find forEach
javascript
GIS程序媛—椰子2 小时前
【Vue 全家桶】7、Vue UI组件库(更新中)
前端·vue.js