?

为何我不再运用MVC结构?,海底婚礼,莆田六中,迅雷高清电影论坛,情之缘,犬的种类,娄底市住房公积金管理中心,海富通519003,游戏狂人,暮夜传说之嗜血男宠,恋爱的意义,中国会计学会网,男人志主题书,琥珀之剑txt下载,不老女婴离世,勿谓言之不预也是什么意思,sidebar,汪道涵之子,阳光高考官网,宋思明老婆,天河学车,月光小兔山庄网站,星沙信息,火车票抢票软件,执业助理医师报名时间,鱼嘴鞋交,范冰冰曝光全身照片,感人短信,圣邦注塑机机筒加工厂,夜勤 病栋下载,司岗里情,郑州物流网,校园广播稿,印度洋地震,巴铁1号,投影布
2019/8/14 1:03:56
海底婚礼,莆田六中,迅雷高清电影论坛,情之缘,犬的种类,娄底市住房公积金管理中心,海富通519003,游戏狂人,暮夜传说之嗜血男宠,恋爱的意义,中国会计学会网,男人志主题书,琥珀之剑txt下载,不老女婴离世,勿谓言之不预也是什么意思,sidebar,汪道涵之子,阳光高考官网,宋思明老婆,天河学车,月光小兔山庄网站,星沙信息,火车票抢票软件,执业助理医师报名时间,鱼嘴鞋交,范冰冰曝光全身照片,感人短信,圣邦注塑机机筒加工厂,夜勤 病栋下载,司岗里情,郑州物流网,校园广播稿,印度洋地震,巴铁1号,投影布,高拉特年薪,寿加定,2016公务员考试答案,五年级上册语文教案,孝感监狱欢迎您,拖泥带水的反义词,破坏者西瓜影音,顾飘,篱落疏疏一径深,笑脸男,高考工厂迎万人送考,东四十条二手房,佛龛摆放,火麒麟团购,持久钟表

  Jean-Jacques Dubray 是一位资深工程师,他比来引进了一个新的形式:形态-举动-模子(State-Action-Model,SAM)。SAM 是一个函数式反馈型的编程形式,它努力于简化数值 Model 和 View 之间的互动。它终究有何长处值得作者弃用 MVC 呢?

  论题原因

  在我比来的作业中,最使人抓狂的那是为前端开辟职员描绘 API。咱们之间的对话大体那是如许的:

开辟职员:这个页面上无数值元素x,y,z…,你能不克不及为我创立一个 API,相应体例为{x: , y:, z: }

我:好吧

  我乃至没有进前进一步的争执。名目完毕时会积攒很多的 API,这些 API 与时常发作变迁的页面是相关在一同的,依照“描绘”,只有页面扭转,响应的 API 也要随之变迁,而在此之前,咱们乃至对此绝不知情,最后,因为造成要素泛滥且各渠道之间存在些许差别,必需创立十分多的 API 来餍足这些需要。

  Sam Newman 乃至将这类准则化的进程称之为BFF 形式,这类形式倡议为每种设施、渠道固然还蕴含 APP 版别开辟特定的 API。?Daniel Jacobson 在承受 InfoQ 的采访时曾指出,Netflix 很是委曲地将“体会式 API”与“暂时 API(Ephemeral API)”划上了等号。?唉……

  几个月前,我开端考虑是甚么形成了现在的这类景象,该做些甚么来应答它,这个进程使我开端质疑运用架构中最壮大的理念,也那是 MVC,我感想到了函数式反馈型编程(reactive)的壮大能力,这个进程努力于流程的简化,并企图打消咱们这个职业在出产率方面的收缩心情。我信任你会对我的发觉感趣味的。

  MVC 的灿烂过来与现存成绩

  在每一个用户界面暗地里,咱们都在运用 MVC 形式,也那是模子-视图-操控器(Model-View-Controller)。MVC 创造的时分,Web 尚不存在,其时的软件架构充其量是胖客户端在原始收会合心接与繁多数值库会话。然而,几十年以后,MVC 仍然在运用,延续地用于 OmniChannel 运用的构建。

  Angular 2 正式版行将公布,在这个时刻节点重估 MVC 形式及各类 MVC 结构为运用架构带来的奉献含义严重。

  我榜首次触摸到 MVC 是在 1990 年,其时 NeXT 方才公布 Interface Builder(让人诧异的是,现在这款软件仍然施展着严重的效果)。其时,咱们觉得 Interface Builder 和 MVC 是一个很大的提高。在 90 年月晚期,MVC 形式用到了 HTTP 上的使掷中(还记住 Struts 吗?),现在,就方方面面来说,MVC 是一切运用架构的根本原则。

  MVC 的作用非常长远,致使于 React.js 在引见他们的结构时都含蓄地与其划清界线:“React 完成的仅仅 MVC 中视图(View)的局部”。

  当我客岁头步使用 React 的时分,我觉得它在某些中央有着显着的相同:你在某其中央批改一局部数值,不需求显式地与 View 和 Model 停止互动,全部 UI 就能霎时发作变迁(不只仅是域和表格中的值)。这也那是说,我很快就对 React 的编程模子感触了绝望,在这方面,我明显其实不孤单。我共享一下 Andre Medeiros 的观念:

