前后端跨语言同构——邂逅一场美丽的编程童话

广告位招租
扫码页面底部二维码联系

基于 JS 的同构或许你已经尝试过了,甚著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】至已经如火纯青了,然而,倘若现在我们要跨【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。语言进行同构呢?关于这篇文章的背景,我不原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。想赘述。既然要讨论,那开门见山:跨语言同转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。构,是一场美丽的编程童话,做的好,天堂见本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。,做的不好,再也不见。

本文版权归作者所有,未经授权不得转载。【作者:唐霜】转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】

跨端跨语言同构【版权所有,侵权必究】

【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】【作者:唐霜】未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。

首先不可避免的,我们需要为“同构”下一个【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】定义。同构本来是一个数学概念,但是在编程【作者:唐霜】著作权归作者所有,禁止商业用途转载。领域,我们可以简单理解为,同构是指在不同【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】平台上使用相同代码实现相同目标(确保一致【作者:唐霜】【版权所有,侵权必究】性)的方案。前后端同构就是在前端和后端使【原创不易,请尊重版权】【原创内容,转载请注明出处】用相同代码(sharing code b【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】etween the front-end【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net and the back-end),以【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】达到前后端效果一致的方案。它的核心,在于未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】“共用(share)”。至于实现什么目标原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。并不确定,比如在前后端使用同一个 lod【转载请注明来源】未经授权,禁止复制转载。ash 函数保证处理结果的一致性,比如利著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】用 react 特性实现同构渲染等等。

【关注微信公众号:wwwtangshuangnet】【作者:唐霜】【本文首发于唐霜的博客】【未经授权禁止转载】【本文首发于唐霜的博客】

我们不去探讨哪些东西适合前后端同构,或者【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】哪种方式才叫同构,以及如何实现同构直出。【原创内容,转载请注明出处】未经授权,禁止复制转载。我们直接跳过了概念之争,跳过流于形式的实原创内容,盗版必究。未经授权,禁止复制转载。现过程。我们即将探讨的是,用一种什么方式【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net,能够让我们保证实现相同目标的过程是一致原创内容,盗版必究。未经授权,禁止复制转载。的。即在架构设计上,确保前后端业务逻辑的【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。一致性。在这里,同构是一种设计思想【转载请注明来源】本文作者:唐霜,转载请注明出处。

本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。

而且更进一步,我们要探讨,在前后端跨语言【本文受版权保护】【关注微信公众号:wwwtangshuangnet】场景下,如何利用同构思想解决问题。由于我转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】们所指的前端主要是指 Web 前端,基本【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。上就是使用 JS 语言,这里的跨语言大部本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。分是指后端使用 PHP、Java 等其他转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。语言的场景。传统上,在后端开发中跨语言互【作者:唐霜】未经授权,禁止复制转载。调其实我们经常使用,方案也非常多,例如 【版权所有】唐霜 www.tangshuang.net【本文受版权保护】PHP 去使用 Python 代码,单就【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】这一个问题,也有多套方案实现。不过在本文【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】中,我们理想中的跨语言,本质上和语言无关【原创不易,请尊重版权】,我们要找到一种无论在什么语言环境中都能【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。运转的方案。如果我们不想实现一个 JS 未经授权,禁止复制转载。【未经授权禁止转载】中运行 PHP 的 PHPvm,或者一个转载请注明出处:www.tangshuang.net【转载请注明来源】 Java 中运行 JS 的 JSrun【本文受版权保护】著作权归作者所有,禁止商业用途转载。ner,那么我们为何不寻找一种基于协议的著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。同构方案呢?

【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net

校验逻辑共用【版权所有】唐霜 www.tangshuang.net

原创内容,盗版必究。【本文首发于唐霜的博客】【未经授权禁止转载】本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】

在复杂系统中,表单可能存在较为复杂的字段【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】逻辑,从而带来复杂的校验逻辑。表单校验是未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】任何系统中必备的能力,而且为保证业务准确【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。性和数据安全,前后端都会做校验。我们可以【作者:唐霜】未经授权,禁止复制转载。采用一种形式,确保前后端的校验是一致的,本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。没有差错的。

转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。

