NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

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

关注

评论

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

上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间

Java架构师迁哥

MySQL-技术专题-主从复制原理

洛神灬殇

【人人都懂密码学】一篇最易懂的Java密码学入门教程

华为云开发者联盟

加密 密码

浅析 Golang 垃圾回收机制

郭旭东

Go 语言

《Java核心技术总结》+《面试题总结》PDF整理,阿里P8大牛熬了半个月肝出来的!

Java架构之路

Java 阿里巴巴 程序员 面试 编程语言

架构师训练营第一期-第四周课后作业

卖猪肉的大叔

极客大学架构师训练营

第四周学习代码系统架构总结

三板斧

个人精简xml,实现mybatis存取blob类型数据(Mysql)

小Q

Java MySQL 学习 面试 mybatis

拯救深度学习:标注数据不足下的深度学习方法

华为云开发者联盟

学习 AI 训练

通证、通证经济与区块链

CECBC

区块链 通证经济

你掉进过“伪敏捷”的陷阱吗?

华为云开发者联盟

项目管理 软件 敏捷

看看专科程序员与本科程序员之间,到底有什么区别?

Java架构师迁哥

Presto在滴滴的探索与实践

滴滴技术

开源 滴滴技术 滴滴开源 presto

阿里P8架构师得意弟子,应聘华为Java岗居然一面就失败了?

Java架构师迁哥

架构师训练营第一期-第四周学习总结

卖猪肉的大叔

极客大学架构师训练营

架构师训练营 1 期 - 第四周 - 系统架构

三板斧

极客大学架构师训练营

Vidyo整个产品架构是怎样的?

dwqcmo

音视频 集成架构 解决方案 智能硬件

架构师训练营第 1 期第四周总结

Leo乐

极客大学架构师训练营

本周学习总结

饺子

重磅推荐!阿里巴巴技术专家认证的Java系统性能圣经,太香了

996小迁

Java 架构 面试 Java系统性能

大型互联网应用系统的技术方案和手段

饺子

MySQL-技术专题-SQL优化系列

洛神灬殇

阿里内部绝密《百亿级并发系统设计》实战教程,冒着被劝退的风险免费分享

Java架构之路

Java 阿里巴巴 程序员 面试 编程语言

数据库技术丨GaussDB(DWS)数据同步状态查看方法

华为云开发者联盟

数据库 高可用

研发和测试在多国陆续展开 全球央行数字货币研发驶入快车道

CECBC

数字货币 金融

十二、深入Python列表和元组

刘润森

Python

Go语言小规范

小高

区块链将这样影响你的生产生活

CECBC

区块链 信息发展

《Linux学习笔记》从常用命令、常用操作到网络管理、性能优化

Java架构之路

Java Linux 程序员 面试 编程语言

上线GitHub七天后就标星87.6K的Java大牛成长宝典,啃完之后成功面进字节!

Java架构追梦

Java 学习 架构 面试 核心知识点

2020亚马逊全球Prime会员日为会员节省金额超过14亿美金

爱极客侠

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