“AI 技术+人才”如何成为企业增长新引擎?戳此了解>>> 了解详情
写点什么

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

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

关注

评论

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

高频量化合约对冲交易软件开发源代码

开发微hkkf5566

细说React组件性能优化

xiaofeng

React

解读数仓常用模糊查询的优化方法

华为云开发者联盟

数据库 后端 华为云

传统 Web 框架部署与迁移

阿里巴巴云原生

阿里云 Serverless 云原生

可防离职员工冒用身份,合合信息名片全能王与钉钉用数字名片打造安全“围栏”

合合技术团队

人工智能 大数据 钉钉 合合信息 名片

Apache EventMesh事件驱动分布式运行时

EventMesh布道师

Serverless Faas EDA workflow eventmesh

启科量子 QuSprout 或将启动开源计划

启科量子开发者官方号

人工智能 框架 算力 超算 #量子计算

李白:你的模型权重很不错,可惜被我没收了

OneFlow

人工智能 深度学习 模型

国产数据库肇始之独具特色的场景需求

亚信AntDB数据库

数据库 AntDB 国产数据库 AntDB数据库

全新的一套方法学会Spring Security究竟可以有多快?四天即可

了不起的程序猿

Java spring 程序员 架构师 框架

深度剖析React懒加载原理

xiaofeng

React

会用postman不算牛,会用Eolink才是真的牛

陈橘又青

API

Java Web(十)Filter和Listener

浅辄

javaWeb filter listener 11月月更

Prometheus 监测 RocketMQ 最佳实践

Apache RocketMQ

RocketMQ #java #运维 消息序列

龙蜥理事长马涛荣获 “2022 年度开源人物”

OpenAnolis小助手

开源 操作系统 龙蜥社区 理事长 2022云栖大会

wallys-WiFi-5-outdoor-Access-point-IPQ4019/4029-industrial wireless AP

Cindy-wallys

IPQ4019 ipq4029

大麦 Android 选座场景性能优化全解析

阿里巴巴终端技术

android 性能优化 客户端

CANN 6.0来了,硬核技术抢先看

华为云开发者联盟

人工智能 华为云 昇腾 CANN 6.0

数据中台选型必读(五):中台建设本质就是构建企业的公共数据层

雨果

数据中台

深度探讨react-hooks实现原理

xiaofeng

React

经常被问到的react-router实现原理详解

夏天的味道123

React

OpenHarmony集成OCR三方库实现文字提取

OpenHarmony开发者

OpenHarmony

软件测试丨测试大咖漫谈如何搞定软件质量?

测试人

软件测试 软件质量 自动化测试 测试开发

Java Web(十一)Ajax&Axios&JSON

浅辄

json ajax javaWeb axios 11月月更

详细解读 React useCallback & useMemo

夏天的味道123

React

5.图学习【参考资料2】-知识补充与node2vec代码注解

汀丶人工智能

图神经网络 11月月更

一汽集团数字化转型细节分析:明确如何转型事半功倍

雨果

数字化转型

详解React的Transition工作原理原理

夏天的味道123

React

商业智能工具BI口碑解读:Quick BI为何连续入选魔力象限?

夏日星河

[力扣] 剑指 Offer 第一天 - 包含min函数的栈

陈明勇

Go 数据结构与算法 力扣 11月月更

白嫖一款免费的GIF录制软件,好用到飞起,萌新小白装机必备。

bug菌

GIF gif录制 视频录制

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