写点什么

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

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

关注

评论

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

如何绘制族谱?这款Mac家谱软件MacFamilyTree可以轻松帮你绘制百年家族谱!

Rose

Bartender 4:图标显示切换大变样,还能在菜单栏自定义文字

Rose

再谈十二要素方法论

俞凡

架构 最佳实践 云原生

数据为王:人工智能如何引领软件开发新时代

天津汇柏科技有限公司

人工智能 软件开发

地平线双目深度估计参考算法 StereoNetPlus 优化思路解读

地平线开发者

自动驾驶; 算法、

Mac窗口管理软件合集|告别混乱屏幕,一切井井有条。

Rose

几大远程软件怎么选?为何我推荐使用向日葵?

科技热闻

传统IT设备包括哪些?堡垒机可以全部管理吗?

行云管家

网络安全 堡垒机

万字长文解读生成式AI参考架构

俞凡

人工智能

通过 Pollyoyo 快速绘制图表:高效使用 PlantUML 的最佳选择

Byte

百度智能云新一代云原生产品加速 AI 原生应用落地

Baidu AICLOUD

云原生 AI 原生

苹果Mac电脑想要实现双系统运行,Parallels Desktop虚拟机来帮你!

Rose

如何实现低成本降噪?风扇噪声流体仿真解决方案

Altair RapidMiner

设计 仿真 噪音数据 altair

眉山等保测评机构有哪些?在哪里?

行云管家

等保 眉山

photoshop 运行弹窗This non-genuine Adobe app has been disabled

Rose

1688跨境代采业务用的接口大全

tbapi

1688代采系统 1688代采 1688代采接口

Flink 批作业如何在 Master 节点出错重启后恢复执行进度?

Apache Flink

大数据 flink

Ulysses教程_让Ulysses更便捷的使用技巧

Rose

轻松构建游戏登录能力,打造玩家流畅体验

HarmonyOS SDK

勇气:雷军2024年度演讲

老张

自由职业 不忘初心 勇气

软件测试学习笔记丨Linux三剑客-grep

测试人

软件测试

如何检查Mac上是否启用了SIP系统完整性保护

Rose

Photoshop2021中文版 附ps2021破解补丁 及一键替换天空使用教程

Rose

JProfiler for Mac(Java开发分析软件)v14.0.0永久激活版

Rose

Sitting Ducks攻击导致每日百万域名遭劫持!

国科云

Autodesk Maya 2025 for mac完美破资源 玛雅2025下载 兼容M及Intel芯片

Rose

autocad2021 mac破解版安装教程-AutoCAD 2021mac版自带中文

Rose

HyperMesh施加正弦荷载

智造软件

网格 载荷 Hypermesh

Kimi 探索版发布,搜索量增强 10 倍;北大&快手开源 Pyramid Flow Matching 丨 RTE 开发者日报

声网

亚马逊云科技助力贵州省铜仁市石阡县免费乳腺癌筛查活动

财见

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