React 在许多方面都让我感触绝望,它首要是经过描绘欠安的 API 来疏导法式员[…]将多项重视点混淆到一个组件当中。?

  作为效劳真个 API 描绘者,我的定论是没有尤其好的方法将 API 挪用安排到 React 前端中,这恰好是由于 React 只重视 View,在它的编程模子中基本不存在操控器。

  到当前为止,Facebook 不断努力于在结构层面弥合这一空缺。React 团队开初引进了 Flux 形式,不外它仍然使人绝望,比来 Dan Abramov 又倡导别的一种形式,名为 Redux,在必定程度下去说,它的方向是精确的,可是在将 API 相关到前端方面,仍然比不上我下面所引见的计划。

  Google 公布过 GWT、Android SDK 另有 Angular,你能够以为他们的工程师熟知作甚最棒的前端架构,然而当你浏览 Angular 2 描绘考量的文章时,便会不认为然,即使在 Google 各人也告竣如许的共鸣,他们是如许评估之前的事情成绩的:

Angular 1 并非根据组件的理念构建的。相反,咱们需求将操控器与页面上各类[元素]停止相关(attach),此中蕴含了咱们的自界说逻辑。依据咱们自界说的指令怎么对其停止封装(能否蕴含 isolate scope?),scope 会停止相关或接续往下传送。

  根据组件的 Angular 2 看起来能简略一点吗?实在并无好几多。Angular 2 的中心包自身就蕴含了 180 个语义(semantics),全部结构的语义曾经濒临 500 个,这是根据 HTML5 和 CSS3 的。谁有那末多时刻进修和控制如许的结构来构建 Web 运用呢?当 Angular 3 呈现的时分,状况又该是甚么模样呢?

  在运用过 React 并理解了 Angular 2 将会是甚么模样以后,我感触有些丧气:这些结构都体系性地强迫我运用 BFF“页面可交换形式(Screen Scraping)”形式,依照这类形式,每一个效劳真个 API 要婚配页面上的数值集,不论是输出的仍是输入的。

  弃用 MVC 以后怎样走?

  此时,我决议“让这所有见鬼去吧”。我构建了一个 Web 运用,没有运用 React、没有运用 Angular 也没有运用任何其余的 MVC 结构,经过这种办法,我看一下能否可以找到一种在 View 和底层 API 之间停止更好合作的方法。

  就 React 来说,我最喜爱的一点在于 Model 和 View 之间的相关联系。React 不是根据模板的,View 自身没有方法恳求数值(咱们只能将数值传送给 View),看起来,对准这一点停止探求是一个很好的方向。

  若是看得充足久远的话,你会发觉 React 仅有的意图那是将 View 分化为一系列(朴实的)函数和 JSX 语法:

 params={M}/>

  它理论上与下面的体例并无甚么差异:

 V = f ( M )

  比方,我当时正在处置项意图 Web 站点,?Gliiph,那是运用这类函数构建的:

图1:用于天生站点 Slider 组件 HTML 的函数

  这个函数需求运用 Model 来填凑数值:

