在
DSL:基于规则系统组织业务规则我提出DSL,不过在该文没有太多关于DSL的东东,显得有些牵强。
先要说明一下什么是DSL(Domain Specific language),援引《产生式编程》一文:
“DSL(领域特定语言)是一种
特化的,面向问题的语言。”
《产生式编程》对DSL的做如下分类:
1. 固定和独立的DSL(fixed, sparate DSL),如SQL,用独立转换器实现的,导致技术孤岛
2. 嵌入式的DSL(Embedded DSL),如类和过程,还有嵌入式的DSL
3. 模块可组合的DSL(Modularly Composable DSL),包含两种DSL:封装的DSL(encapsulated DSL)和方面性(aspectual DSL)。这个两个关系就象OOP和AOP之间的关系。
好了,DSL是
面向问题域的。换句话说,DSL是用来
解决(特定)问题。
1. DSL更多的是表述特定问题域的,这是和常见编程语言的最大区别,
编程语言不是面向特定的问题域的,而是一般问题域。
1.1 DSL中关于问题域的名词是关键字,而编程语言不是。
对于保险行业来说: 代理人,保单都是DSL中的关键字,而在编程语言中不是,需要建立起该对象(OO语言中)。
同时注意:OO追求的是一个细粒度的设计,而在DSL中可以是相对的一个粗粒度的概念。DSL中对象体系的观念并不直接。
1.2 DSL不处理编程语言中所涉及到的技术问题。
2. DSL是针对一个问题域的过程化表述。DSL基于特定问题域的关键字——名词,给出一个特定问题的流程。
按我在《小议领域模型Domain Model》一文中的观点,Domain Object都是DSL的关键字,而DSL表述的是Domain Service所包含的流程和规则。
举个例子:
如果某学生的这个学期期末考成绩90分以上超过5门,那么该学生就可以获得一个小红花。
用DSL来描述就可能是:
foreach students
if the total number of { the courses of {the student} {this term} that {it's grade > 90} } > 5 then
the student get a red flower
end if
end foreach
而用Java程序代码(假想代码)
Iterator studentIterator = students.iterator();
while(studentIterator.hasNext()){
Student student = (Student)studentIterator.next();
// 从教务处获取学习成绩,
// SchoolService表示教务处,"200602"是学期代号。
CourseGrade[] grades = SchoolService.getCourseGrade(student, "200602");
int i = 0;
Iterator gradeIterator = grades.iterator();
while(gradeIterator.hasNext()){
CourseGrade courseGrade = (CourseGrade)gradeIterator.next();
if(courseGrade.getGrade() > 90){
i++;
}
}
if(i>5){
// 学校为该生记一个小红花的奖章。
SchoolService.addMedal(student, "200602", new RedFlower());
}
}
从上面可以看出,用
DSL描述很简洁。(自己立了靶子,然后开打)
这里我要说明的是:student和course都DSL的关键字,而在java代码中不是,是开发中建立的对象体系。
DSL中没有涉及到编程语言的技术处理问题:
1. java代码中的转型:(Student)studentIterator.next();
2. 临时变量:int i = 0;
3. 新建对象: new RedFlower()
同时:DSL中我们隐藏了一个SchoolService对象,在技术上,SchoolService教务处记录学生的成绩和奖惩,student本身不带有这些信息。
(当然关于这个例子的设计,或许有人认为student本身可以拥有这些记录,不过由于这个course还关联教师对象等,所以单独管理。BTW:例子而已表太认真嘛!)
通常来说Use Case描述更多是是问题域的描述。
这里面DSL的关键字:所谓的问题域名词(也就是我们所说的Domain Model)的设计和建立就是DSL的实现的关键,现有的手段无非就两种:
1. 工具本身
内置支持Domain Object的设计和实现。这个是正统的路子。
2. 利用
外置工具实现,这个有点剑走偏锋的意思。
常见的有以下几条路子:
一.映射法。
如Drools3推出的DSL实现方式。来看看
springside的例子
package org.springside.dsl
import org.springside.bookstore.domain.Order
import java.lang.Double
import java.math.BigDecimal
expander orderPricing.dsl
rule " order 0.9 discount"
when
order price larger than 100
then
do 0.9 discount
#加入 > 就可以在drl/dsl 中直接写入drl 语法
>System.out.println("original price:"+order.getOriginalPrice()+" discount price:"+order.getTotalPrice());
end
注意这个expander orderPricing.dsl将导入DSL映射:
[when]order price larger than {topPrice}=order : Order( totalPrice >= {topPrice} )
[then]do {discountRate} discount=order.setTotalPrice(new Double(new BigDecimal(order.getTotalPrice().doubleValue() * {discountRate}).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()));
Oracle的Rule编辑器和JRule也属于这一类。
二.解析法
1. 脚本解析:
用脚本做有天然的好处,动态类型,语法的易用性等等。
出名的有Ruby:http://www.artima.com/rubycs/articles/ruby_as_dsl.html
2. 程序解析:
ajoo同学的jaskell的dsl方案:
http://forum.iteye.com/bloglist.php?userid=6423
http://forum.iteye.com/viewtopic.php?t=17579&start=120
或许这样分不太好,不过从本质上看,两者都通过提供相对灵活的语法解析来使代码简洁更贴近问题域描述。
映射法和解析法两者都不提供Domain Model的设计支持,两者只是在代码生成手段上有所不同。
在《DSL:基于规则系统组织业务规则》一文中所提出的组织业务规则的DSL就是指这两种。 三.元数据生成法。
这类属于正统手法,当然也是复杂性最大的。
1. JetBrains的MPS(Meta Programming System)。
MPS的定义流程很严格
1. 首先定义基本的关键字--Struture,然后要定义其对应的editor,相当于MS VS的Designer,
2. 有了这个后就可以作为high level的模型,用来设计Model,就可以设计描述领域问题。
3. 定义low level的代码产生器,定义转换映射关系。
可以参照Drools的设计实现来理解MPS的工作原理:
1. 定义DSL文件的左表达式(MPS在这里还需要设计好editor,drools合二为一了)。
2. 基于这个表达式定义领域问题。
3. 定义DSL的右表达式,以便代码生成。
MPS采用XML结构化的节点扩展能力来实现Type的定义,可以看到其GUI工具生成的mps文件是晦涩难懂的。
2. Microsoft的意图编程(Intentional Programming),只在《产生式编程》中闻其大名,未见真身。
不过微软推出了VS.Net的DSL Tools,不知道是不是意图编程的成果。
http://msdn.microsoft.com/vstudio/DSLTools/http://www.microsoft.com/downloads/details.aspx?familyid=57a14cc6-c084-48dd-b401-1845013bf834&displaylang=en MS DSL的model定义也是采用XML,没有designer的帮助,也是晦涩难懂的。
不过,其模版生成采用类似ASP.NET一样的语法结构,来定义模版(Text Template)。而不是想MPS那样,在MPS和IntelliJ两个工具切换来切换去的,同时也相对容易上手。
相比而言,MPS显的庞大,VS DSL则简单明了。
这正好反应了JAVA世界和MS世界的不同,MS一向是怎么样简单就怎么来,而JAVA更多像学院派风格。
准备另外写Blog详细介绍MPS和MS的DSL Tools,这是后话。
另:TW的taowen同学在BJUG的google groups上有过讨论,还发了一文《DSL简单观察报告》。有很好讨论,不过不好贴出来。
分享到:
相关推荐
Leverage the latest features of Xtext and Xtend to develop a domain-specific language. Integrate Xtext with popular third party IDEs and get the best out of both worlds. Discover how to test a DSL ...
- **查询 DSL**:Elasticsearch 提供了丰富的查询 DSL (Domain Specific Language) 来支持复杂的查询需求。例如,使用匹配查询来查找包含特定词汇的文档: ```bash curl -X GET "localhost:9200/my_index/_search...
项目资源包含:可运行源码+数据集+文档 python + numpy, pandas, matplotlib, pyecharts, wordcloud 适用人群:学习不同技术领域的小白或进阶学习者;可作为课程设计、大作业、工程实训或初期项目立项。 数据来源:数据集taxis.csv从网络下载 数据清洗:异常值与缺失值的处理:有一些数据distance(乘车距离)为零而且上下车地点为空,还有些一些数据的payment(支付方式)为空。 数据预处理:将列名更改成中文 标准化与归一化: 数据分析: 数据可视化:
TypeScript 入门教程
人脸识别项目实战
本资源汇总了 历届全国电子设计竞赛(电赛)真题+模拟题,涵盖 电路设计、嵌入式系统、信号处理、自动控制等核心考点,并提供详细解析及综合测评,帮助参赛者高效备赛、查漏补缺、提升实战能力。 适用人群: 适合 准备参加电子设计竞赛的大学生、电赛爱好者、电子信息类相关专业的学生,以及希望提高电子设计和电路分析能力的工程师。 能学到什么: 电赛考察重点:熟悉往届竞赛的命题方向及考核重点。 电路设计与仿真:提升模拟电路、数字电路、单片机等核心技能。 问题分析与解决能力:通过综合测评找到薄弱点并针对性提升。 实战经验:掌握竞赛策略,提高应试效率和设计能力。 阅读建议: 建议先 通读真题,了解题型与解题思路,然后 结合模拟题实战演练,查找不足并通过测评强化练习,逐步提升竞赛能力。
2024人工智能如何塑造未来产业:AI对各行业组织带来的的变革研究研究报告.pdf
人脸识别项目源码实战
给大家分享一套课程——Vulkan原理与实战课程
c语言学习
海豚鲸鱼数据集 5435张图 正确识别率可达92.6% 可识别:海豚 虎鲸 蜥蜴 海豹 鲨鱼 龟 支持yolov8格式标注
答谢中书书教学设计.docx
人脸识别项目源码实战
c语言学习
人脸识别项目源码实战
人脸识别项目实战
本美发门店管理系统有管理员和用户两个角色。用户功能有项目预定管理,产品购买管理,会员充值管理,余额查询管理。管理员功能有个人中心,用户管理,美容项目管理,项目类型管理,项目预定管理,产品库存管理,产品购买管理,产品入库管理,会员卡管理,会员充值管理,余额查询管理,产品类型管理,系统管理等。因而具有一定的实用性。 本站是一个B/S模式系统,采用SSM框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得美发门店管理系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中解脱出来,实现无纸化办公,能够有效的提高美发门店管理系统管理效率。 关键词:美发门店管理系统;SSM框架;MYSQL数据库;Spring Boot 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关技术 2 2.1 MYSQL数据库 2 2.2 B/S结构 3 2.3 Spring Boot框架简介 4 3系统分析 4 3.1可行性分析 4 3.1.1技术可行性 4 3.1.2经济可行性 5 3.1.3操作可行性 5 3.2系
内容概要:本文档介绍了基于SSA-CNN-GRU麻雀算法优化卷积门控循环单元数据分类预测的详细项目实例,重点讲述了该项目的背景、目标、挑战与解决方案、技术特点、应用领域等方面的内容。文档详细记录了从项目启动、数据预处理、算法设计(SSA优化CNN-GRU模型)、构建与评估模型到实现美观的GUI界面整个过程,并讨论了防止过拟合的技术如正则化、早停和超参数优化。另外还涵盖了项目扩展的可能性、部署和应用策略、需要注意的地方以及未来改进的方向。全文强调了模型的泛化能力和计算效率,展示了该混合算法模型在实际应用中的优越性能。 适合人群:具备一定的Python编程经验及机器学习基础知识的研究人员和技术人员;对深度学习、智能优化算法及实际应用感兴趣的学者和从业者;寻求提升数据分析和预测准确性的金融分析师、数据科学家等相关专业人士。 使用场景及目标:本文档非常适合用作学习和参考资料,以掌握如何将SSA、CNN与GRU三种先进技术结合起来进行复杂的分类和预测问题求解。具体应用场景包括但不限于以下几个方面:金融领域——股票价格预测;医疗保健领域——辅助诊断;工业制造——预防性维护;智能家居——个性化服务;以及其他涉及到时序数据分析和多模态数据处理的场合。文档既包含了理论知识又提供了完整的源代码示例,可以帮助读者理解算法原理并通过实践中加深对其的认识。 其他说明:该项目不仅仅是关于算法的设计实现,更是有关于系统的整体架构规划以及工程上的考量,比如环境准备(确保环境洁净、必要包的安装等)、数据准备、GPU配置支持等等。同时文中给出了详细的代码片段,方便开发者理解和复现实验成果。值得注意的是,虽然文中提供了一套通用解决方案,但在真实场景下还需要针对性的调整参数或修改网络结构来达到最好的性能效果。此外,对于追求更高的预测精度或解决更大规模的问题,作者建议进一步探索深度强化学习等高级技术和多任务学习策略,并且考虑使用增量学习让模型能够适应新数据而不必重新训练整个模型。最后提到安全性和隐私保护也是项目实施过程中的重要因素,要妥善保管用户的敏感信息并且做到合法合规地收集和使用数据。
人脸识别项目实战
人脸识别项目实战