我们首先来解剖校验,它的本质是什么?校验【本文首发于唐霜的博客】【原创不易,请尊重版权】的本质,是将流动的信息体与既定的形状进行【转载请注明来源】本文版权归作者所有,未经授权不得转载。匹配,如果信息流动中的体态与既定形状没有原创内容,盗版必究。【原创不易,请尊重版权】补集,那么我们认为给定信息是符合要求的。转载请注明出处:www.tangshuang.net【作者:唐霜】而这里的既定形状,我认为主要包含两大方面【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net要素:

著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net
  • 所需的所有字段总和(多少)【未经授权禁止转载】
  • 本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。
  • 单个字段的取值范围(类型、大小、结构)原创内容,盗版必究。
  • 【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】【原创不易,请尊重版权】

所有字段总和是指要完成当前操作,所必备的本文作者:唐霜,转载请注明出处。【未经授权禁止转载】和可选的字段应该是哪些。如果超出这个总和未经授权,禁止复制转载。【本文受版权保护】的部分可能导致数据更新出错;不足这个总和转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】可能导致对象无法创建。在完成字段总和的校本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。验之后,单个字段的值,需要符合规定的逻辑【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net,这里的逻辑就包含该值应该是什么数据类型【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net,值的大小应该在什么范围,以及如果这是一【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。个结构体,应该具备什么结构,具体结构节点转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。上的数据类型又应该是什么。

【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】

请注意我上文所提的“形状(shape)”原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net这个概念,形状是可以被描述的。既然可以被【未经授权禁止转载】【本文受版权保护】描述,那么我们就可以建立自己的描述体系来【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】对我们的校验进行描述,从而抽象出脱离代码【转载请注明来源】【转载请注明来源】的描述文本。

本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】本文版权归作者所有,未经授权不得转载。

在著名 PHP 框架 Laravel 中未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】就建立了这样的描述体系。我们来看下官方给出的代码示例【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】

未经授权,禁止复制转载。【作者:唐霜】【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。
/**
 * Store a new blog post.
 *
 * @param  Request  $request
 * @return Response
 */
public function store(Request $request)
{
    $validatedData = $request->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);

    // The blog post is valid...
}

上面代码中 本文作者:唐霜,转载请注明出处。required|unique:posts|max:255 就是关于 title 字段的校验描述文著作权归作者所有,禁止商业用途转载。【本文受版权保护】本,而且我们可以很容易理解这一描述文本,本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】只要我们在描述系统中对这种描述表达式加以【作者:唐霜】【未经授权禁止转载】解释,那么就可以融会贯通,将这种表达方式【原创内容,转载请注明出处】原创内容,盗版必究。用在其他校验描述中。

本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】

一旦校验可以用文本(而非代码)进行描述,【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。也就意味着可以用文本的形式确定相同字段在【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。前后端的校验逻辑的“形状”,而文本,是我【本文受版权保护】【版权所有】唐霜 www.tangshuang.net们最喜欢的东西,因为它可以以任何形式在客本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。户端与服务端之间传输。我们要做的,是在服转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。务端和客户端构筑基于不同语言的解析器,一【未经授权禁止转载】原创内容,盗版必究。旦两端解析器抹平了平台差异,那么校验描述原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net文本就可以基于 HTTP 跳着舞,确保两转载请注明出处:www.tangshuang.net【版权所有,侵权必究】端的校验是一致的准确的。

【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。

数据结构共享【版权所有,侵权必究】

转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】

这里所讲的数据结构不是指计算机数据结构,【版权所有,侵权必究】未经授权,禁止复制转载。而是单纯地指结构体对象的形状结构,也就是本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】 JS 对象的结构。在前后端交互时,我们本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】经常需要前端对后台吐出的数据结构和数据类【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net型进行检查,后端也需要对前端提交的数据进【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】行检查,这些传输在网络中的数据,不是我们本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。一句“上 typescript”就可以解本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】决的。

【原创不易,请尊重版权】【转载请注明来源】著作权归作者所有,禁止商业用途转载。

让我们回到描述文本。本文版权归作者所有,未经授权不得转载。

【未经授权禁止转载】【作者:唐霜】【原创不易,请尊重版权】【原创内容,转载请注明出处】

