根据情况与标志鉴别ENtity与VO

  • A+
所属分类:行业新闻

根据情况与标志鉴别ENtity与VO 。
帕唑帕尼 Votrient 新闻资讯摘 要:印度的帕唑帕尼照片。根据情况与标志鉴别ENtity与VO文中讨论如下所示信息:什么叫情况什么叫标志什么叫Entity什么叫VO(ValueObject)在制定中如何鉴别Entity和VO要了解Entity和VO,必须先了解2个基本概念:「情况」和「标志」!大家先来聊一聊「情况」!

情况

大伙儿认同都是在淘宝网买了物品吧!在淘宝网购买货品后,会有一个订单信息,纪录了你购买的产品信息、价格、店面信息内容、还有一个尤其关键的信息内容,便是订单信息。根据这一订单信息,大家可以明白咱们的购买过程目前开展到哪一步了。假如你迟疑了一段时间才下决心购买了一件朝思暮想的产品,你是不是很在乎订单信息?隔三差五要更新一下网页页面,看一下订单信息是不是表明已送到了?开发设计过系统软件的都了解,一般订单信息全是应用一个字段名来表述的,例如status,不一样的状况是给status赋差异的值。可是这一status便是「订单信息」吗?难道说情况便是一个字段名?!Order{ product location seller buyer status ...}

你有没有想过,在我们说「情况」的情况下,大家事实上指的是啥?我们在许多情景下能使用「情况」这个词,例如:你今天「情况」非常好哦盆友又微信发朋友圈「情况」了我还在天猫买的产品己经是送货「情况」了REST(描述性情况迁移蔓延)中的情况以「你今天情况非常好」这一句为例子,假如情况便是一个字段名!那麼,「你今天情况非常好」便是status=1?!「你今天情况不好」便是status=0?!很显著,这不科学!假如「情况」并不是简易的一个字段名得话,那麼「情况」到底是啥呢?实际上在构架设计风格:你确实懂REST吗?早已提过去了!原文中对REST的表述,有那么一句:一个由页面构成的互联网(一个虚似状态机),客户根据挑选连接在使用中前行(情况转移),造成下一个网页页面(运用的下一个情况的描述)被迁移蔓延给客户,而且展现给他,便于她们来应用。融合以上的好多个情景,你有没有发觉,「情况」事实上代表的是「总体目标目标在当下时间所呈现的內容」!在系统软件中根据一个字段名来表明情况仅仅一种简单化方式!

如无尤其表明,下边所提起的「情况」指的是「总体目标目标在当下时间所呈现的內容」,而不是指状态字段

你今天「情况」非常好哦:你今天给人的感受很最好的朋友又微信发朋友圈「情况」了:微信朋友圈当今的內容我还在天猫买的产品己经是送货「情况」了:你的购买过程现阶段所处的阶段REST(描述性情况迁移蔓延)中的情况:当今展现现如今客户眼前的网页页面即然「情况」表明的是「当今时间所呈现的內容」!那麼表明了「情况」是个快照更新/暂态!换句话说,「总体目标目标」有好几个「情况」,「当今情况」仅仅「总体目标目标」诸多「情况」中的一个!大伙儿应当玩过定格动画吧?如同下边那样(下面的图截自《大侦探福尔摩斯2:诡影游戏》):图上的宣传册便是「总体目标目标」,画册的每一页便是「情况」,当今展现出去的那一页便是「当今情况」!在了解了什么叫「情况」之后,大家就可以来基本区别Entity和VO了:Entity在全部产品生命周期中,有好几个「情况」,换句话说「情况」是可调的(对于变不会改变就看具体情况了)而VO在全部产品生命周期中,只有一个「情况」,换句话说「情况」不会改变目前,难题来了,针对VO而言,由于「情况」是不能变的,大家就可以根据情况与标志鉴别ENtity与VO用其「情况」来表明VO!可是针对Entity而言,由于有好几个「情况」,且「情况」是可调的,那咱们如何来表明呢?以里面的Order为例子,假定同一个顾客在同一个售卖家那边购买了2个相同的产品,那2个订单信息里的消息全是一样的,可是它是两种不一样的订单信息,大家如何区别这两个订单信息呢?目前就到下一个主人公出场了:「标志」!

标志

