我们(此处指的是Braintree)为用户提供5种语言的客户端库:Ruby,Python,PHP,C#和Java。每一个库都是帮助我们的客户构建请求,分析响应以及从网关中获取数据,我们希望他们可以简单和直觉化的集成Braintree。
维护5种客户端库意味着编写在5种语言中编写本质上一样的功能。许多情况下也就是语法不同而已,但是,一些特征足够复杂保证每个库有些轻微不同。
一个例子是交易查询,由于查询有些复杂,我们决定为每个库创建领域特定语言(DSL)
问题
我们希望交易查询可以很简单的读以及运行足够复杂的查询,特别希望能够同时查询3中不同类型域:
文本域:查询精确匹配,没有匹配,以及起始字符串,结尾字符串和子串
多个值域:用指定值查询并反悔所有匹配记录
范围域:用低边界和高边界查询(包含所有)
一个所有匹配条件的资源将返回
查询条件例子
下面的代码例子假定用户想要用下面的条件查询交易:
order id 以 "a2d"开始
客户站点以".com"结尾
账单第一个名字为"John"
状态可能为Authorized或Settled
金额在10到20美元之间
Ruby
策略
在ruby,search方法在block中生成一个搜索对象,该对象包含了必要的方法构建查询条件。block将执行时request被构建,然后返回结构。Ruby重载了查询域中的文本与范围==,!=,>=和<=操作方法