既然我们已经隐约觉得,文本是我们的大杀器本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net,为什么我们不尝试将这一发现试验在前后端原创内容,盗版必究。【转载请注明来源】数据结构的一致性上呢?如果我们可以用文本【本文受版权保护】【转载请注明来源】方式,提前描述后端返回的数据的形状,那么本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net前端就可以校验后端吐出的真实数据是否符合本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。这个形状。这件事我们不一定要在正式环境做本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。,在开发和测试阶段我们就可以利用这一特性【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】,检查后端吐出数据的边界,避免上了正式环【原创内容,转载请注明出处】【转载请注明来源】境才来互怼。

转载请注明出处:www.tangshuang.net原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。【本文受版权保护】

有人可能会说:有什么是一份 API 文档【未经授权禁止转载】【转载请注明来源】解决不了的呢?如果真有,就再来一份文档注【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。释。嗯!很有道理,但太敷衍。在 API 转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。这件事上,文档只能解决一件事,就是定调,【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。走不走音,节奏乱不乱,完全控制不了。

【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。

GraphQL 虽然被定义为一门独立的前【本文受版权保护】未经授权,禁止复制转载。后端接口查询语言,但是,在事实上,我们在【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net使用时仍然是以描述文本的形式在前后端之间【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net传输这段描述,前端提交这段描述后,后端返本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】回基于描述的结果数据。基于 GraphQ本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】L 的系统,提前约定了前后端在数据结构上转载请注明出处:www.tangshuang.net【作者:唐霜】的一致性,从协议层面解决了数据结构的共享转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。。不过,GraphQL 还是会有一些问题【本文首发于唐霜的博客】【本文首发于唐霜的博客】,目前来讲核心问题在于成本高昂,它需要复【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】杂的部署,才能让开发者读懂,才能让后端系著作权归作者所有,禁止商业用途转载。【本文受版权保护】统按约定输出,受到已经具有成熟接口开发经【未经授权禁止转载】【作者:唐霜】验的后端开发者的抵触。

原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】

回到描述文本的思路上来。如果描述文本能够【原创内容,转载请注明出处】未经授权,禁止复制转载。准确的生成易读 API 文档的同时,还能本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。生成前端数据校验检查器,更进一步生成 M【作者:唐霜】【本文首发于唐霜的博客】ock 数据,并且基于 Mock 数据实本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net现自动化测试,是不是更有意思?没错,这件【作者:唐霜】【本文受版权保护】事其实我已经做完了,我创建了一个叫 tyshemo【本文首发于唐霜的博客】 的项目,它为前端提供了一个运行时的类型【作者:唐霜】【本文首发于唐霜的博客】与结构检查工具,同时,基于它的描述能力,【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】上述说的文档功能、Mock 功能、自动化本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】测试功能,也轻松实现了。为什么可以?因为【版权所有,侵权必究】转载请注明出处:www.tangshuang.net在类型系统的构建上,它遵循“描述”系统,【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】而非“约定”系统。所谓描述系统,是基于已本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。知信息,推演更多信息;而约定系统,则是基转载请注明出处:www.tangshuang.net【转载请注明来源】于共识,框定行为范围。具体举个例子,虽然【原创不易,请尊重版权】【作者:唐霜】都是对类型进行检查,TypeScript 是描述系统,而 p本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】rop-types 是约定系统未经授权,禁止复制转载。

【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】转载请注明出处:www.tangshuang.net

在前后端共同开发过程中,使用一套描述系统原创内容,盗版必究。未经授权,禁止复制转载。之所以难以实施,在于没有共通语言进行描述未经授权,禁止复制转载。原创内容,盗版必究。。而我,找到了这个共通语言:JSON。

原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】

“PHP 不是世界上最好的语言,JSON【本文首发于唐霜的博客】未经授权,禁止复制转载。 才是”。虽说 JSON 最大的问题是没【原创内容,转载请注明出处】【转载请注明来源】有注释,但是作为描述语言,它本身就是用于【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net描述的,它本身就有注释性,给注释加注释说【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net不通呀!而使用 JSON 的最大好处,除本文版权归作者所有,未经授权不得转载。【本文受版权保护】了前后端开发者都能看懂外,它还可以轻易的【转载请注明来源】【版权所有】唐霜 www.tangshuang.net在 HTTP 中传输,几乎没有什么约束。

