写点什么

试着发挥静态类型语言的最大功效

  • 2008-04-17
  • 本文字数:943 字

    阅读完需:约 3 分钟

Debasish Ghosh 对一场动态 VS. 静态语言的讨论做出了回应,提出了用静态语言编程时动态类型检查的使用问题。他回忆了 Greenspun 第十编程法则:“任何使用静态类型检查语言编写的、足够复杂的程序都包含一个特定、非正式定义、容易引入 Bug 且缓慢的动态检查语言实现。”

Ghosh 认为如今不一定要这样。他主张,Java 泛型(比如 Guice 和 EasyMock)能避免那些为了强制执行运行时类型检查而采取的权宜之计:

原先在有些情况下不得不模拟运行时类型检查,既缓慢又容易引入 Bug,而利用 Java 泛型,这些框架就可以通过编译时类型检查来达到同样的效果。Guice 和 EasyMock 是我用过的比较优秀的两个框架,它们利用泛型实现了突出的类型安全。[……]

看一下下面这段代码,它用 Guice Binder 把实现SpecialServiceImpl``绑定到接口``<span id="tnuu">Service</span> 上。

public class MyModule implements Module {
public void configure(Binder binder) {
binder.bind(Service.class)
.to(SpecialServiceImpl.class)
.in(Scopes.SINGLETON);
}
}

尽管“Service和 <span id="q4qw">SpecialServiceImpl</span>``之间的“<span id="fddp"><strong id="yod5"> 实现 </strong></span>``”关系看起来是在运行时完成的”,但所有的类型检查实际上是在编译时进行的:

快速看一下 Guice 的源码,可以看到 BinderImpl.bind() 方法返回 BindingBuilderImpl……

public BindingBuilderImpl bind(Class clazz) {
return bind(Key.get(clazz));
}

BindingBuilderImpl.to() 方法则把 Class 作为输入——加在类型通配符上的限制使对参数的编译时类型检查实际上起到检查“实现”关系的作用……

public ScopedBindingBuilder to(Class extends T> implementation) {
return to(TypeLiteral.get(implementation));
}

Debasish Ghosh 提倡使用这种解决方法,而不是试图实现动态类型检查。这种方法不仅能避免 Greenspun 第十编程法则,还能充分利用静态类型,因为它能保证强大的类型安全:

在你用静态类型语言编程的时候,利用适当的语言特性让大部分的类型检查在编译时进行。这样,在你点击运行按钮之前,你就能确信你的代码符合类型系统的规则。你还能够对你的代码集进行更为简单的重构和更加清晰的改进。

查看英文原文: Try to get the best of your Statically Typed Language

2008-04-17 19:491104
用户头像

发布了 151 篇内容, 共 66.4 次阅读, 收获喜欢 18 次。

关注

评论

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

全球线上直播会议丨快速赋能企业,仿真技术如何实现降本增效?

Altair RapidMiner

仿真 CAE hyperworks SimSolid Simlab

BeeWorks:专业的企业Im即时通讯平台

BeeWorks

IM 即时通讯IM 私有化部署 企业级应用

BeeWorks:低成本的国产化企业内网即时通讯

BeeWorks

即时通讯 IM 私有化部署 企业级应用

以人脸识别验票机为例,通义灵码如何助力嵌入式软硬件开发中的快速功能验证

阿里巴巴云原生

阿里云 云原生 通义灵码

CAD怎么关闭保存备份bak文件

极客天地

YashanDB CEIL函数

YashanDB

yashandb

Web3实战:从零开发你的ERC20代币合约

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 公链开发代币开发

YashanDB CAST函数

YashanDB

yashandb

用通义灵码写一个大学社团“自动化运营外挂” | 《趣玩》第3期

阿里巴巴云原生

阿里云 云原生 通义灵码

用通义灵码写一个大学社团“自动化运营外挂” | 《趣玩》第3期

阿里云云效

阿里云 云原生 通义灵码

2025深圳机器人展览会·高交会

AIOTE智博会

高交会 机器人展 机器人展会 机器人博览会

JDK的SPI有什么缺陷?dubbo做了什么改进?

不在线第一只蜗牛

Java

最讨厌AI的人选了特朗普

脑极体

AI

万字长文 | Apache SeaTunnel 分离集群模式部署 K8s 集群实践

白鲸开源

英特尔“大小脑融合”全新方案亮相:构建具身智能系统的理想选择

E科讯

一文讲透“MCP协议+LazyLLM”实战:零基础秒建Agent分身!

商汤万象开发者

AI LLM

CAD怎么将Z坐标调为0

极客天地

YashanDB BITAND BITOR BITXOR函数

YashanDB

数据库· yashandb yashandb知识库

以人脸识别验票机为例,通义灵码如何助力嵌入式软硬件开发中的快速功能验证

阿里云云效

阿里云 云原生

酒仙桥的AI变形记

脑极体

AI

“思考更长时间”而非“模型更大”是提升模型在复杂软件工程任务中表现的有效途径 | 学术研究系列

阿里巴巴云原生

阿里云 云原生

YashanDB BIT_LENGTH函数

YashanDB

yashandb

天润融通携手天虹:AI Agent革新购物体验,优化服务效率

天润融通

天润融通智能工单系统,助力企业实现服务全流程可视化管理

天润融通

世界地球日,DeCloud如何助力节能减排?

PowerVerse

DePIN 节能减排 DeCloud

CAD放缩时文字消失怎么办

极客天地

CAD对齐两个对象方法

极客天地

使用 LangChain + Higress + Elasticsearch 构建 RAG 应用

Se7en

“思考更长时间”而非“模型更大”是提升模型在复杂软件工程任务中表现的有效途径 | 学术研究系列

阿里云云效

阿里云 云原生

天润融通AI Agent引领零售行业客户服务变革,塑造持久竞争力

天润融通

YashanDB BIN_TO_NUM函数

YashanDB

试着发挥静态类型语言的最大功效_架构_Sadek Drobi_InfoQ精选文章