关系经济人类预测化学自然
中准网
自然科学
知识物理
化学生物
地理解释
预测理解
本质社会
人类现象
行为研究
经济政治
心理结构
关系指导
人文遗产

dsl是什么意思啊(dsl口是什么意思啊)

4月28日 血海塔投稿
  最近在一个项目中,因为涉及很多状态的流转,我们选择使用状态机引擎来表达状态流转。因为状态机DSL(DomainSpecificLanguages)带来的表达能力,相比较于ifelse的代码,要更优雅更容易理解。另一方面,状态机很简单,不像流程引擎那么华而不实。
  一开始我们选用了一个开源的状态机引擎,但我觉得不好用,就自己写了一个能满足我们要求的简洁版状态机,这样比较KISS(KeepItSimpleandStupid)。
  作为COLA开源的一部分,我已经将该状态机(colastatemachine)开源,你可以访问https:github。comalibabaCOLA获取。
  在实现状态机的过程中,有幸看到MartinFowler写的《DomainSpecificLanguages》。书中的内容让我对DSL有了不一样的认知。
  这也是为什么会有这边文章的原因,希望你看完这边文章以后,可以对什么是DSL、如何使用DSL、如何使用状态机都能有一个不一样的体会。DSL
  在介绍如何实现状态机之前,不妨让我们先来看一下什么是DSL,在MartinFowler的《DomainSpecificLanguages》书中。开篇就是以StateMachine来作为引子介绍DSL的。有时间的话,强烈建议你去读读这本书。没时间的话,看看下面的内容也能掌握个大概了。
  下面就让我提炼一下书中的内容,带大家深入了解下DSL。什么是DSL
  DSL是一种工具,它的核心价值在于,它提供了一种手段,可以更加清晰地就系统某部分的意图进行沟通。
  这种清晰并非只是审美追求。一段代码越容易看懂,就越容易发现错误,也就越容易对系统进行修改。因此,我们鼓励变量名要有意义,文档要写清楚,代码结构要写清晰。基于同样的理由,我们应该也鼓励采用DSL。
  按照定义来说,DSL是针对某一特定领域,具有受限表达性的一种计算机程序设计语言。这一定义包含3个关键元素:语言性(languagenature):DSL是一种程序设计语言,因此它必须具备连贯的表达能力不管是一个表达式还是多个表达式组合在一起。受限的表达性(limitedexpressiveness):通用程序设计语言提供广泛的能力:支持各种数据、控制,以及抽象结构。这些能力很有用,但也会让语言难于学习和使用。DSL只支持特定领域所需要特性的最小集。使用DSL,无法构建一个完整的系统,相反,却可以解决系统某一方面的问题。针对领域(domainfocus):只有在一个明确的小领域下,这种能力有限的语言才会有用。这个领域才使得这种语言值得使用。
  比如正则表达式,d{3}d{3}d{4}就是一个典型的DSL,解决的是字符串匹配这个特定领域的问题。DSL的分类
  按照类型,DSL可以分为三类:内部DSL(InternalDSL)、外部DSL(ExternalDSL)、以及语言工作台(LanguageWorkbench)。InternalDSL是一种通用语言的特定用法。用内部DSL写成的脚本是一段合法的程序,但是它具有特定的风格,而且只用到了语言的一部分特性,用于处理整个系统一个小方面的问题。用这种DSL写出的程序有一种自定义语言的风格,与其所使用的宿主语言有所区别。例如我们的状态机就是InternalDSL,它不支持脚本配置,使用的时候还是Java语言,但并不妨碍它也是DSL。builder。externalTransition()。from(States。STATE1)。to(States。STATE2)。on(Events。EVENT1)。when(checkCondition())。perform(doAction());ExternalDSL是一种不同于应用系统主要使用语言的语言。外部DSL通常采用自定义语法,不过选择其他语言的语法也很常见(XML就是一个常见选择)。比如像Struts和Hibernate这样的系统所使用的XML配置文件。Workbench是一个专用的IDE,简单点说,工作台是DSL的产品化和可视化形态。
  三个类别DSL从前往后是有一种递进关系,InternalDSL最简单,实现成本也低,但是不支持外部配置。Workbench不仅实现了配置化,还实现了可视化,但是实现成本也最高。他们的关系如下图所示:
  不同DSL该如何选择
  几种DSL类型各有各的使用场景,选择的时候,可以这样去做一个判断。InternalDSL:假如你只是为了增加代码的可理解性,不需要做外部配置,我建议使用InternalDSL,简单、方便、直观。ExternalDSL:如果你需要在Runtime的时候进行配置,或者配置完,不想重新部署代码,可以考虑这种方式。比如,你有一个规则引擎,希望增加一条规则的时候,不需要重复发布代码,那么可以考虑External。Workbench:配置也好,DSLScript也好,这东西对用户不够友好。比如在淘宝,各种针对商品的活动和管控规则非常复杂,变化也快。我们需要一个给运营提供一个workbench,让他们自己设置各种规则,并及时生效。这时的workbench将会非常有用。
  总而言之,在合适的地方用合适的解决方案,不能一招鲜吃遍天。就像最臭名昭著的DSL流程引擎,就属于那种严重的被滥用和过渡设计的典型,是把简单的问题复杂化的典型。
  最好不要无端增加复杂性。然而,想做简单也不是一件容易的事,特别是在大公司,我们不仅要写代码,还要能沉淀NB的技术,最好是那种可以把老板说的一愣一愣的技术,就像尼古拉斯在《反脆弱》里面说的:
  在现代生活中,简单的做法一直难以实现,因为它有违某些努力寻求复杂化以证明其工作合理性的人所秉持的精神。FluentInterfaces
  在编写软件库的时候,我们有两种选择。一种是提供CommandQueryAPI,另一种是FluentInterfaces。比如Mockito的APIwhen(mockedList。get(anyInt()))。thenReturn(element)就是一种典型连贯接口的用法。
  连贯接口(fluentinterfaces)是实现InternalDSL的重要方式,为什么这么说呢?
  因为Fluent的这种连贯性带来的可读性和可理解的提升,其本质不仅仅是在提供API,更是一种领域语言,是一种InternalDSL。
  比如Mockito的APIwhen(mockedList。get(anyInt()))。thenReturn(element)就非常适合用Fluent的形式,实际上,它也是单元测试这个特定领域的DSL。
  如果把这个Fluent换成是CommandQueryAPI,将很难表达出测试框架的领域。StringelementmockedList。get(anyInt());booleanisExpectedelement。equals(element);
  这里需要注意的是,连贯接口不仅仅可以提供类似于methodchaining和builder模式的方法级联调用,比如OkHttpClient中的BuilderOkHttpClient。BuilderbuildernewOkHttpClient。Builder();OkHttpClientokHttpClientbuilder。readTimeout(51000,TimeUnit。SECONDS)。writeTimeout(51000,TimeUnit。SECONDS)。connectTimeout(51000,TimeUnit。SECONDS)。build();
  他更重要的作用是,限定方法调用的顺序。比如,在构建状态机的时候,我们只有在调用了from方法后,才能调用to方法,Builder模式没有这个功能。
  怎么做呢?我们可以使用Builder和Fluent接口结合起来的方式来实现,下面的状态机实现部分,我会进一步介绍。状态机
  好的,关于DSL的知识我就介绍这么多。接下来,让我们看看应该如何实现一个InternalDSL的状态机引擎。状态机选型
  我反对滥用流程引擎,但并不排斥状态机,主要有以下两个原因:首先,状态机的实现可以非常的轻量,最简单的状态机用一个Enum就能实现,基本是零成本。其次,使用状态机的DSL来表达状态的流转,语义会更加清晰,会增强代码的可读性和可维护性。
  然而,我们的业务场景虽然也不是特别复杂,但还是超出了Enum仅支持线性状态流转的范畴。因此不得不先向外看看。开源状态机太复杂
  和流程引擎一样,开源的状态机引擎不可谓不多,我着重看了两个状态机引擎的实现,一个是SpringStatemachine,一个是Squirrelstatemachine。这是目前在github上的Top2状态机实现,他们的优点是功能很完备,缺点也是功能很完备。
  当然,这也不能怪开源软件的作者,你好不容易开源一个项目,至少要把UMLStateMachine上罗列的功能点都支持掉吧。
  就我们的项目而言(其实大部分项目都是如此)。我实在不需要那么多状态机的高级玩法:比如状态的嵌套(substate),状态的并行(parallel,fork,join)、子状态机等等。开源状态机性能差
  除此之外,还有一个我不能容忍的问题是,这些开源的状态机都是有状态的(Stateful)的,表面上来看,状态机理所当然是应该维持状态的。但是深入想一下,这种状态性并不是必须的,因为有状态,状态机的实例就不是线程安全的,而我们的应用服务器是分布式多线程的,所以在每一次状态机在接受请求的时候,都不得不重新build一个新的状态机实例。
  以电商交易为例,用户下单后,我们调用状态机实例将状态改为OrderPlaced。当用户支付订单的时候,可能是另一个线程,也可能是另一台服务器,所以我们必须重新创建一个状态机实例。因为原来的instance不是线程安全的。
  这种newinstanceperrequest的做法,耗电不说。倘若状态机的构建很复杂,QPS又很高的话,肯定会遇到性能问题。
  鉴于复杂性和性能(公司电费)的考虑,我们决定自己实现一个状态机引擎,设计的目标很明确,有两个要求:简洁的仅支持状态流转的状态机,不需要支持嵌套、并行等高级玩法。状态机本身需要是Stateless(无状态)的,这样一个SingletonInstance就能服务所有的状态流转请求了。状态机实现状态机领域模型
  鉴于我们的诉求是实现一个仅支持简单状态流转的状态机,该状态机的核心概念如下图所示,主要包括:State:状态Event:事件,状态由事件触发,引起变化Transition:流转,表示从一个状态到另一个状态ExternalTransition:外部流转,两个不同状态之间的流转InternalTransition:内部流转,同一个状态之间的流转Condition:条件,表示是否允许到达某个状态Action:动作,到达某个状态之后,可以做什么StateMachine:状态机
  整个状态机的核心语义模型(SemanticModel)也很简单,就是如下图所示:
  Note:这里之所以叫SemanticModel,用的是《DSL》书里的术语,你也可以理解为是状态机的领域模型。Martin用Semantic这个词,是想说,外部的DSLscript代表语法(Syntax),里面的model代表语义(Semantic),我觉得这个隐喻还是很恰当的。
  OK,状态机语义模型的核心代码如下所示:StateMachinepublicclassStateMachineImpl