【转载请注明来源】未经授权,禁止复制转载。原创内容,盗版必究。转载请注明出处:www.tangshuang.net
{
  "name": "string",
  "age": "number",
  "body": {
    "head": "boolean",
    "hand": {
      "left": "boolean",
      "right": "boolean"
    }
  }
}

虽然上面的描述有点细思极恐,但我相信,无【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】论是刚入编程的新萌,还是梭哈多年的老鸟,【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】都能用自己的膝跳反射读懂这一串 JSON【转载请注明来源】【版权所有,侵权必究】 所描述的内容。现在,我们把它作为后端 本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。API 接口返回的数据描述,我可以用小拇本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。指就能想出如何将它解析为可被用于类型校验本文作者:唐霜,转载请注明出处。【本文受版权保护】的 JS 程序,以及基于数据类型生成 M本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】ock 数据的 express 中间价,【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net至于文档,哦,你还需要一个在线文档吗?通本文作者:唐霜,转载请注明出处。【作者:唐霜】过这套方案提前管理前后端在接口输出结构上【版权所有,侵权必究】未经授权,禁止复制转载。的一致性,比 GraphQL 方案好的地【作者:唐霜】原创内容,盗版必究。方在于,这套方案不需要后端改变现有编程方【原创不易,请尊重版权】【版权所有,侵权必究】案,只需要人为参与一份 JSON 的维护【转载请注明来源】【关注微信公众号:wwwtangshuangnet】即可(前后端共建),这份 JSON 即我著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。们所需要的“同构”,无论后端使用什么语言【原创不易,请尊重版权】【未经授权禁止转载】开发,都不影响在接口数据结构一致性上的实本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。现方式。当然,在条件允许的情况下,后端接【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】口可以根据描述返回必要的字段,组装合适的【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】结构,裁剪不必要的字段​,达到和 Gra【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。phQL一样的效果(但事实上,后端应该在本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。开发时对照着 JSON 所描述的结构,直未经授权,禁止复制转载。【原创不易,请尊重版权】接给出结果)。​

【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】

等一等,这似乎也不满足我们的一些需求啊!

原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】

描述系统的缺陷是,无法简单快速的完成某些【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。复杂结构的说明,这有的时候导致我们很困惑未经授权,禁止复制转载。【原创不易,请尊重版权】。但是,我想说的是,约定系统并不被禁止,本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】当你无法描述一些东西的时候,我们可以约定著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。它,我们可以约定类型逻辑,甚至约定类型本【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】身,比如:

【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。【作者:唐霜】【本文首发于唐霜的博客】原创内容,盗版必究。
{
  "name": "?string",
  "age": "number|numeric",
  "parents": "(Person,Person)"
}

我们用符号来约定一些规则,用大写开头的单【原创内容,转载请注明出处】【本文首发于唐霜的博客】词约定一些可能应该具备深层结构的对象或实【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】例。不冲突,描述和约定并不冲突。我们要做【转载请注明来源】【原创内容,转载请注明出处】的,是构筑前后端基于不同语言的解析器,以转载请注明出处:www.tangshuang.net原创内容,盗版必究。支撑起我们想要的多语言同构的美丽童话。

著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】【本文首发于唐霜的博客】

领域模型共建【版权所有】唐霜 www.tangshuang.net

【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net

无论是校验逻辑,还是数据结构,它们都太单转载请注明出处:www.tangshuang.net【转载请注明来源】调了,它们是静态的,虽说有点意思,却无法【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】解决我们实际编程中所面临的业务问题。我们未经授权,禁止复制转载。【作者:唐霜】所面临的问题,多半是“有状态”问题。静态本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net规则我写一个正则就可以解析了,可是,当我【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】们的业务在运行中时,应用的状态在变,而这【本文首发于唐霜的博客】【本文受版权保护】些变化的东西,可能会影响所有上述静态的规著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】则。

【本文首发于唐霜的博客】【本文首发于唐霜的博客】【转载请注明来源】【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。

