文章目录

  • 五种语言的DSL
  • 问题
    • 实例搜索准则
  • RUBY
    • 策略
    • 例子
    • 优势
  • python
    • 战略
    • 例子
    • 优势
    • 弱点
  • PHP
    • 战略
  • C#
  • java
  • 总结

英文原文见: https://blog.csdn.net/matlab2000/article/details/6006676

五种语言的DSL

我们为客户提供5种编程语言的客户库:Ruby、Python、PHP、Cype和Java。每个库都是用来帮助我们的客户提出请求、解析响应和从网关检索数据的。我们希望他们与Braintree进行简单、直观的整合。
维护5个客户端库意味着用5种语言编写基本相同的功能。在很多情况下,这仅仅意味着句法上的差异。然而,有些特性非常复杂,因此每个库中都应该使用稍微不同的方法。
一个例子是事务搜索。因为搜索可能有点复杂,所以我们决定在五个库中的每个库中创建一个领域特定语言(DSL)。

问题

我们希望事务搜索既容易阅读,又足够深以执行复杂的查询。具体地说,我们希望允许搜索3种不同类型的字段:

  • 文本字段(Text fields) — 查询精确匹配、不匹配、字符串开头、字符串结束和子字符串
  • 多个值字段(Multiple value fields) — 使用一组预定义值进行查询,并将返回匹配任何给定值的所有记录
  • 范围字段(Range fields)— 使用下限、上限或两者查询(都包含)
    将返回与所有标准匹配的资源集合。

实例搜索准则

下面的代码示例假设用户希望搜索满足以下条件的事务:

  • 订单ID以“A2D”开头
  • 客户网站以“.com”结尾
  • 计费第一名等于“约翰”
  • 身份被授权或解决
  • 金额在10到20美元之间

RUBY

策略

在Ruby中,搜索方法生成一个搜索对象到一个块。此对象包含构建搜索条件所需的方法。然后执行块,并根据结果生成请求。Ruby还重载了==,!=、>=和<=文本和范围搜索字段上的运算符。我们认为这可以提高可读性并减少语法噪声。

例子

collection = Braintree::Transaction.search do |search|search.order_id.starts_with "a2d"search.customer_website.ends_with ".com"search.billing_first_name == "John"search.status.in(Braintree::Transaction::Status::Authorized,Braintree::Transaction::Status::Settled)search.amount.between "10.00", "20.00"
endcollection.each do |transaction|puts transaction.id
end

优势

  • 方法调用中不需要括号,这样可以创建更可读的语法
  • 创建请求和执行搜索的单个步骤
  • 运算符重载提高了可读性

python

战略

我们的Python解决方案使用了不同的方法,因为该语言缺少块语法和多行lambda。搜索方法需要一个表示搜索条件的对象列表。这些对象中的每一个都是使用可读的方法名内联构建的。然后,搜索方法可以迭代所提供的对象以构建搜索请求。
和Ruby一样,这个实现重载操作符==,!=、>和<用于文本和范围字段上的操作。

例子

collection = Transaction.search([TransactionSearch.order_id.starts_with("a2d"),TransactionSearch.customer_website.ends_with(".com"),TransactionSearch.billing_first_name == "John",TransactionSearch.status.in_list([Transaction.Status.Authorized,Transaction.Status.Settled]),TransactionSearch.amount.between("10.00", "20.00")
])for transaction in collection.items:print transaction.id

优势

  • 创建请求和执行搜索的单个步骤
  • 易于动态创建条件
  • 运算符重载提高了可读性

弱点

  • 重复TransactionSearch类名
  • 文本列表作为参数

PHP

战略

PHP实现与上面描述的Python解决方案类似,但感觉不太可读。同样,search方法需要一个搜索条件对象的列表,并且这些对象是在方法调用期间以内联方式创建的。但是,类方法调用的::语法以及->operator-for-instance方法调用会使代码变得更加嘈杂。

(以下暂略)

C#

暂略

java

暂略

总结

一般来说,DSL实现有3种类型:Fluent接口、可读的内联方法参数和块。我们发现流畅的接口是静态语言最有效的方法。对于Python和PHP,可读的内联方法参数似乎是最惯用的。Ruby社区倾向于使用基于块的DSL,我们为Ruby实现选择了这种方法。
在5种不同的语言中解决相同的问题是一个非常宝贵的经验。虽然结果非常不同,但我们认为每个解决方案都是健壮的和可读的。更重要的是,用这些语言工作有助于我们从相对公正的角度了解每种语言的优缺点。
如果你是一个使用这些语言的开发人员,我们很乐意听到你的反馈。你将如何用你选择的语言处理这个问题?

