写点什么

扩展方法、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:561358
用户头像

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

关注

评论

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

从ChatGPT到AGI还有多远?| 社区征文

轻口味

ChatGPT

【深度挖掘RocketMQ底层源码】「底层系列」深度挖掘RocketMQ底层导致消息丢失透析(Broker Busy和ToManyRequest)

码界西柚

源码分析 RocketMQ 消息队列 消息队列架构 3月日更

在 Linux 上有哪些运行程序的方式?

蓬蒿

Shell fork Linux 上启动程序 execv

想要快速学会Blender雕刻?这些Blender雕刻技巧不要错过

Finovy Cloud

加速数据要素价值释放,用友打造高性能时序数据库

科技热闻

KaiwuDB 时序引擎数据存储内存对齐技术解读

KaiwuDB

时序数据库 KaiwuDB 内容对齐

GridView(网格视图)的基本使用

芯动大师

ListView Android; girdview

OpenAI-J 如何进行测试

HoneyMoose

理解浏览器cookie

hasWhere

金融行业数据分类分级“五步走”|盾见

极盾科技

数据安全

国内功率半导体需求持续快速增长,华秋携手合科泰促发展

华秋电子

荣誉|百度获信通院“数据安全共同体计划”多项荣誉表彰

百度安全

如何在同步的 Rust 方法中调用异步代码 | Tokio 使用中的几点教训

Greptime 格睿科技

rust runtime tokio

深入理解CSS Grid网页布局,并通过示例代码来演示如何使用它

兴科Sinco

前端 前端开发 网页布局 CSS Grid 网络相册

铜面上覆盖一层阻焊的油墨,你知道吗?华秋一文告诉你

华秋电子

清华AIR与英特尔开展合作,研发全新绿色数据中心解决方案

科技之家

应该升级 JDK 到 17 了吗

HoneyMoose

普通大专生,从面试无人问到拿下阿里offer!说说我的艰辛历程

Java 面试 专科

ChatGPT 为什么在一夜之间火了? | 社区征文

叶秋学长

openai ChatGPT 人工智能ChatGPT 吗?

奇点云DataSimba发版全解析:“企业级”版本升级,提供最佳组合

奇点云

数据中台 奇点云 数据云平台

Okhttp 的 retrofit2 运行警告信息异常

HoneyMoose

IBM Semeru Windows 下的安装 JDK 17

HoneyMoose

Amazon GuardDuty 的新增功能 – Amazon EBS 卷的恶意软件检测

亚马逊云科技 (Amazon Web Services)

Matlab常用图像处理命令108例(一)

timerring

图像处理 数字图像处理

燃!网易架构大牛熬夜手敲千页网络协议笔记,竟在GitHub标星数万

Java 计算机网络 网络协议

表格检测识别技术的发展历程

合合技术团队

人工智能 算法 表格识别

看完这一篇,ShardingSphere-jdbc 实战再也不怕了

勇哥java实战分享

字节一面:“为什么网络要分层?每一层的职责、包含哪些协议?”

Java 计算机网络 网络协议

程序员养发神器:拒绝加班熬夜,告别秃头!

引迈信息

json 程序员 前端 HTTP java

图数据结构-路径查找

alexgaoyh

DFS 图数据库 知识图谱 路径规划 三元组

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