举个例子,当 a 字段为 0 时,b 字【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】段要使用 X 规则校验,而如果 a 规则【原创不易,请尊重版权】【作者:唐霜】为 1 时,b 字段要使用 Y 规则进行原创内容,盗版必究。【转载请注明来源】校验。这……再一个例子,后端返回的接口中未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】,当 a 字段为 0 时,b 字段的类型【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】为 string,但当 a 字段为 1 本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】时,b 字段返回的类型为 number。【本文受版权保护】著作权归作者所有,禁止商业用途转载。这……要用纯文本描述,还得把业务特殊性给【作者:唐霜】本文版权归作者所有,未经授权不得转载。兜住,办不到……办不到……

本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。【转载请注明来源】【未经授权禁止转载】

等等,真的办不到吗?【转载请注明来源】

【本文首发于唐霜的博客】【版权所有,侵权必究】【作者:唐霜】【版权所有,侵权必究】

用静态的方式,概括动态的上下文,这件事我本文作者:唐霜,转载请注明出处。原创内容,盗版必究。们没做过吗?在前端开发中,我们天天在做。【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】“实例”来自“类”,而“类”不就是静态的【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。吗?或者,“接口”不就是静态的吗?当然,【本文受版权保护】【版权所有】唐霜 www.tangshuang.net“接口”本身并不包含动态上下文的全部描述【作者:唐霜】【版权所有,侵权必究】,只有我们“实现接口”之后,我们才得到了【未经授权禁止转载】未经授权,禁止复制转载。一个完整的描述,结构体应该具备什么属性成【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net员,它的方法成员将会带来哪些副作用等等。

本文作者:唐霜,转载请注明出处。【作者:唐霜】【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net

再往上走,我们的业务在运行时所制造的状态【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。变化,是按照什么描述而发生的呢?

著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net【转载请注明来源】未经授权,禁止复制转载。

我们用领域模型描述领域对象的业务逻辑。领未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net域模型是静态的,不变的,它描述了一个领域【版权所有,侵权必究】【版权所有,侵权必究】对象在运行时将拥有哪些属性,当操作领域对未经授权,禁止复制转载。【原创不易,请尊重版权】象的方法时,将会带来哪些副作用(变化)。本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net我们阅读领域模型,便知道该业务拥有什么,【作者:唐霜】【版权所有,侵权必究】能干什么,不拥有什么,不能干什么。不过,【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】不得不说的是,我们阅读领域模型,所得到的【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。信息是不连贯的,我们知道领域对象的能力,【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。但我们不能知道在运行时,由于什么环境让它【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】释放了这种能力,不同属性和方法之间需要通【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net过什么操作逻辑进行前后顺序关联。总而言之【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】,领域模型是基于描述的抽象体,是我们业务本文作者:唐霜,转载请注明出处。原创内容,盗版必究。流转的核心和基础。

【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。

你可能会埋怨:我们用得着领域模型吗?前端【作者:唐霜】原创内容,盗版必究。需要领域模型吗?

未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。原创内容,盗版必究。本文作者:唐霜,转载请注明出处。

需要的。当你需要管理复杂的业务流转的时候本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】,你务必需要分清楚,当前流转中的业务,它原创内容,盗版必究。转载请注明出处:www.tangshuang.net是对什么领域对象在操作。而只有拥有领域模【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。型,你才能对你所操作的对象心知肚明。提高前端开发的整体门槛,是保障前端工程稳本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。定可靠的途径之一。我已经厌倦了把代码写给新手看,“新人接手【版权所有,侵权必究】转载请注明出处:www.tangshuang.net才能更快上手”的逻辑!为什么我们的高校老【转载请注明来源】本文作者:唐霜,转载请注明出处。师会说,学前端只要会点 jQuery 就本文作者:唐霜,转载请注明出处。原创内容,盗版必究。可以走遍天下了?因为我们的项目通过降低编程结构的前瞻性,牺牲原创内容,盗版必究。【本文受版权保护】业务逻辑的抽象性,来成全新人立即上手的便【本文受版权保护】【版权所有,侵权必究】捷性。为什么工厂工人需要集中培训一个月,而到了转载请注明出处:www.tangshuang.net原创内容,盗版必究。前端这里就立即上手开始撸?如果一个项目任【本文受版权保护】本文作者:唐霜,转载请注明出处。何人都可以立即上手开始撸,那对于一知半解本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net的新人,随手写句烂代码,暗暗庆幸“效果出本文作者:唐霜,转载请注明出处。【本文受版权保护】来了”,岂不是高楼少砖,飞机缺钉。新人加未经授权,禁止复制转载。【作者:唐霜】入团队,不应该由老成员低下身,配合新成员【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。写效率低下的,以界面效果为导向的流水账代【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net码,而应该是新成员仰起头,通过学习和研究【本文受版权保护】【版权所有,侵权必究】项目的编程结构和领域模型,掌握项目的前瞻【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。性和抽象性,之后才开始上手接触业务编写。

