这篇文章放在“杂”栏目下面,说明会是一篇著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。不成体系的文章。我想谈一下如何在前端优雅【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net的建模。直入正题!
转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】前端建模包括两个层面的建模:业务领域建模【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。和交互领域建模。这两者基本上没有本质联系【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。,但是在前端这个场景下,有的时候又有一些未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】特殊的情况。我们来看看如何在这两个层面建未经授权,禁止复制转载。原创内容,盗版必究。模。
著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】业务领域建模著作权归作者所有,禁止商业用途转载。
【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】简单讲,业务领域建模,就是把业务实体与其【本文受版权保护】【原创内容,转载请注明出处】逻辑进行建模。在知乎有小伙伴留言说,前端本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】不怎么适合DDD,因为前端是贫血模型。但未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。在我实际实践中,我更多是充血模型。业务模【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】型需要包含字段本身,以及复杂的业务逻辑。【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。你可能会讲,业务逻辑会被放在后端,但是实本文作者:唐霜,转载请注明出处。原创内容,盗版必究。际上前端也要这个业务逻辑,比如当一个订单【本文受版权保护】原创内容,盗版必究。的负责人是组织中的某个职位的角色时,需要【转载请注明来源】【作者:唐霜】在订单推进过程中填写审核时间这个信息。那本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】么,在前端,必须去判断当前用户是否是该角本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。色,或者获得当前用户的某个权限。这个逻辑原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。是跑不掉的。
【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。最近,我升级了tyshemo,支持了装饰本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】器的方式进行meta的定义。现在,你可以【作者:唐霜】【版权所有】唐霜 www.tangshuang.net这样定义自己的模型:
著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。import { Model, meta, state } from 'tyshemo'
class OrderModel extends Model {
@meta({
type: {
user_id: String,
},
})
master = null
@meta({
type: Number,
})
total_price = 0
@state()
role = 'member'
canFillDate() {
return this.role === 'admin'
}
}
通过@meta来装饰字段,通过@stat著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】e来装饰状态属性。这样撰写模型,会有更舒【版权所有】唐霜 www.tangshuang.net【作者:唐霜】服的感觉,而且可以更好的兼容typesc【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。ript,避免以前使用static属性定【版权所有,侵权必究】【作者:唐霜】义时,无法与typescript很好结合著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】的问题。
【本文受版权保护】本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。简单讲,通过业务建模,我们得到了一些模型【原创内容,转载请注明出处】【本文首发于唐霜的博客】,这些模型是独立的,自治的,在不被使用的【未经授权禁止转载】【作者:唐霜】时候,它独立描述了该业务对象的各种字段及原创内容,盗版必究。未经授权,禁止复制转载。其逻辑,但由于不在具体的业务场景中被使用【转载请注明来源】著作权归作者所有,禁止商业用途转载。,因此也只能表现有限的业务信息,它只能告【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。诉读代码的人“我有什么,能做什么”,而不本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】能告诉“我做了什么”。只有使用这些模型的【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】实例,放到具体的业务模块中,才能完成真正【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。的模块编程。所以,单纯讲,业务建模虽然重【未经授权禁止转载】未经授权,禁止复制转载。要且有用,但是如果不被适当的人使用,就会【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】非常混乱,毫无头绪。
本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net建立业务模型,可以把有关需求文档中,有关转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。核心业务的东西分出一层。
本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。本文作者:唐霜,转载请注明出处。交互领域建模本文作者:唐霜,转载请注明出处。
未经授权,禁止复制转载。【作者:唐霜】【版权所有】唐霜 www.tangshuang.net【本文受版权保护】本文作者:唐霜,转载请注明出处。这是后端没有的东西。直白讲,交互领域建模【转载请注明来源】原创内容,盗版必究。就是写类似Vue一样的View Mode【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】l,但是没有template那块。简单说【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】,就是建立一个模型,考虑到将来在view转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】层使用它,所以该模型的所有api,都是为【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。view设计的,主要目标,是和需求文档中【转载请注明来源】【版权所有】唐霜 www.tangshuang.net有关交互相关的描述一一对应。在交互模型中本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。,实例化业务模型,把业务模型变成交互模型著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net内部的状态。当在view中实例化交互模型转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。,就看不到业务模型了,view拿着交互模【转载请注明来源】【作者:唐霜】型的接口进行渲染和事件回调。
【版权所有,侵权必究】原创内容,盗版必究。原创内容,盗版必究。我在nautil中提供了可用于建立交互模【原创内容,转载请注明出处】【原创不易,请尊重版权】型的一个体系。举个例子:
原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。import { Component } from 'nautil'
import { SomeController } from './some.controller' // 写好的交互模型
class MyPage extends Component {
controller = new SomeController() // 实例化交互模型
SubmitButton = this.controller.turn((props) => {
const { someModel } = this.controller // 读取交互模型内的某个业务模型
const { total_price } = someModel // 读取业务字段值
return (
<button className={total_price > 100 ? 'sale-count' : undefined}>Submit</button>
)
})
render() {
const { SubmitButton } = this // 读取定义好的组件
}
}
上面这段代码中,SomeControll转载请注明出处:www.tangshuang.net原创内容,盗版必究。er是一个交互模型,里面使用了另外一个S著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.netomeModel业务模型。但是,对于vi【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。ew层而言,你不需要知道它是一个业务模型【原创内容,转载请注明出处】原创内容,盗版必究。,你只需要调用它即可。
原创内容,盗版必究。未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。Nautil在controller中提供【原创不易,请尊重版权】【版权所有,侵权必究】了turn方法,用于把一个用到contr【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.netoller的普通的组件转化为一个被con转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。troller控制的组件,当contro【版权所有,侵权必究】未经授权,禁止复制转载。ller中某些特定信息发生变化时,这些组【作者:唐霜】【本文受版权保护】件就会自动更新。
转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net【本文受版权保护】分层转载请注明出处:www.tangshuang.net
【作者:唐霜】【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。前端代码分层管理,从代码量上,并不比铁板【本文首发于唐霜的博客】未经授权,禁止复制转载。一块的管理多多少,毕竟所有的代码,都来自未经授权,禁止复制转载。【转载请注明来源】产品的需求描述。但是,分层管理所带来的灵【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。活性、可维护性是不可估量的。
转载请注明出处:www.tangshuang.net【作者:唐霜】本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net如果你写一个有很多块的页面的vue组件,【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。你就会发现,你的这个组件会越来越多交织在转载请注明出处:www.tangshuang.net【作者:唐霜】一起的代码,从一开始很容易理解,这几个状【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net态和这几个方法是关于最顶上这一块的,但是本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】,随着页面其他块的交互代码的增多,你就会【作者:唐霜】【本文受版权保护】发现,这个状态会在哪块用?这个方法会在什【本文首发于唐霜的博客】【版权所有,侵权必究】么情况下调?能不能删?可不可以改?都需要【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】上下反复读代码来确认。
转载请注明出处:www.tangshuang.net【转载请注明来源】本文版权归作者所有,未经授权不得转载。而如果你采取代码分层,你会先针对业务本身【转载请注明来源】【作者:唐霜】的实体进行建模,然后对业务中的交互进行建【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net模,最后才是view层的编写。此时,vi【作者:唐霜】【版权所有】唐霜 www.tangshuang.netew层的代码会清晰很多,因为它不再去管理【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net属于业务的逻辑,而更多的是用和回调。
著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】未经授权,禁止复制转载。【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net依赖【作者:唐霜】
【本文受版权保护】【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】在view层,我们用vue或react来本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net写,我更多使用react,因为react未经授权,禁止复制转载。【本文受版权保护】没有使用Proxy或defineProp未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。erty,可以使得我们建模时,使用更多魔【本文首发于唐霜的博客】【未经授权禁止转载】法。但是,有些时候,由于view层的特殊本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。机制,导致我们如果完全脱离框架进行建模时【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。,不得不提供一些多余的接口,来帮助和vi转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】ew进行依赖绑定。
未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net以我工作的项目为例,我们使用angula【版权所有,侵权必究】原创内容,盗版必究。rjs作为主体框架,如果我单纯使用ESM【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.netodule的模块,就没有办法直接使用$r【原创内容,转载请注明出处】未经授权,禁止复制转载。ootScope等这种angularjs【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。内置的服务,但是如果我提供一个angul【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】ar factory,就会牺牲模型的可移【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】植性,为之后跨平台复用带来问题。所以,n原创内容,盗版必究。转载请注明出处:www.tangshuang.netautil中提供了controller.原创内容,盗版必究。本文作者:唐霜,转载请注明出处。turn这个方法来实现模型层和视图层的连【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。接,简单说就是在框架层面调用forceU【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】pdate来实现重新渲染。
【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】【未经授权禁止转载】【原创内容,转载请注明出处】