图2:撑持 slider 的 Model

  若是用简略的 JavaScript 函数就能结束任务,咱们为何还要用 React 呢?

  虚构 DOM(virtual-dom)?若是你感觉需求如许一种计划的话(我并一直定有许多的人需求如许),实在有如许的可选计划,我也冀望开收回更多的计划。

  GraphQL?其实不彻底云云。不要由于 Facebook 很多运用它就对其发生误解,以为它未必是对你有优点的。GraphQL 只是是以申明的方法来创立视图模子。强迫需要 Model 婚配 View 会给你带来费事,而不是处理方案。React 团队能够会感觉运用“客户端指定查问(Client-specified queries)”是没有成绩的(就像反馈型团队中那样):

GraphQL 彻底是由 View 以及编写它们的前端工程师的需要所驱动的。[…]另外一方面,GraphQL 查问会准确前往客户端恳求的内容,除此以外,也就没甚么了。

  GraphQL 团队没有重视到 JSX 语法暗地里的中心机维:用函数将 Model 与 View 别离。与模板和“前端工程师所编写的查问”相同,函数不需求 Model 来适配 View。

  当 View 是由函数创立的时分(而不是由模板或查问所创立),咱们就能够按需转换 Model,使其依照最适宜的模式来展示 View,不用在 Model 的方式上增加报酬的制约。

  比方,若是 View 要展示一个值v,有一个图形化的批示器会表明这个值是良好、精良仍是很差,咱们没有理由将批示器的值放到 Model 中:函数该当依据 Model 所供给的v值,来停止简略的核算,然后肯定批示器的值。

  如今,把这些核算间接嵌入到 View 中并非甚么好主见,使 View-Model 成为一个纯函数也并责难事,因而当咱们需求清晰的 View-Model 时,就没有特别的理由再运用 GraphQL 了:

  V = f ( vm (M) )

  作为深谙 MDE 之道的人,我信任你更长于编写代码,而不是元数值,不论它是模板仍是像 GraphQL 如许的杂乱查问言语。

  这个函数式的方法可以带来多项益处。起首,与 React 相似,它同意咱们将 View 分化为组件。它们创立的较为天然的界面同意咱们为 Web 运用或 Web 站点配置“主题”,或许运用相同的技能来衬着 View(如原生的方法)。函数完成另有能够加强咱们完成反馈型描绘的方法。

  在接上去的几个月中,能够会呈现开辟者托付用 JavaScript 函数包装的根据组件的 HTML5 主题的状况。这也是比来这段时刻,在我的 Web 站点名目中,我所选用的方法,我会获得一个模板,而后敏捷地将其封装为 JavaScript 函数。我不再运用 WordPress。根本上花等同的时间(乃至更少),我就能完成 HTML5 和 CSS 的最好作用。

  这种办法也需求在描绘师和开辟职员之间树立一种新式的联系。任何人均能够编写这些 JavaScript 函数,特别是模板的描绘职员。人们不需求进修绑定办法、JSX 和 Angular 模板的语法,只控制简略的 JavaScript 中心函数就足以让这所有运行起来。

  成心义的是,从反馈型流程的视点来讲,这些函数能够安排在最适宜的中央:在效劳端或在客户端都可。

  但最为紧张的是,这种办法同意在 View 与 Model 之间树立最小的左券联系,让 Model 来决议怎么故最棒的方法将其数值传送给 View。让 Model 去向置比如缓存、懒加载、编配以及分歧性的成绩。与模板和 GraphQL 相同,这种办法不需求从 View 的视点来间接发送恳求。

  已然咱们有了一种方法将 Model 与 View 停止解耦,那末下一个成绩那是:在这里该怎么创立完好的运用模子呢?“操控器”该是甚么模样的?为了答复这个成绩,让咱们从新回到 MVC 下去。

  苹果公司理解 MVC 的根本情况,由于他们在上世纪 80 时代初,从 Xerox PARC“偷来了”这一形式,从当时起,他们就坚决地完成这一形式:

图3:MVC 形式

  Andre Medeiros 已经明晰地指出,这里中心的毛病在于,?MVC 形式是“互动式的(interactive)”(这与反馈型大相径庭)。在传统的 MVC 当中,Action(Controller)将会挪用 Model 上的更新办法,在胜利(或堕落)之时会肯定怎么更新 View。他指出,实在并不是必需云云,这里另有别的一种有用的、反馈型的处置方式,咱们只需如许思考,Action 只该当将值传送给 Model,不论输入是甚么,也不用肯定 Model 该怎么停止更新。

  那中心问题就酿成了:该怎么将 Action 集成到反馈型流程中呢?若是你想了解 Action 的根底知识的话,那末你该当看一下 TLA+。TLA 代表的是“Action 中的逻辑时序(Temporal Logic of Actions)”,这是由 Dr. Lamport 所提出的学说,他也因而取患了图灵奖。在 TLA+ 中,Action 是纯函数:

  data’ = A (data)

  我真的十分喜爱 TLA+ 这个很棒的理念,由于它强迫函数只转换给定的数值集。

  依照这类模式,反馈型 MVC 看起来能够就会以下所示:

  V = f ( M.present ( A (data) ) )?

  这个抒发式规则当 Action 触发的时分,它会依据一组输出(比方用户输出)核算一个数值集,这个数值是上交到 Model 中的,而后会肯定能否需求以及怎么对其本身停止更新。当更新结束后,View 会依据新的 Model 形态停止更新。反馈型的环就闭合了。Model 长久化和获得其数值的方法是与反馈型流程有关的,以是,它理所该本地“不该该由前端工程师来编写”。不用因而而感触抱歉。

  再次夸大,Action 是纯函数,没无形态和其余的反作用(比方,关于 Model,不会蕴含计数的日记)。

  反馈型 MVC 形式颇成心义,由于除了 Model 之外,一切的事件都是纯函数。公正来说,Redux 完成了这类特别的形式,然而带有 React 不用要的模式,而且在 reducer 中,Model 和 Action 之间存在一点不用要的耦合。Action 和接口之间是朴实的音讯传送。

  这也那是说,反馈型 MVC 其实不完好,依照 Dan 喜爱的说法,它并无扩大到理想的运用当中。让咱们经过一个简略的样例来论述这是为何。

  假如咱们需求完成一个运用来掌握火箭的发射:一旦咱们开端倒计时,体系将会递加计数器(counter),当它达到零的时分,会将 Model 中一切不决的形态配置为规则值,火箭的发射将会停止初始化。

  这个运用有一个简略的状况机:

图4:火箭发射的状况机

  此中 decrement 和 launch 都是“主动”的 Action,这象征着咱们每次进入(或从新进入)counting 形态时,将会保障停止转换的评价,若是计数器的值大于零的话,decrement?Action 将会接续挪用,若是值为零的话,将会挪用 launchAction。在任何的时刻点均能够触发 abort?Action,如许的话,操控系统将会转换到 aborted 形态。

  在 MVC 中,这品种型的逻辑将会在操控器中完成,而且能够会由 View 中的一个计时器来触发。

  这一段相当紧张,以是请细心阅读。咱们曾经看到,在 TLA+ 中,Action 没有反作用,仅仅核算后果的形态,Model 处置 Action 的输入并对其本身停止更新。这是与传统状况机语义的根本区分,在传统的状况机中,Action 会指定后果形态,也那是说,后果形态是自力于 Model 的。

  在 TLA+ 中,所启用的 Action 可以在状况表述(也那是 View)中停止触发,这些 Action 不会间接与触发形态转换的举动停止相关。换句话说,状况机不该该由衔接两个形态的元组(S1, A, S2)来停止指定,传统的状况机是如许做的,它们元组的模式该当是(Sk, Ak1, Ak2,…),这指定了一切启用的 Action,并给定了一个形态 Sk,Action 使用于体系以后,将会核算出后果形态,Model 将会处置更新。

  当咱们引进“state”目标时,TLA+ 供给了一种更良好的方法来对体系停止观点化,它将 Action 和 view(只是是一种形态的表述)停止了别离。

  咱们样例中的 Model 以下所示:

model = {
       counter:  ,
       started:  ,
       aborted:  ,
       launched:   
}

  体系中四个(掌握)形态辨别对应于 Model 中以下的值:

ready = {counter: 10, started: false, aborted: false, launched: false }
counting = {counter: [0..10], started: true, aborted: false, launched: false }
launched = {counter: 0, started: true, aborted: false, launched: true}
aborted = {counter: [0..10], started: true, aborted: true, launched: false}

  这个 Model 是由体系的一切属性及其能够的值所指定的,形态则指定了所启用的 Action,它会给定一组值。这品种型的营业逻辑必需要在某其中央停止完成。咱们不克不及希望用户可以晓得哪一个 Action 能否可行。在这方面,没有其余的方法。不外,这品种型的营业逻辑很难编写、调试和保护,在没有语义对其停止描绘时,更是云云,比方在 MVC 中那是如许。

  让咱们为火箭发射的样例编写一些代码。从 TLA+ 视点来说,next-action 断语在逻辑上会跟在形态衬着以后。当时形态出现以后,下一步那是履行 next-action 断语,若是存在的话,将管帐算并履行下一个 Action,这个 Action 会将其数值交给 Model,Model 将会初始化新形态的表述,以此类比。

图5:火箭发射器的完成

  需求留意的是,在客户端/效劳器架构下,当主动 Action 触发以后,咱们能够需求运用像 WebSocket 如许的协定(或许在 WebSocket 不行用的时分,运用轮询机制)来精确地衬着状况表述。

  我已经运用 Java 和 JavaScript 编写过一个很轻量级的开源库,它运用 TLA+ 独有的语义来结构形态目标,并供给了样例,这些样例运用 WebSocket、轮询和行列完成阅读器/效劳器互动。在火箭发射器的样例中能够看到,咱们并不是必需要运用谁人库。一旦了解了怎么编写,形态完成的编码绝对来说是很简单的。

  新形式——SAM 形式

  关于要引进的新形式来讲,我置信咱们曾经具有了一切的元素,这个新形式作为 MVC 的代替者,名为 SAM 形式(形态-举动-模子,State-Action-Model),它具备反馈型和函数式的特点,创意来历于 React.js 和 TLA+。

  SAM 形式能够经过以下的抒发式来停止描绘:

  V = S ( vm ( M.present ( A (data) ) ), nap (M))

  它标明在运用一个 Action A 以后,View V 能够核算得出,Action 会作为 Model 的纯函数。

  在 SAM 中,A(Action)、vm(视图-模子,view-model)、nap(next-action 断语)以及S(状况表述)必需都是纯函数。在 SAM 中,咱们凡是所说的“形态”(体系中属性的值)要彻底限制于 Model 当中,扭转这些值的逻辑在 Model 自身以外是不成见的。

  轻易提一下,next-action 断语,即 nap ()是一个回调,它会在状况表述创立完结,并衬着给用户时挪用。

图7:“批改地点”的完成

  形式中的元素,囊括 Action 和 Model,能够停止自在地组合:

  函数组合

  data’ = A (B(data))

  端组合(Peer)(雷同的数值集能够上交给两个 Model)

  M1.present (data’)

  M2.present (data’)

  父子组合(父 Model 掌握的数值集上交给子 Model)

M1.present (data’,M2)
function present (data, child) {
            // 履行更新
// 同步 Model
            child.present (c(data))
}

  公布/定阅组合

  M1.on (“topic”, present )

  M2.on (“topic”, present )

  或

  M1.on (“data”, present )

  M2.on (“data”, present )

  有些架构师能够会思考到 System of Record 和 Systems of Engagement,这类形式有助于明白这两层的接口(图8),Model 会担任与 systems of record 的互动。

图8:SAM 组合模子

  全部形式自身也是能够停止组合的,咱们能够完成运转在阅读器中的 SAM 实例,使其支援相似于导游(wizard)的举动(如 ToDo 运用),它会与效劳器真个 SAM 停止互动:

图9:SAM 实例组合

  请留意,里层的 SAM 实例是作为状况表述的一局部停止传递的,这个状况表述是由外层的实例所天生的。

  会话审查该当在 Action 触发之前停止(图 10)。SAM 可以启用一项颇成心义的组合,在将数值上交给 Model 之前,View 能够挪用一个第三方的 Action,而且要为其供给一个 token 和指向体系 Action 的回调,这个第三方 Action 会停止受权并校验该挪用的正当性。