本文版权归作者所有,未经授权不得转载。【本文受版权保护】著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】【作者:唐霜】

让我们回到同构。【版权所有,侵权必究】

未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】转载请注明出处:www.tangshuang.net

既然领域模型是基于描述的,那么我们就可以【本文受版权保护】著作权归作者所有,禁止商业用途转载。延续我们前面提出的同构方式。JSON 为著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】我们提供了共通的描述语言。而领域模型又是转载请注明出处:www.tangshuang.net【本文受版权保护】静态的,岂不是我们可以通过 JSON 来本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。描述领域模型?

【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。
{
  "schema": {
    "age": {
      "default": 0,
      "type": "number",
      "validators": [
        {
          "validate(value)": "value > 0",
          "message": "年龄必须大于0"
        }
      ]
    },
  },
  "methods": {
    "grow()": "age ++"
  }
}

我用上面的 JSON 描述了一个模型,该【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。模型包含一个 age 属性和 grow 【版权所有】唐霜 www.tangshuang.net【本文受版权保护】方法。age 属性默认值为 0,数值类型【转载请注明来源】【作者:唐霜】,且在校验时要求值大于 0,否则会给出提【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net示文案。grow 方法是使得 age 属未经授权,禁止复制转载。【作者:唐霜】性自加。我们并不知道,什么时候会发生校验本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net,也不知道什么时候 grow 会被调用,未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】然而,我们却读懂了这个模型所包含的一切。

【本文受版权保护】【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。

前后端使用同一个领域模型未尝不可,但是由未经授权,禁止复制转载。【本文首发于唐霜的博客】于运行环境的差异,前后端领域模型还是会比【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net较大的不同。以前文的 unique:posts 这个校验规则为例,在后端将记录插入到数【作者:唐霜】【版权所有】唐霜 www.tangshuang.net据库之前,需要检查当前记录的 title【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】 字段是否已经被其他记录占用了。这一条规【原创内容,转载请注明出处】原创内容,盗版必究。则几乎不能被前端所直接使用,因为后端不可【转载请注明来源】【原创内容,转载请注明出处】能把所有记录的 title 一次性返回给【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。前端,唯一可行的比较好的体验,是用户输入原创内容,盗版必究。【作者:唐霜】 title 的时候,就立即通过 aja本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.netx 交互,反馈当前 title 是否可用转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】。这个例子说明,前后端共用同一个模型,很【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】多情况下是不行的。但是,前端所使用的模型著作权归作者所有,禁止商业用途转载。【转载请注明来源】,却可以来自后端,它可以是后端模型的子集转载请注明出处:www.tangshuang.net【转载请注明来源】,或者后端处理过后的优化模型。通过 JS本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】ON 的方式,这一模型被传送给前端。

【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。【转载请注明来源】【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。

但如果我们能够解释模型的 JSON,那么原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】我们就能实例化模型,得到运行时的实体对象【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】。而这个对象,和我们用代码本身写死的对象著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】,并无二致。通过文本描述,在运行时得到模【本文首发于唐霜的博客】【转载请注明来源】型实体,并进行进一步操作,这是一种典型的【版权所有,侵权必究】转载请注明出处:www.tangshuang.net反射思想。我们若能在我们特有的业务系统中本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】实现这一套反射接口,或许看上去复杂的问题【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net也变得非常简单。

著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。