翻译:A DSL in 5 Languages(五种语言的DSL)相关推荐

  1. python语言的实验心得体会_爱的五种语言——“好妈妈”培训班家教情商课课堂纪实!...

    12月26日晚,荷地镇"七群体七服务"专题培训暨首届"好妈妈"培训班第五节课开课.讲师团成员.东坪村村委会副主任吴丽云以<爱的五种语言>为题为培训班 ...

  2. 爱的五种语言:创造完美的两性沟通

    不管什么时候,只要我们一上网,信息流就会奔涌而来,这不仅会给我们的记忆带来过重的负荷,而且还会导致大脑颞叶难以聚精会神地关注任何一件事.--尼古拉斯·卡尔 夫妻是永世情缘,理应好好相爱,共渡一生. 父 ...

  3. 各取所需:Microsoft Windows XP with sp3 十五种语言的MSDN原版光盘镜像

    各取所需:Microsoft Windows XP with sp3 十五种语言的MSDN原版光盘镜像 2008年09月29日 星期一 10:30 这篇文章,是有关Windows XP下载的" ...

  4. 这本C语言入门书被翻译成五种语言出版,如今迎来了中文版第17版

    学习任何程序设计语言的最佳方法都是创建良好的程序,C 语言也不例外.一旦决定编写程序我们就会发现,总是有至少两种方法可以实现.那么,如何才能找到最好的方法来实现程序? <C语言程序设计>就 ...

  5. 爱的五种语言 (摘)

    1.神魂颠倒的描述以及麻烦 如果人随时都在神魂颠倒的状况下,一定会出大麻烦.那电击的余波,会搅乱商业.工业.教会.教育.和社会的其它部分.为什么?因为在「恋爱」中的人,会失去对其它事物的兴趣:这种现象 ...

  6. 【MYSQL】五种语言分类

    文章目录 一.DDL(Data Define Language) 数据定义语言 二.DML(Data Manipulation Language) 数据操作语言 三.DQL(Data Query La ...

  7. 五种常见的计算机高级语言,[转]计算机语言的种类总结

    计算机语言的种类总结内容导读: 今天来总结一下语言的种类,语言的种类从不同的角度会有不同的划分,比如机器语言.汇编语言.高级语言.低级语言(机器语言及汇编语言).编译语言.解释型语言.脚本语言.动态语 ...

  8. 计算机控制系统编程语言,PLC的五种主要编程语言是什么?

    与一般的计算机语言相比,PLC软件的编程语言具有明显的特点. 它不同于高级语言和通用汇编语言,必须满足易于编写和调试的要求. 早期PLC仅支持梯形图编程语言和指令列表编程语言. 根据国际电工委员会的说 ...

  9. 希腊匈牙利也能畅快自由行了!搜狗旅行翻译宝新增6种语言翻译

    随着4月的到来,清明节.劳动节.端午节等一连串的法定假日即将纷纷报到,在全世界迎来出境游旺季的同时,翻译市场的需求也愈加火热.3月新上市的搜狗旅行翻译宝,也在4月3日发布了重磅更新,语音翻译新增越南语 ...

最新文章

  1. 林丹退役,用 Python 看看大家怎么说?
  2. 变革!建设行业大数据的崛起
  3. idea提交git差件_多人合作使用git,推送代码、和并分支
  4. 10个C#编程和Visual Studio使用技巧
  5. TensorFlow报错FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated......(亲测)
  6. Android属性动画
  7. 死于决斗的数学天才伽罗瓦-人生的有限域
  8. 服务器硬盘一般怎样备份,GHOST对硬盘系统分区(一般是C盘)的备份和恢复图文教程,对操作系统的备份和恢复...
  9. 佩戴十字架项链有什么特殊含义?
  10. eclipse debug 多线程
  11. 如何提高网页的加载速度 ——DNS优化和代码优化
  12. git 加速 看一下效果
  13. 海思hi3518用eclipse采用交叉编译器编译程序在海思开发板上运行
  14. 在Mifare S50中,如果第2区的访问控制码为FF 08 70 69,则该区块1和3的访问控制条件是什么
  15. 【imessage苹果推送】苹果相册共享imessgae推
  16. java微信app支付-支付结果通用通知
  17. Python 编码规范(pep8)
  18. series去重_python去重函数是什么
  19. [MATLAB]将.m文件生成dll文件
  20. python爬取新浪新闻

热门文章

  1. Linux shell sed awk
  2. mysql显示RMB符号乱码_mysql显示乱码
  3. 【Pytorch神经网络实战案例】12 利用注意力机制的神经网络实现对FashionMNIST数据集图片的分类
  4. 卷积神经网络(基础篇)
  5. 十六、MySQL流程控制结构(顺序、分支、循环)详解 强化练习
  6. 论文阅读 - Group Normalization
  7. 04.卷积神经网络 W2.深度卷积网络:实例探究
  8. LeetCode 218. 天际线问题(multiset优先队列)*
  9. LeetCode 518. 零钱兑换 II(动态规划)
  10. 如何选择数据结构和算法(转)