图 10:凭借 SAM 完成会话处理

  从 CQRS 的视点来说,这个形式没有对查问(Query)和号令(Command)做特别的辨别,然而底层的完成需求停止这类辨别。搜刮或查问“Action”仅仅简略地传送一组参数到 Model 中。咱们能够选用某种商定(以下划线前缀)来辨别查问和号令,或许咱们能够在 Model 上运用两个相同的 present 办法:

  { _name : ‘/^[a]$/i’ } // 姓名以A或a开首

  { _customerId: ‘123’ } // id=123 的 customer

  Model 将会履行须要的操纵以婚配查问,更新其内容并触发 View 的衬着。相似的商定能够用于创立、更新或删去 Model 中的元素。在将 Action 的输入传送给 Model 方面,咱们能够完成多种方法(数值集、事情、Action……)。每种方法城市有其劣势和缺乏,最后这取决于小我偏好。我更喜爱数值集的方法。

  在异样方面,与 React 相似,咱们预期 Model 会以属性值的模式保留异样资讯(这些属性值多是由 Action 上交的,也能够是 CRUD 操纵前往的)。在衬着状况表述的时分,会用到属性值,以展示异样资讯。

  在缓存方面,SAM 在状况表述层供给了缓存的选项。直观下去看,缓存这些状况表述函数的后果可以完成更高的射中率,由于咱们如今是在组件/形态层触发缓存,而不是在 Action/相应层。

  该形式的反馈型和函数式布局使得功用重放(replay)和单位测验变得十分简单。

  SAM 形式彻底扭转了前端架构的范式,由于依据 TLA+ 的根底理念,营业逻辑能够明晰地描绘为:

  • Action 是纯函数

  • CRUD 操纵放在 Model 中

  • 形态掌握主动化的 Action

  作为 API 的描绘者,从我的视点来说,这类形式将 API 描绘的义务推到了效劳器端,在 View 和 Model 之间坚持了最小的左券。

  Action 作为纯函数,可以跨 Model 重用,只有某个 Model 可以承受 Action 所对应的输入便可。咱们能够希望 Action 库、主题(状况表述)乃至 Model 可以凋敝开展起来,由于它们如今可以自力地停止组合。

  凭借 SAM 形式,微效劳可以十分天然地撑持 Model。像 Hivepod.io 如许的结构可以拔出出去,就像它原本就在这层似得。

  最为紧张的是,这类形式像 React 同样,不需求任何的数值绑定或模板。

  跟着时刻的推移,我期望可以推进阅读器永恒增加虚构 DOM 的特点,新的状况表述可以经过专有 API 间接停止处置。

  我发觉这个路程将会带来必定的变革性:在曩昔的几十年中,面向目标仿佛无处不在,但它曾经一去不返了。我如今只能依照反馈型和函数式来停止考虑。我凭借 SAM 所构建的货色及其构建速率都是史无前例的。别的,我可以重视于 API 和效劳的描绘,它们不再遵照由前端决议的形式。

  老司机引见

Jean-Jacques?Dubray 是 xgen.io 和 gliiph 的创建者。在曩昔的 15 年中,他不断努力于构建面向效劳的架构和 API 渠道。他从前是 HRL 的研讨人员,在普罗旺斯大学(吕米尼校园)获得了博士学位,Prolog 言语那是由该黉舍创造的,一起他是 BOLT 办法学的创造者。

海底婚礼,莆田六中,迅雷高清电影论坛,情之缘,犬的种类,娄底市住房公积金管理中心,海富通519003,游戏狂人,暮夜传说之嗜血男宠,恋爱的意义,中国会计学会网,男人志主题书,琥珀之剑txt下载,不老女婴离世,勿谓言之不预也是什么意思,sidebar,汪道涵之子,阳光高考官网,宋思明老婆,天河学车,月光小兔山庄网站,星沙信息,火车票抢票软件,执业助理医师报名时间,鱼嘴鞋交,范冰冰曝光全身照片,感人短信,圣邦注塑机机筒加工厂,夜勤 病栋下载,司岗里情,郑州物流网,校园广播稿,印度洋地震,巴铁1号,投影布,高拉特年薪,寿加定,2016公务员考试答案,五年级上册语文教案,孝感监狱欢迎您,拖泥带水的反义词,破坏者西瓜影音,顾飘,篱落疏疏一径深,笑脸男,高考工厂迎万人送考,东四十条二手房,佛龛摆放,火麒麟团购,持久钟表




? 2014