把握行业变革关键节点,12 月 19 日 - 20 日,AICon北京站即将重磅启幕! 了解详情
写点什么

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

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

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

关注

评论

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

前端vue面试题

bb_xiaxia1998

Vue

Backbone前端框架解读

京东科技开发者

Vue 前端 前端架构 企业号 2 月 PK 榜 backbone

从React源码角度看useCallback,useMemo,useContext

goClient1992

React

2023年国家级重大人才工程引进申报

科兴未来News

创新创业 江苏工博会 博士后 #人才政策# 启明计划

社招前端一面经典手写面试题

helloworld1024fd

JavaScript

Verilog HDL函数与任务的使用

timerring

FPGA

react源码分析:深度理解React.Context

flyzz177

React

前端刷完这12道滑动窗口,就可以出山面试了

js2030code

JavaScript LeetCode

一文搞懂Redis

京东科技开发者

redis hash Zset Redis 协议 企业号 2 月 PK 榜

一口气讲完了Redis常用的数据结构及应用场景

小小怪下士

Java redis 程序员

使用 NineData 快速构建企业容灾备份

NineData

数据库 数据管理工具 数据备份 运维开发 企业容灾

用户行为分析模型实践(三)——H5通用分析模型

vivo互联网技术

大数据 数据分析 数仓建模

几个常见的js手写题,你能写出来几道

helloworld1024fd

JavaScript

湖仓一体电商项目(十九):业务实现之编写写入DWS层业务代码

Lansonli

数据湖 湖仓一体电商项目

用javascript分类刷leetcode16.set&map(图文视频讲解)

js2030code

JavaScript LeetCode

ChatGPT背后的经济账

OneFlow

人工智能 深度学习 大模型

react源码分析:组件的创建和更新

flyzz177

React

lua中实现判断是否为局域网IP

ModStart

文盘Rust -- rust 连接云上数仓 starwift

京东科技开发者

rust Clickhouse 语言 rust语言 企业号 2 月 PK 榜

react源码分析:实现react时间分片

flyzz177

React

谈谈我对于关键思考的理解

阿里巴巴中间件

阿里云 关键

前端工程师leetcode算法面试必备-二分搜索算法(上)

js2030code

JavaScript LeetCode

什么是WMS系统?

SAP虾客

wms

让远程成为本地,微服务后端开发的福音

北京好雨科技有限公司

Kubernetes 微服务 云原生 企业号 2 月 PK 榜

如何实现OpenHarmony的OTA升级

OpenHarmony开发者

OpenHarmony

实现Promise的原型方法--前端面试能力提升

helloworld1024fd

JavaScript

高级前端常考手写面试题(必备)

helloworld1024fd

JavaScript

带你实现react源码的核心功能

goClient1992

React

从React源码来学hooks是不是更香呢

goClient1992

React

百度工程师带你了解Module Federation

百度Geek说

JavaScript 微前端 企业号 2 月 PK 榜

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