投诉 评论 转载

国防科技大学怎么样(国防大学出来的厉害吗)前段时间一部以国防科技大学为拍摄地的军旅片青春集结号成功地让科大上了热搜!那么国防科大究竟是怎样的一所学校呢?别急,且看科大学子用ABCDEFG7个字母带你近距离接触国防科大!……今日废纸价格走新消息(2021废纸价格)上涨幅度相对平缓,废纸实时价格Q1废纸实时价格废纸一般在3角左右根据地区不同也有6角的。在一般的物资回收门点,废纸价格走势预测,你是要出售还是购买么。瓦楞原纸价格方面。废……多久得癌症(肿瘤和癌症的区别)很多癌症患者都是在体检时才发现自己得了癌症,而平时却无丝毫察觉,这也造成大众有癌症是突然形成的这样一种误解,但事实上,癌症并非突来横祸,它很可能已经在你身体里潜伏很久了,只是你……推拉门还是平开门衣柜耐用(衣柜推拉门图片2020款图片)衣柜可以说是家居里面最为重要的家具之一了,作为家里最大的一件家具,如何设计得耐用、好用、方便,这里面可存在着不少的学问呢。最近我跟一个做了十多年木工的朋友聊天,他说,其实衣柜是……安德鲁尤克里里怎么样(学尤克里里还是吉他好)首先不管是吉他还是尤克里里,或者是其他任何乐器,都是我们用来抒发自身情绪的工具,它们没有好坏优劣之分,就像白粽子好吃还是咸粽子好吃一样,不用太较真,萝卜青菜各有所爱自己喜欢就行……BoCloud博云受邀参加首届CCF中国软件大会云际跨域资源文章来源:科技讯11月20日22日首届CCF中国软件大会(2020CCFChinasoft)在重庆大学召开。会议由中国计算机学会主办重庆大学、CCF软件工程专委、CCF系……苹果手机接听电话声音小怎么办(苹果手机接听音量太小怎么解决)大家有没有遇到过,在接听电话的时候总是听不清对方在说什么呢?在排除网络、信号这些原因外,最主要的原因还是在音量上面。哪怕音量已经调至最大,依旧听得模模糊糊?可以打开手机里的这几……被怎么清洗(买的被子脏了怎么洗)市民刘女士:冬季,日常使用的厚被褥不会像床单被罩一样经常清洗,用过一段时间后,该如何进行简单的杀菌清洁呢?冬季点题服务专栏记者:家政行业人士刘连喜介绍,冬季使用的被褥尽量……赤峰学院怎么样(赤峰学院成人教育官网)3月5日,记者在赤峰学院了解到,2020年度普通高等学校本科专业备案和审批结果已公布,赤峰学院申报的金融工程、应用语言学两个本科专业成功获批。预计9月份开始招生。(网络图……应聘健身教练要怎么说(应聘健身教练助理是干什么的)要说近几年哪个行业最火爆,我想健身教练绝对是有一个可以值得细说的一个行业。可能你会经常在招聘网上看到招聘健身教练的工作,而且无论你是几线城市薪资待遇都是8000。就像这样……最便宜最便宜的网的网站(最便宜的网)最便宜最便宜的网的网站(最便宜的网)经常因为娱乐、生活或者工作的需要,要去百度找一些资源,但是百度上的参差不齐,很多时候都难找到自己真正需要的。这里就来分享8个老师……dsl是什么意思啊(dsl口是什么意思啊)最近在一个项目中,因为涉及很多状态的流转,我们选择使用状态机引擎来表达状态流转。因为状态机DSL(DomainSpecificLanguages)带来的表达能力,相比较于ife……
家乡的竹林作文家里的财位养这几种植物能压住财气聚财治疗女性痛经的六大方法适合儿童风热感冒的药物有哪些如何查老婆酒店开过房记录(怎么查女朋友开的房查询)烟台今日猪价8月7日猪价百合花怎么折(各种各样的折纸花)苏珊米勒年月白羊座运势完整版六宫集中了许多星星如何拒绝面试(答应了面试又不想去了怎么拒绝)幸福的家126邮箱登陆(怎么注册自己的邮箱)烟台市今日新增病例多少
草鱼冬天吃食吗,冬天吃草吗王洪文女儿王亚萍,白酒起家成女富豪,多次拒绝绿卡只因是中国人张无忌乾坤大挪移修炼到第七层,为什么不如第四层的阳顶天?怎么区分婚前财产婚后财产小叶兜兰花期在每年年末半附生植物东北粘豆包改良后的新做法,不烫面,不发面,粘糯筋道不粘牙平台投资五年我终于知道亏本的原因了深圳车牌竞价时间一定要9点登录吗冬至的作文700字热文聚热点网 简单寓意好的赵姓女孩名字大全十年后的月球作文三星S7568和iPhone4s哪个好

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找菏泽德阳山西湖州宝鸡上海茂名内江三亚信阳长春北海西安安徽黄石烟台沧州湛江肇庆鹤壁六安韶关成都钦州