小课堂week19 编程范式巡礼最终季 超级范式

编程范式巡礼(最终季)--超级范式

本周是编程范式系列的最后一次分享,让咱们拉长视角,看向远方,进入"元编程"的领域,在《冒号课堂》中起了个很酷的名字:"超级范式"。html

从通用语言到领域语言

先给你们作一个小练习:java

如下哪些属于编程语言:
A.Java B.Html C.Spring Bean Definition D.Comment正则表达式

答案是ABC,从中,咱们能够感觉到编程语言的一些特性:编程

  • 必需:有语法结构、可运行
  • 可选:可编译、可调试、可扩展
    相似人类语言,做为与计算机的惟一沟通渠道,编程语言的发展也是多种多样的。

多样性体如今哪里呢?能够是解决的问题不一样,能够是运行的环境不一样,也能够是用户群不一样等。
咱们能够用一个词来归纳这种不一样,就是"领域(Domain)"。而仅服务于某一领域的语言,称为"领域语言(DSL)"。dom

领域语言示例

上面提到的html、Spring Bean Definition以及SQL都是领域语言,这里列几个更有趣的。jvm

Gradle是一个灵活的通用构建工具,让java项目在构建上有了跨越性发展。能够看到采用领域语言后,自有度有明显的提升,开发人员也更容易进行扩展。编程语言

println 'This is executed during the configuration phase.'
task configured {
    println 'This is also executed during the configuration phase.'
}
task testBoth {
    doFirst {
      println 'This is executed first during the execution phase.'
    }
    println 'This is executed during the configuration phase as well.'
}

Cucumber是一个可以理解用普通语言描述的自动化测试工具,在普通测试工具可运行可跟踪的基础上,案例可读性的大大提高了。工具

功能: 用户登陆  
      为了可以浏览网站只对在线会员可见的那些内容  
      做为一名访客  
      我但愿可以登陆  
       
      场景: 用户登陆功能  
         假如 没有<somebody@somedomain.com>这个用户  
         当 我以<somebody@somedomain.com/password>这个身份登陆  
         那么 我应该看到<用户名或密码错误>的提示信息  
         并且 我应该还没有登陆

在领域语言的帮助下,编程语言在"人性化"的方向上迈进了一步。学习

从领域语言到元编程

前面介绍了领域语言的概念,咱们一般会将其列到"工具"的范畴。如何成为一个范式,就要引入"超级范式"元编程了。测试

元编程是编写、操纵程序的程序。在传统编程中,运算是动态的,但程序自己是静态的;在元编程中,两者都是动态的。

下面举个处理客户交易单的例子,采用通用语言Scala实现以下。

val t1 = FixedIncomeTradeImpl {
    tradeingAccount = NOMURA,
    instrument = IBM,
    currency = USD,
    market = NYSE,
    quantity = 100,
    unitPrice = 42
}

若是咱们站在编程外行的角度看,这段代码是存在很多问题的。

  1. 等号的做用与常识不符,通常理解为比较,这里是赋值
  2. 有很是多使人费解的符号,好比{}
  3. 没有表达出输入间的关联,好比USD应该是用来描述unitPrice的。

下面使用领域语言进行优化,更加符合天然语言的表达。

val equityTrade = 
    100 discount_bonds IBM
        for_client NOMURA on NYSE at 42.ccy(USD)

具体实现上,采用了Scala的"隐式转换"特性,这是一种元编程的方法。

object TradeImplicits {
  class InstrumentHelper(qty: Quantity) {
    def discount_bonds(db: DiscountBond) = (db, qty)
    def equities(eq: Equity) = (eq, qty)
  }
}

目前来看,元编程仍是比较依赖于语言层面的支持,以Ruby、Groovy为表明的动态语言支持最佳,Scala提供了部分支持。可是从整体看,更为主流的Java语言还没有提供支持。比较可行方法是采用Scala、Groovy等jvm语言,嵌入Java代码中进行实现。

小结

元编程从实现复杂看并不亚于通用语言,篇幅有限没法深刻,对细节感兴趣建议你们阅读《领域专用语言实战》。
最后,想用Martin Fowler的一段访谈来小结下。原文地址

InfoQ:面对某个领域的多种变化,咱们应该怎样利用领域特定语言,比方说在开发某个产品线的时候?
MF:和其它许多事情同样,我不认为领域特定语言的代码和其它代码有多大的区别。领域特定语言可以表达人们更深层次的思想是由于,和普通的命令-查询式API相比,领域特定语言以一种更加天然的方式表述领域内的不一样变化。

领域语言的价值在于更加"人性",更易于使用。其出发点是一种"减法思惟",经过限定外部使用范围而得到了更好的内在价值。

InfoQ:领域特定语言看起来很擅长解决某个系统内的子域问题,好比说系统配置管理。项目组该如何在创造一种可以覆盖多个领域的复杂庞大的领域特定语言和多个小领域特定语言之间作出取舍?
MF:咱们其实很是鼓励使用许多小的领域特定语言。比方说你不会试图去扩展正则表达式来设计HTML页面,也不会用CSS来进行文本匹配。对咱们来讲,让领域特定语言不同凡响的正是其有限表达这一特性。

在使用上,领域语言之间能够互相组合,和而不一样,目标是发挥1+1>2的效果。

InfoQ:一些组织和项目不接受领域特定语言的主要缘由是什么?是由于复杂性,仍是由于缺少对问题域和解决方案域的了解?
RJP:除了新的工具和开发流程这些问题,使用领域特定语言还须要用新的思惟方式思考问题。关于哪些是构成好的领域特定语言设计的因素,还有待于咱们去逐步发掘。固然也少不了“咱们好久之前就据说过”的关于业务可读/可写程序的观点以及它所引起的怀疑。

我最先接触领域语言概念,是在学习Ruby语言的过程当中,当时的感觉彻底是颠覆式。因为涉及到思惟方式的转换,也是限制领域语言发展的一个重要因素。目前,领域语言并未成为业界的主流解决方案,但其思考之深入、思路之精妙让人很是惊艳,码农们若是但愿开拓视野、提高自我,强烈建议学习。

相关文章
相关标签/搜索