在 HTTP 的两端,虽然运行的代码不同原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net,却因为一份基于文本描述的 JSON,可原创内容,盗版必究。【本文受版权保护】以最大限度的保证在大部分业务逻辑上,它们著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】是一致的。我们要做的,是构筑前后端基于不未经授权,禁止复制转载。【版权所有,侵权必究】同语言的转换器和解析器,实现前端反射机制【原创内容,转载请注明出处】原创内容,盗版必究。,确保业务尽可能准确,房子就可以修的越高【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。,飞机就可以飞的更久。

【本文受版权保护】【转载请注明来源】原创内容,盗版必究。【作者:唐霜】【版权所有】唐霜 www.tangshuang.net

TDL 驱动业务自定义【转载请注明来源】

【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】【关注微信公众号:wwwtangshuangnet】

TDL(Transfer Descrip【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。tion Language)指基于传输协【版权所有】唐霜 www.tangshuang.net【转载请注明来源】议的描述语言,即通过后端发送用描述语言编【转载请注明来源】未经授权,禁止复制转载。写的描述文本给前端,由前端解释该描述文本【未经授权禁止转载】转载请注明出处:www.tangshuang.net并创建运行时对象。和从后台加载真实脚本到【未经授权禁止转载】【作者:唐霜】前端进行执行不同,TDL 需要先接收再解本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。释后执行。加载脚本是不够安全的,前端并不【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。能确保动态传输的脚本是否安全,但 TDL原创内容,盗版必究。【本文受版权保护】 是安全的。总的来说,我们前面提到的通过【关注微信公众号:wwwtangshuangnet】【作者:唐霜】 JSON 发送领域模型给前端使用,本质【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】上是一种 TDL。

原创内容,盗版必究。【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net【版权所有,侵权必究】

业务自定义是大部分系统所想要的美好构想。【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】例如自定义权限逻辑、自定义表单、自定义布【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。局和交互……

【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】【原创内容,转载请注明出处】

我们可以想象,存在这样一种前端应用,它本著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】身没有任何业务逻辑的代码实现,它是一个壳【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。,它是一个 TDL 的运行器,所有的业务【作者:唐霜】原创内容,盗版必究。逻辑都由后端决定,并通过 TDL 动态执【作者:唐霜】【未经授权禁止转载】行。这样的应用其实很常见,以一个在线ex【版权所有,侵权必究】【未经授权禁止转载】cel表格为例,它具备排序、字段筛选、搜著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。索、格式化、表头固定、栏固定、字体颜色、【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net表达式等等特性,而相同的一个前端代码,却本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】要完成无数用户的无数场景,怎么做到的?就未经授权,禁止复制转载。原创内容,盗版必究。是通过 TDL,将所有这些用以表现的描述【原创内容,转载请注明出处】【未经授权禁止转载】,随表格数据一起通过接口返回。前端仅仅是【本文受版权保护】【作者:唐霜】一个解释器和交互呈现装置,不需要业务逻辑本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。,所有的业务逻辑通过 TDL 传输,并通【作者:唐霜】【版权所有,侵权必究】过前后端的约定,加以解释。

【本文受版权保护】【本文受版权保护】本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】

著名的框架 原创内容,盗版必究。strapi【关注微信公众号:wwwtangshuangnet】 拥有无限自定义的能力,它通过巧妙的架构【原创不易,请尊重版权】【版权所有,侵权必究】,实现业务自定义配置化。这和我们将业务写【未经授权禁止转载】转载请注明出处:www.tangshuang.net在代码中完全不同,写死在代码中的业务,一【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。旦稍有改动,就需要完成复杂的发版流程。而【作者:唐霜】本文作者:唐霜,转载请注明出处。基于自定义配置化的业务,业务的变动只需要【版权所有,侵权必究】【版权所有,侵权必究】通过在线手动配置,即可轻松修改。它在界面【转载请注明来源】【版权所有,侵权必究】上将业务的属性、逻辑,通过用户交互完成逻【本文受版权保护】【版权所有,侵权必究】辑关联,将这种关联抽象为描述信息,存储在转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】数据库中,需要的时候,从数据库中读取出来本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net,加以解释。当这些配置被存储在数据库中时著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。,仅仅是一些描述文本,但当它们被代码解释【未经授权禁止转载】【作者:唐霜】并运行时,就组建起极为强大的业务能力。自定义,是代码工程的最高境界,它看似是后本文版权归作者所有,未经授权不得转载。【本文受版权保护】端问题,实质是前端问题。当这些配置以 TDL 发送给前端,也可以本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】让前端同时具备极为强大的业务能力。

