阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

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

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

关注

评论

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

React 实现 PDF 文件在线预览 - 手把手教你写 React PDF 预览功能

蒋川

JavaScript react.js 低代码 CRM pdf预览

11年程序员给本科、研究生应届生以及准备从事后台开发同学的建议,学习进阶之路

C++后台开发

后台开发 社招 应届生 Linux服务器开发 校招

精彩回顾|KubeCon EU 2022 Kubernetes Batch + HPC 专题日

Daocloud 道客

Kubernetes 云原生 HPC batch

直播回顾|携手 Opentelemetry 中国社区,走进可观测性

Daocloud 道客

云原生 可观测性

什么是时序数据库

领创集团Advance Intelligence Group

优秀标杆!华泰证券多芯协同云网管理平台

BoCloud博云

多云管理平台 多云管理

架构实战营 - 第 6 期 模块七课后作业

乐邦

「架构实战营」

自动驾驶等级家喻户晓,小微企业宽带等级你知道吗?

脑极体

面向高校 | “云原生技术应用与实践”示范课程项目开放申报

阿里巴巴云原生

阿里云 云原生 云原生课程

揭秘华为云GaussDB(for Influx)最佳实践:hint查询

华为云开发者联盟

数据库 倒排索引 GaussDB(for Influx) hint 单时间线

UniqueMergeTree:支持实时更新删除的ClickHouse表引擎

字节跳动数据平台

Clickhouse 表引擎 实时

PostgreSQL 15 新特性解读 | 墨天轮优质文章合集

墨天轮

数据库 sql postgresql 新特性

ZooKeeper 在阿里巴巴的服务形态演进

阿里巴巴云原生

Apache zookeeper 阿里云 开源 云原生

对象存储 S3 在分布式文件系统中的应用

焱融科技

对象存储 存储 分布式存储 云存储

大咖说·图书分享|阿里官方为你分享内部测试之道

大咖说

阿里巴巴 测试 开发

MSVC编译静态库

Loken

5月月更

【直播预告】研发效率百倍提升的秘密,这些破圈思路了解一下!

FinClip

小程序 finclip 直播预告

易周金融分析 |“一参一控一牌”落地;两家支付机构更名

易观分析

金融 银行

VPN的应用场景

源字节1号

小程序开发

MSVC编译多个C程序文件

Loken

音视频 5月月更

硬之城获阿里云首批产品生态集成认证,携手阿里云共建新合作

阿里巴巴云原生

阿里云 云原生 合作伙伴 合作

企评家,企业成长性评价系统怎么用?

企评家

企业成长性分析 企评家 企业投资价值评价

Vue进阶(贰零捌):ES6 对象解构

No Silver Bullet

ES6 5月月更 对象解构

书单 | 5月,这10本上榜新书带你打开新世界的大门!

博文视点Broadview

「开源人的福音」一键部署Java构件到Sonatype

Jianmu

后端 持续集成 开源项目 部署 Java构件

Spring之 @Component和@ComponentScan注解用法介绍和注意事项

echoes

实验室信息管理系统如何工作?

低代码小观

低代码 实验室管理系统 企业管理系统 LIMS实验室信息管理系统 企业管理软件

基于边缘计算的云游戏场景实践

火山引擎边缘云

最佳实践 边缘计算 实时音视频 云游戏

Kubernetes下Stdout日志白名单最佳实践

观测云

可观测性 可观测

直击中小企业转型通用痛点 联想百应推出智能会议解决方案

Geek_2d6073

一份优秀的产品帮助文档怎么写?

小炮

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