红帽白皮书新鲜出炉!点击获取,让你的云战略更胜一筹! 了解详情
写点什么

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

  • 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:49754
用户头像

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

关注

评论

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

一份283页pdf,五大核心内容,熬夜“啃完”,竟拿下了阿里offer

Java 程序员 架构 面试

墨奇,以“一手之力” 证明你就是你

E科讯

GitHub 近两万 Star,无需编码,可一键生成前后端代码,这个开源项目有点强!

程序员生活志

深度 | 字节跳动微服务架构体系演进

字节跳动 微服务 云原生 Service Mesh 服务网格 火山引擎

自从有了这个工具,一键代码迁移不在话下

华为云开发者联盟

代码迁移 鲲鹏DevKit 汇编翻译 汇编语言 Kunpeng

体验为先,博睿数据打造以用户会话为中心的监测体系

博睿数据

博睿数据 数据链DNA DEM

高寿命NVMe SSD应用场景探讨

怀瑾握瑜

区块链 数据库 云计算 SSD 虚拟货币

5月新品速递:EdgeBoard车型识别软硬一体方案,轻松实现智慧车辆管理

百度大脑

5月盘点 上新

HTAP | MySQL 到 ClickHouse 的高速公路

RadonDB

MySQL Clickhouse Xenon

Flink Job 概览

Alex🐒

flink 翻译 flink1.13

新版发布|ShardingSphere 5.0.0-beta 来了!

SphereEx

ShardingSphere

微警务系统搭建,智慧派出所平台建设解决方案

双指针法

后台服务器开发

c++ 双指针 LeetCode

字节跳动亿级视频处理系统高可用架构实践

火山引擎开发者社区

架构 后端 音视频

工作年限、成长路线、进阶技术。怎样才能成为架构师?

Linux服务器开发

Linux服务器开发 Linux后台开发 软件架构师 服务器架构师 C++架构师

架构实战营 模块六:课后作业

👈

架构实战营

【小技巧】Google浏览器设置之Tab折叠分组

恒生LIGHT云社区

推荐 浏览器书签 谷歌 工具分享

2021年,想要成为年薪百万的Java架构师需要掌握哪些技术?

Java架构师迁哥

AI未来 - 李开复 - 未来8成的工作受影响 - 读后感-John 易筋 ARTS 打卡 Week 52

John(易筋)

ARTS 打卡计划

【签约计划】百位签约创作者名单公布

InfoQ写作社区官方

签约计划

为什么大家都在用WebRTC?

anyRTC开发者

音视频 WebRTC 语音通话 视频通讯

「网络安全入门」什么是网络安全

网络安全学海

问题定位 | XtraBackup 8.0 数据重建避坑事件始末

RadonDB

MySQL Xenon XtraBackup

Rust从0到1-泛型-生命周期

rust 泛型 生命周期 generic lifetimes

低代码助力企业生产管理8大招式,你学废(hui)了吗?

优秀

低代码

通用时区:你应该知道的数据库时区知识

华为云开发者联盟

数据库 时区 GaussDB(DWS) 通用时区 夏令时

开发5年!三面字节,成功拿到27k*17offer,原来也没那么难

Java 程序员 架构 面试

网络为本,博睿数据NPMD用20%的投入实现80%的功能

博睿数据

博睿数据 数据链DNA NPMD

从零开始学习3D可视化之拾取

ThingJS数字孪生引擎

大前端 可视化 3D 3D可视化 数字孪生

数仓分层架构如何设计?

奔向架构师

数据库 数据仓库 数据架构

架构实战营 模块六:学习总结

👈

架构实战营

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