【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net【作者:唐霜】原创内容,盗版必究。未经授权,禁止复制转载。

TDL 还能帮前端省代码量,让前端专注于未经授权,禁止复制转载。原创内容,盗版必究。表现逻辑,而非业务逻辑。对于前端而言,业【本文受版权保护】【版权所有,侵权必究】务本身并不重要,重要的是可以对传输的描述【未经授权禁止转载】【原创不易,请尊重版权】文本实现完整解释。一旦 TDL 运行起来未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net,任何业务都可以在前端表现出来,因为前端【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net并不需要知道业务本身,而是需要解释用于描本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net述业务的 TDL 的能力。如此一来,同一【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。套前端代码,可以适用于千变万化的业务需求转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。,只要它们的 TDL 遵循相同语法。

本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】

当然,撰写 TDL 解释器需要花费一些精未经授权,禁止复制转载。【本文首发于唐霜的博客】力,但得到的收益未尝不是一劳永逸。我们要本文作者:唐霜,转载请注明出处。原创内容,盗版必究。做的,是在前后端之间建立起 TDL 桥梁【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】,构筑前端与后端对 TDL 的输出和解释著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】,确保在前端与业务解耦,通过解释器完成所原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】有业务逻辑的指令,这样,前端从复杂业务中【本文受版权保护】未经授权,禁止复制转载。被解脱出来,让表现层的东西更优雅,更从容【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】不迫。

【本文受版权保护】原创内容,盗版必究。原创内容,盗版必究。

结束语本文版权归作者所有,未经授权不得转载。

【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】

从前后端同构讲起,我们以校验逻辑的描述文【本文受版权保护】【关注微信公众号:wwwtangshuangnet】本、数据类型和结构的 JSON 描述、领本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。域模型的反射、TDL 为切入口,一层一层【版权所有,侵权必究】【原创内容,转载请注明出处】的去探讨探讨前后端跨语言同构。不过,从本【转载请注明来源】【本文受版权保护】质上讲,这里的“同构”和我们传统意义的基【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】于代码共享(使用同一份代码)的同构,完全【版权所有,侵权必究】【原创不易,请尊重版权】是两回事。这里的同构是,如何在前后端之间,构筑起一个可通过 HT【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】TP 传输描述文件实现业务逻辑后端化,后【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】端专注业务,前端业务解耦,专注表现层,通本文作者:唐霜,转载请注明出处。【未经授权禁止转载】过 TDL 确保前后端一致性准确性,由于【原创不易,请尊重版权】【本文首发于唐霜的博客】 TDL 不依赖前后端本身的实现语言,因本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。此,可以说是跨语言的,这样的编程方案。但是不要忘记,美丽的东西本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】总是带刺,让前端脱离业务是理想中的好事,【本文首发于唐霜的博客】【版权所有,侵权必究】前端少了很多事,后端也完全可以自洽业务逻【作者:唐霜】未经授权,禁止复制转载。辑,然而,当问题出现的时候,调试难度会上【版权所有,侵权必究】原创内容,盗版必究。来,由于领域模型实际在后端,而对领域对象本文作者:唐霜,转载请注明出处。【未经授权禁止转载】的操作在前端,导致一个完整的业务实现,需未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net要完成从后端到前端再回到后端的整个数据流本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】转,前后端耦合增强,在具体问题上可以说又原创内容,盗版必究。【原创内容,转载请注明出处】是死循环般无解。但无论如何,我认为这种尝【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。试是值得的,如果没有这种尝试,我们将永远著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】陷在当前复杂的业务逻辑中无法自拔,而当我【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net们尝试了,尝到了甜头,尝到了苦头,才会最【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。终明白,我们确实需要什么,我们也确实不需【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net要什么。

【本文受版权保护】【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net

2020-06-26 5993

为价值买单,打赏一杯咖啡

本文价值59.93RMB