写点什么

扩展方法、DSL 和连贯接口

  • 2007-12-01
  • 本文字数:1108 字

    阅读完需:约 4 分钟

内在 DSL(Internal DSL)和 API 的区别是什么?Martin Fowler 在 2004 年 2 月这样描述内在 DSL

Lisp 和 Smalltalk 社区有使用 DSL 的深厚传统,但现在他们也倾向于走其他路线。他们现在不主张定义新语言,而是把通用语言变形成 DSL。(Paul Graham 在《Programming Bottom-Up》中也描述了这种方法。)内在 DSL(也被称为嵌入 DSL)使用编程语言本身就具备的概念作为材料来定义出 DSL。这是一种在任何语言都可行的常用方式,我一直在考虑把定义函数当作是在为手中的问题提供一种 DSL,以这样的心态来定义函数。而 Lisp 爱好者们和 Smalltalk 爱好者们在这方面走得更远。描述这种 API 书写风格的另一个术语是连贯接口。

2 年半后,他说道,

对于内在 DSL 来说,API 和 DSL 之间的界线很模糊。本质来说,它们没有区别,内部 DSL 只不过是给 API 换了个漂亮的名字(正如 Bell 实验室有句老话说道的:“函数库设计就是语言设计”)。尽管这样,我觉得当你使用一个书写成 DSL 风格的 API 时,还是有点不同的感觉的。类似连贯接口这样的东西能让 API 有着完全不同的使用体验。换到 DSL 的语境中去思考,会让你思考不同方式编写出的代码的可读性,发掘宿主语言的语法去创造一些自己特别的东西出来——rake 是一个很好的这样的例子。

那么内在 DSL 到底看起来像什么?大抵的答案可以用一个连贯编程的例子来说明。在连贯编程中,所有的方法都返回同一个对象或一个新对象。这让方法调用能串在一起。

下面这个例子是我们从 Neal Ford 的 QCon 演讲《在静态语言和动态语言中构建 DSL 》中节录的。

def c = 2.days.fromToday.at(4.pm)

直到最近,要对整数这样的类进行特殊处理都需要类似 Ruby 或 Python 这样的动态语言来支持,尤其因为它们提供了一种称为“开放类”的东西。开放类允许在运行的时候添加新方法到类上。

那么这些跟使用 C#或 VB 的.NET 的开发人员有什么关系呢?这么说吧,C# 3 和 VB 9 都支持了名为扩展方法的东西。扩展方法允许用户静态地添加方法到已经存在的类中。你可以为一个整数创建一个“日子”方法来返回一个 TimeSpan 对象。

请注意 C# 2.0 和 C# 3.0 写法上的区别。

//C# 2.0

date d = Helper.At(Helper.FromToday(Helper.Days(2)), Helper.Pm(4));//C# 3.0date d = 2.Days().FromToday().At(4.Pm);

请注意,这两行代码实际上都编译成了相同的中间代码。所有繁重的活计都被编译器和 Extension 属性做完了。

最后是使用扩展方法的一个技巧。虽然官方只支持.NET 3.5,但 Jared Parsons 发现了一种在.NET 2.0 中使用扩展方法 的办法。基本原理就是创建一个“ExtensionAttribute”类的仿造品,让新编译器以为是真正的。

查看英文原文: Extension Methods, DSLs, and Fluent Interface

2007-12-01 22:561281
用户头像

发布了 254 篇内容, 共 62.2 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

Vim小技巧(2)

老壳有点爽

vim Linux 脚本语言

看门狗 | 分布式锁架构设计方案-01

九叔(高翔龙)

redis 分布式锁 RedLock WatchDog

成都信息工程大学的区块链工程成全国首个区块链工程本科专业

CECBC

区块链技术 区块链工程

商业计划书制作(1):商业计划书的信息需求

老壳有点爽

创业 商业计划书 信息需求

区块链之物流产业上链解决痛点

CECBC

区块链 供应链

最初芯片国产化是怎么来的?

老壳有点爽

芯片 集成电路 国产化 替代

半导体行业个人理解

老壳有点爽

芯片 半导体 集成电路 IC

物理实现(Physical Implementation)

老壳有点爽

芯片 集成电路 IC 物理设计 PI

Python 核心技术与实践 input&output

Bonaparte

集成电路设计概括

老壳有点爽

芯片 集成电路 IC

世界集成电路发展概况

老壳有点爽

芯片 集成电路 IC 芯片营销

数字后端工程师发展六阶段

老壳有点爽

芯片 集成电路 IC 数字电路工程师

模拟电路设计工程师发展九段

老壳有点爽

集成电路 IC 芯片设计 模拟电路

sed语言学习技巧(1)

老壳有点爽

vim 编程语言 sed 脚本语言

Linux指令简述&vim引入(1)

老壳有点爽

vim Linux 脚本

PySpark RDD 基础运算和操作总结

是老郭啊

spark pyspark RDD

2020深圳站-GIAC全球互联网架构大会PPT分享

九叔(高翔龙)

架构 分布式系统 服务治理 大型网站演变 全链路压测

强势入局,区块链专利将成为银行下一个战场?

CECBC

区块链 金融 银行

数字电路后端设计流程

老壳有点爽

设计 flow 集成电路 IC

芯片行业的主要生意模式

老壳有点爽

芯片 集成电路 IC

Verilog 的debug技巧(1)

老壳有点爽

芯片 集成电路 IC Verilog 电路

看门狗 | 分布式锁架构设计方案-02

九叔(高翔龙)

redis 分布式锁 Jedis RedLock

MySQL备份与恢复场景示例

Simon

MySQL

Golang领域模型-六边形架构

奔奔奔跑

微服务 领域驱动设计 架构设计 Go 语言

集成电路工艺基础介绍

老壳有点爽

芯片 集成电路 IC 工艺 制程

魅力非凡的半导体电路行业

老壳有点爽

芯片 集成电路 IC 芯片营销

sed 语言学习技巧(2)

老壳有点爽

vim sed 脚本语言

IC设计流程及工具

老壳有点爽

芯片 集成电路 IC IC设计流程及工具

MySQL DDL详情揭露

Simon

MySQL

芯片行业基本生态:设计生产封装的行业分工

老壳有点爽

芯片 集成电路 IC

中国大陆芯片行业发展概况

老壳有点爽

芯片 集成电路 IC

扩展方法、DSL和连贯接口_.NET_Jonathan Allen_InfoQ精选文章