Martin Fowler和Rebecca Parsons关于领域特定语言(Domain-Specific Language)的新书

Martin Fowler先生和Rebecca J. Parsons女士在合著的一本新书中对领域特定语言(Domain-Specific Language)进行了探讨。领域特定语言能够给软件工程师带来很多好处,包括提升抽象层次,增强各利益相关人之间的沟通,以及提升生产效率等等。在本书中,作者给领域特定语言所下的定义是:

\

“一种专注于某个特定领域并具有有限表达特性的计算机编程语言。”

\

书中使用格兰特小姐的控制器(Miss Grant's Controller)这种领域特定语言作为例子。这种语言可以用类似打开一个抽屉或者关上一扇门之类的动作来操作建筑物中的密室。通过使用领域特定语言,工程师可以轻而易举地对整个系统进行重新配置,从而避免在通用编程语言编写的配置系统中需要不断识别并在多个位置之间切换的问题。

\

本书介绍的领域特定语言的类型,不同于主流编程语言所惯有的外部领域特定语言,也不同于诸如Ruby on Rails这种基于某种编程语言的内部领域特定语言。本书中介绍了第三种类型,语言工作台,它代表的是一种可以编辑和创造领域特定语言的可定制环境。无论开发人员使用哪一种类型的领域特定语言,作者在书中始终强调的关键是一定要在一种合理的语义模型基础之上打造领域特定语言。

\

本书不仅仅介绍了领域特定语言的基本概念,同时也尝试用务实的态度和Java、C#等编程语言的例子对这一主题进行阐释。书中还介绍了一些用于设计领域特定语言的模式以及最佳实践。

\

InfoQ有幸采访到Martin先生(MF)和 Rebecca女士(RJP),以了解他们为这个热门话题写这本书的目的和前因后果:

\

InfoQ:你们希望通过此书向读者传递的主要信息是什么?

\

RJP:目前大众对领域特定语言及其用途,实现领域特定语言的相关工具和技术都缺乏了解。通过此书我们试图减轻人们对于创造一种语言所具有的恐惧,带着这个目的,我们希望能够逐渐发现一些有趣并高效的领域特定语言的新用法。

\

MF:我曾经在一些客户那里看到过不少使用领域特定语言的项目,不过我认为由于很难找到关于打造领域特定语言的各种技术方案和相关信息,他们实际上错过了一些很好的想法。我希望通过这本书把相关的技术收集起来,以便于大家研究领域特定语言。这样我们将更可能看到这项技术的真正潜力在哪里。

\

InfoQ:模型驱动开发(MDSD, Model-Driven Software Development)和领域特定语言之间的区别在什么地方呢?

\

MF:这个问题很难回答。我对模型驱动开发社区关注不多,不过看起来这种技术内部似乎已经发展出了一些彼此差别很大的分支。其中有一些着重于通过定义良好的语义模型来驱动计算。对于这一类技术,因为领域特定语言是一种可以较好地描述其备选计算模型的技术,所以它们之间可以很好的协作(本书中我称之为适应性模型 (Adaptive Models))。

\

不过模型驱动开发还有另外一种类别,它认为流程图的作用堪比成千上万行代码。这是CASE思想的延续,并且和OMG的模型驱动架构(MDA)有着千丝万缕的联系。他们对领域特定语言的拥抱只能算是徒劳无功的垂死挣扎了。

\

InfoQ:领域特定语言能带来哪些好处,什么时候应该选择内部而不是外部领域特定语言?

\

MF:无论什么时候,如果要讨论领域特定语言的优缺点,我都要强调每一个领域特定语言只是在某个开发库或者框架之上的一层薄薄的皮而已(我们称之为语义模型)。想决定是否需要开发一个领域特定语言,我们只要考虑通过领域特定语言来表达业务行为所带来的好处是不是超过调用普通的命令-查询式的API。

\

RJP:使用某个能够正确抽象当前问题领域的编程语言能够极大地提高软件开发的效率。同样,根据当前问题领域对一个编程语言进行裁剪也可以提供一个让业务团队更好理解开发团队进展的机制。领域特定语言也可以对自身进行裁剪以适应当前的问题领域,从而有助于增进业务团队和开发团队之间的沟通。

\

内部和外部领域特定语言其实各有所长。从语言设计的角度来看,外部领域特定语言能够提供最大程度的灵活性,因为内部领域特定语言语言必须遵循宿主语言的解析和语言语义。

\

MF: 当你和非程序员一起工作时,这种灵活性将会特别有益。

\

RJP:但是要得到这种灵活性就不得不付出增加开发和构建复杂程度的代价。在开发环境中使用外部领域特定语言需要额外的开发工具。同时,在构建过程中处理外部领域特定语言也需要为其增加专门构建词法分析器的步骤。

\

MF:词法分析技术是建造外部领域特定语言的关键所在,但是大多数开发者对其并不十分熟悉。在大学中,开发者完全以通用编程语言为背景学习词法分析技术,这让建造外部领域特定语言变得更加困难。

\

RJP:还有一个需要考虑的问题是,用领域特定语言编写程序所需要的编辑器。对内部领域特定语言来说只要使用宿主语言相同的集成开发环境就可以了,而对外部领域特定语言来说则没有现成的编辑器可用,很可能需要自己写一个。不过考虑到用领域特定语言写的程序大多很短,这也不算是个大问题。然而,对某些类似于分析退休金规则这样的特殊应用程序来说,程序很可能会很长。

\

InfoQ:一个编程语言需要具备哪些功能和特性才能够易于和领域特定语言相集成?

\

RJP:这个问题很容易引起对编程语言的语法必须符合某些新语义的争论。实际上领域特定语言可以通过多种形式实现。Lisp语言有非常灵活的语法并借助了宏处理(macro-processing)功能。Ruby则包含一种缺失方法(missing method)处理机制。

\

MF: 我认为闭包(也就是匿名方法或者lambdas)特别重要,因为闭包允许你控制嵌套表达式的计算顺序,同时也能够非常自然地描述一个分层结构。

\

RJP: 编程语言的语法越简洁,其生成的领域特定语言也就越简洁。类似Java语言中的 \"{}\" 这种语法元素将使生成的领域特定语言显得杂乱。

\

InfoQ:我觉得领域特定语言既可以表达问题域也能表达解决方案域。那么它们是否也适用于横切关注点呢?AspectJ是否也是一种领域特定语言?

\

MF: 我认为AOP是一个完全不同的概念,不过通常认为借助领域特定语言来描述横切问题应该比用普通框架的命令-查询式接口更具可读性。

\

InfoQ:在一个项目组中,您认为哪些角色对于实施领域特定语言负有主要责任,是架构师,开发人员,还是需求分析工程师?系统化实施领域特定语言的流程大致是什么样的?

\

RJP:这在很大程度上要视领域特定语言的目标用户而定。有些领域特定语言面向的是商务用户,而有些则更多为技术人员设计。关注于商业用户的领域特定语言主要由业务分析师主导语言设计,并和技术团队密切合作。

\

MF:  我想目前为止我们还没有就在大范围内开发领域特定语言积累足够的经验。

\

InfoQ:也许大多数领域特定语言不会以一种类似于宇宙大爆炸的方式被一下子创造出来,而是需要慢慢演进?如果是这样:这种演进对软件工程师就其职责和工作内容方面来说会带来哪些潜在影响?我们应该怎样测试领域特定语言?

\

RJP:谈到测试,根据实现方式不同,测试领域特定语言的方法会有许多不同之处。首先,需要对”语法“进行测试以保证预期的合法语句能够被正确识别。解析器需要的测试工作不多,不过测试一下一个解析过的语句是否符合预期的”语义“还是很有必要。如果你使用书中提倡的语义模型(Semantic Model)方法,语义测试只需确保模型是通过正确的方式生成即可,这其实和传统的通过单元测试验证框架的行为非常相似。

\

领域特定语言的演进和代码的演进其实如出一辙,唯一的例外是一旦要在生产中开始使用领域特定语言,那么就必须考虑如何把已有的代码移植过去。

\

MF:领域特定语言程序就像是已有应用程序接口的用户,所以其它API在移植中会碰到的问题领域特定语言也会有。当然,我相信演进式设计是最适合领域特定语言发展的。

\

总体来说,我不认为领域特定语言会对项目中各个角色有很大的影响。领域特定语言更多的只是一种帮助不同角色之间进行更深入和更精确沟通的工具。

\

InfoQ:面对某个领域的多种变化,我们应该怎样利用领域特定语言,比方说在开发某个产品线的时候?

\

MF:和其它许多事情一样,我不认为领域特定语言的代码和其它代码有多大的区别。领域特定语言能够表达人们更深层次的思想是因为,和普通的命令-查询式API相比,领域特定语言以一种更加自然的方式表述领域内的不同变化。

\

InfoQ:领域特定语言看起来很擅长解决某个系统内的子域问题,比如说系统配置管理。项目组该如何在创造一种能够覆盖多个领域的复杂庞大的领域特定语言和多个小领域特定语言之间做出取舍?

\

RJP:领域特定语言的目的是增进理解。通常来说使用过多的领域特定语言可能会阻碍沟通和理解,不过如果每一种领域特定语言都能够非常精确地描述其问题域,使用它们并不会比了解各个问题域更困难。

\

MF:我们其实非常鼓励使用许多小的领域特定语言。比方说你不会试图去扩展正则表达式来设计HTML页面,也不会用CSS来进行文本匹配。对我们来说,让领域特定语言与众不同的正是其有限表达这一特性。

\

InfoQ: 在书中你们专门用一章描述了语言工作台,其中你们提到当前大多数集成开发环境都还不成熟。那么语言工作台到底是什么样子的,它能替代ANTLR或者编译器生成程序(compiler-generators)吗?你们对MPS(Meta Programming System)这类工具的看法如何?

\

MF:我们一直关注着语言工作台的发展。过去几年间,很多大学一直在这一领域进行国际化的合作研究。这种工具的发展远景很诱人,对开发者来说这种工具将会带来很大的变化,不过目前为止这些工具还不够成熟。简单工具的优点是,它们都基于许多已经被普遍接受的技术之上。不过这种情况会随着语言工作台的快速成熟而改变。

\

InfoQ:一些组织和项目不接受领域特定语言的主要原因是什么?是因为复杂性,还是因为缺乏对问题域和解决方案域的了解?

\

RJP:除了新的工具和开发流程这些问题,使用领域特定语言还需要用新的思维方式思考问题。关于哪些是构成好的领域特定语言设计的因素,还有待于我们去逐步发掘。当然也少不了“我们很久以前就听说过”的关于业务可读/可写程序的观点以及它所引发的怀疑。

\

InfoQ:这本书的封面是一座很漂亮的小桥。为什么会选择这幅照片作为本书的封面呢?

\

MF:当我开始写签名系列时,就决定用桥梁做为封面的主题,这是因为我的太太是一位桥梁工程师。这张照片里的桥很有历史意义,因为它是世界上第一座完全用钢铁建造的桥梁。而且它离我长大的地方不远,所以很早我就基本确定用它作为我下一本书的封面了。

\

查看英文原文: Book on Leveraging Domain-Specific Languages by Martin Fowler with Rebecca Parsons

\

感谢侯伯薇对本文的审校。

\

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家加入到InfoQ中文站用户讨论组中与我们的编辑和其他读者朋友交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本火锅店点餐系统采用Java语言和Vue技术,框架采用SSM,搭配Mysql数据库,运行在Idea里,采用小程序模式。本火锅店点餐系统提供管理员、用户两种角色的服务。总的功能包括菜品的查询、菜品的购买、餐桌预定和订单管理。本系统可以帮助管理员更新菜品信息和管理订单信息,帮助用户实现在线的点餐方式,并可以实现餐桌预定。本系统采用成熟技术开发可以完成点餐管理的相关工作。 本系统的功能围绕用户、管理员两种权限设计。根据不同权限的不同需求设计出更符合用户要求的功能。本系统中管理员主要负责审核管理用户,发布分享新的菜品,审核用户的订餐信息和餐桌预定信息等,用户可以对需要的菜品进行购买、预定餐桌等。用户可以管理个人资料、查询菜品、在线点餐和预定餐桌、管理订单等,用户的个人资料是由管理员添加用户资料时产生,用户的订单内容由用户在购买菜品时产生,用户预定信息由用户在预定餐桌操作时产生。 本系统的功能设计为管理员、用户两部分。管理员为菜品管理、菜品分类管理、用户管理、订单管理等,用户的功能为查询菜品,在线点餐、预定餐桌、管理个人信息等。 管理员负责用户信息的删除和管理,用户的姓名和手机号都可以由管理员在此功能里看到。管理员可以对菜品的信息进行管理、审核。本功能可以实现菜品的定时更新和审核管理。本功能包括查询餐桌,也可以发布新的餐桌信息。管理员可以查询已预定的餐桌,并进行审核。管理员可以管理公告和系统的轮播图,可以安排活动。管理员可以对个人的资料进行修改和管理,管理员还可以在本功能里修改密码。管理员可以查询用户的订单,并完成菜品的安排。 当用户登录进系统后可以修改自己的资料,可以使自己信息的保持正确性。还可以修改密码。用户可以浏览所有的菜品,可以查看详细的菜品内容,也可以进行菜品的点餐。在本功能里用户可以进行点餐。用户可以浏览没有预定出去的餐桌,选择合适的餐桌可以进行预定。用户可以管理购物车里的菜品。用户可以管理自己的订单,在订单管理界面里也可以进行查询操作。
### 回答1: Martin Fowler是一位资深的软件工程师和重构领域的权威,他是《重构:改善既有代码的设计》的作者。他的这本书是现代软件开发中关于重构的经典之作,演示了如何通过重构提高代码质量和可维护性。 针对Martin Fowler重构的epub版本,我认为由于电子书可以方便地进行修改和更新,可以通过重构来改进书籍的质量和阅读体验。具体来说,以下是一些可能的重构方法和目标: 1. 改善代码结构:通过调整章节和段落的顺序,优化内容的逻辑结构,使读者能更容易地理解和消化书中的知识。 2. 优化代码风格:检查并统一使用一致的格式和命名规范,使整个电子书的风格统一、易读。 3. 提升可维护性:识别和重构书中重复的内容或主题,并将其合并或抽取为可重复使用的模块,以减少冗余并改进维护效率。 4. 增加交互性:通过添加链接、图表、代码片段等元素,提供更多参考和实例,使读者能更直观地理解和应用重构技巧。 5. 修复错误和不精确的描述:通过修复错误和澄清模糊的描述,提升书籍的准确性和可靠性。 总之,将Martin Fowler的重构书籍转换为epub格式并进行重构有助于改进读者的阅读体验,并使书籍更加易读、易懂和易用。重构不仅仅是应用于代码,它也适用于提升文档和书籍的质量,使其能够更好地满足读者的需求。 ### 回答2: Martin Fowler是软件开发领域的知名专家,他对重构方法论的贡献得到了广泛的认可和赞赏。他的著作《重构——改善既有代码的设计》是软件开发领域得一本经典之作,是指导开发人员如何改进既有代码质量的重要参考资料。今年,Martin Fowler将他的《重构》一书发布为epub格式,这将为读者提供更方便的阅读方式,并且可以在不同的电子阅读设备上进行阅读。 这本epub版的《重构》将保留原书中的核心理论和实践原则,同时结合电子书的优势,添加了更好的排版和导航功能。读者在使用电子阅读设备阅读时,可以根据自己的喜好调整字体大小和样式,从而提升阅读的舒适度。此外,epub版还可以自动调整页面布局,适应不同尺寸的屏幕,使得阅读体验更加便捷。 另外,这个epub版的《重构》还将添加更多的交互和导航功能。比如,读者可以通过目录快速跳转到感兴趣的章节或小节,也可以在书中进行全文搜索,方便查找相关内容。书中还将包含丰富的示例和案例,以帮助读者更好地理解重构的概念和应用。 总之,Martin Fowler发布的epub版《重构》将为读者提供更加便利和丰富的阅读体验。不仅可以随时随地地进行阅读,同时还可以利用其交互和导航功能更好地学习和实践重构方法。无论是软件开发人员还是对软件设计感兴趣的读者,这本epub版的《重构》都将成为他们不可或缺的学习资料。 ### 回答3: 马丁·福勒(Martin Fowler)是一位知名的软件开发专家和架构师,他是《重构》这本经典著作的作者之一。他在书中详细介绍了软件开发中的重构概念和技术,并为开发人员提供了一套实用的方法和技巧,使得他们能够改善现有代码的质量和可维护性。 重构是指在不改变现有功能的情况下,通过修改代码的内部结构和设计来提高代码的质量和可读性。福勒提出了一系列的重构方法,包括提取方法、内联方法、重命名变量等等。他强调通过频繁的重构来保持代码的整洁和可维护性,从而降低开发过程中的风险和成本。这些重构方法在业界得到广泛的应用,并被视为提高代码质量的重要工具。 福勒选择将《重构》这本书制作成EPUB格式,使得读者可以在电子设备上方便地阅读。EPUB是一种常见的电子出版格式,可以自适应不同设备的屏幕大小,并支持字体、图像和布局等多种自定义设置。这使得读者可以根据自己的喜好和需求来调整阅读体验,提高学习效果。 通过将《重构》制作成EPUB格式,福勒希望更多的开发人员和软件架构师能够方便地获取这本信息丰富的书籍。EPUB格式的优点在于其便携性和可定制性,读者可以随时随地地学习和实践重构技术。这对于推动软件行业的技术进步和质量提升有着积极的影响。 总的来说,福勒将《重构》制作成EPUB格式是为了更好地传播重构的理念和方法。这种格式的选择使得读者能够更便捷地学习和应用重构技术,提高软件开发的效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值