说到「标志」,大家首先想起的是计算机语言中的「引入」或「表针」!例如接下来的编码:Order orderA = new Order(\"productA\",...);Order orderB = new Order(\"productA\",...);orderA.productName = \"productB\";

前边二行,orderA和orderB尽管订单信息(情况)都同样,可是这也是两种不一样的订单信息第三行,即便改了orderA的产品名字(情况),仍然或是同样的订单信息这解决了「区别同样情况的不一样Entity」的难题,可是并没有处理Entity有好几个情况的难题。由于「标志」偏向的是总体目标目标的目前情况。并且,许多开发语言中有一个挺大的难题,便是不区别「标志」和「情况」!是什么意思呢?假定大家在看一部电影,在我们逐渐收看时,便是这部影片生命期的逐渐,收看完毕便是这部影片生命期的完毕,在这段时间里,影片的界面(情况)一帧帧的展现现如今大家眼前,大家可以根据播放视频、快放、倒退、中止更改影片的情况,每一个情况全是相互之间独立性的,相近那样:伴随着時间的更改,大家能得到到影片的差异情况,每一个情况是彼此独立性的。可是其实大家的编码逻辑性像下边那样:var movie1 = new Movie();movie1.setCurrentFrame(\"第三帧\");var currentMovie = movie1movie1.setCurrentFrame(\"第四帧\");currentMovie // 或是第三帧吗?

电影观看到第三帧,大家用一个自变量currentMovie储存了影视作品的目前情况(第三帧),可是后边电影观看第四帧了,currentMovie也就变成了第四帧的状况了。语言表达中的这类「标志」(我称之为「隐式标志」)也有此外一个难题,便是没法跨系统软件。例如,在分布式架构中,必须确保2个操作系统中的另一半是同一个目标,这类「隐式标志」是做不到的。因此「隐式标志」并无法达到人们的要求。大家必须「表明标志」,「表明标志」在实际中很普遍:每一个人都是有身份证件,即便有两人名字同样、性別一样、身型同样、乃至整容手术了外貌都一样,可是身份证号是不一样的,身份证号便是所有人的「表明标志」一个产品系列上制造的商品可以说一模一样,可是都是会有一个唯一的商品编号,这一商品编号便是商品的「表明标志」在上面买东西的例子中,就等于给Order一个唯一标志,例如一个唯一的订单编号:Order{ orderNo // 表明标志 product location seller buyer status ...}

给出订单编号之后,不管订单信息的情况如何转变,只需订单编号不会改变,那麼它便是同一个订单信息。因此,「标志」是另一个区别Entity和VO的关键环节:Entity有标志而VO沒有标志注意标识并不一定仅仅一个字段名,可能是好几个字段名的组成,这须要按照不一样的领域模型来明确。例如在一个院校体系里,可以根据学年度 班集体 学籍号来标志一个学员。

Entity和VO

了解了标志和情况,大家就可以来界定Entity和VO了:Entity是具备好几个「情况」的目标,「情况」在其产品生命周期中很有可能会更改,根据「标志」来唯一明确这一目标VO只有一个「情况」,且是在建立时就明确的,换句话说VO是不能变的目前大家知道什么叫Entity,什么叫VO,那麼大家如何在系统软件中鉴别什么目标是Entity,什么目标也是VO呢?

如何鉴别Entity和VO

一个目标是表明成Entity或是VO,在于体系的【关心大家请加微信好友:yaodaoyaofang 】点。大家还以淘宝买东西为例子,假定你一直在某个店面购买了个产品,品质非常好。过去了一段时间后,你要再买一个,可是你忘了是哪一家店了,因此你从顺利完成的订单列表中点一下产品想进来再度购买。可是你点进来后发觉,产品停售了。这是由于「产品」在「订单系统」中是个VO,而在「产品智能管理系统」中是Entity!实际上非常好解释:在「产品智能管理系统」中,系统软件必须【关心大家请加微信好友:yaodaoyaofang 】「产品」的「情况」,必须维护保养是不是发布、库存量是多少、各种各样特性等信息内容(多种多样情况)。就是在「产品智能管理系统」中,产品情况是可调的。因此它也是有「标志」,即产品ID而「订单系统」并不关注「产品」的「情况」转变,它只【关心大家请加微信好友:yaodaoyaofang 】在建立订单信息时,这一「产品」的当今「情况」是什么,而且在订单信息建立成功后,这一「产品」的「情况」就不易再更改了在「产品智能管理系统」中,产品可以那样表达:Product { id // 产品标志 name desc status ...}

而在「订单系统」中,订单信息是个Entity,产品是个VO,可以那么表明:Order{ orderNo // 订单信息标志 product:Product status ...}Product { id // 这儿并不是标志,仅仅情况 name desc status ...}

留意这儿的id并并不是标志,这儿的id事实上衰退变成情况的一部分,保存这一id是为了能和「产品智能管理系统」开展互动,根据id从产品智能管理系统中查看产品。自然也有其他方式 ,比如储存「产品智能管理系统」中该产品的历史时间URL。

汇总

文中从对「情况」和「标志」的了解逐渐,一步步来表述什么叫Entity和VO,及其如何在系统软件中鉴别Entity和VO。后边将进一步探讨Entity与根据情况与标志鉴别ENtity与VOVO的关联,及其与其他部件的关联,比如DTO,Service,Resporitory,DAO等

参考文献

《领域驱动设计:软件核心复杂性对应之道》《实现领域驱动设计》《Clojure编程乐趣》《七周七并发模型》药道网【帕唑帕尼网上订购方式】。印度的全世界海淘药店:帕唑帕尼和培唑帕尼。

weinxin
微信咨询
这是我的微信扫一扫

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: