写点什么

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

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

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

关注

评论

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

学习WEB前端去哪里培训比较好

小谷哥

SAP Fiori 应用 Adapt UI 动态显示或者隐藏的技术设计细节解析

汪子熙

JavaScript 前端开发 web开发 SAP 7月月更

开发实践丨昇腾CANN的推理应用开发体验

华为云开发者联盟

Python 人工智能

# 重要-即时通讯IM开源项目OpenIM关于版本管理及v2.3.0发布计划

Geek_1ef48b

混合办公-疫情之下,远程办公靠谱吗?

BeeWorks

leetcode 435. Non-overlapping Intervals 无重叠区间(中等)

okokabcd

LeetCode 数据结构与算法 贪心算法

企事业单位建设知识管理的七条建议

Baklib

知识管理 企事业单位

SaaS应用:实现企业数字化转型的最佳途径

Baklib

web前端开发技术前景怎么样好不好

小谷哥

Free自由协议系统Dapp开发(锁仓复利)

薇電13242772558

智能合约 dapp

自动化测试如何实施落地?

老张

软件测试 自动化测试 项目落地

实践丨手把手教你用STM32设计WiFi语音播报日程表

华为云开发者联盟

开发

大模型训练难于上青天?效率超群、易用的“李白”模型库来了

OneFlow

机器学习 gpu 模型训练

SpringBoot的SpringBootApplication注解

技术小生

springboot 7月月更

在上海想学web前端课程如何选择

小谷哥

在武汉学习web前端开发课程哪家比较好

小谷哥

如何深入学习Html5前端技术知识

小谷哥

C 语言入门(五)

逝缘~

7月月更

自定义spring boot starter三部曲之二:实战开发

程序员欣宸

Java springboot 7月月更

移动互联网未来发展的五大趋势

BeeWorks

Optional的使用详解

echoes

在线多行文本批量正则替换添加后缀工具

入门小站

工具

【开课预告】7~9月学习课程《基于MASA Framework的EShop实战》

MASA技术团队

ST 端侧人工智能之视觉检测课程

贾献华

7月月更

究竟谁更需要已读功能?用户还是即时通讯本身?

BeeWorks

2022年智能运维企业50强,博睿数据实力入选

博睿数据

数字化 智能运维 博睿数据 性能监测

linux远程复制文件命令小总结

入门小站

在线SQL转JSON工具

入门小站

工具

灵雀云加入LF机密计算联盟,推进机密计算在云原生场景的应用

York

灵雀云 云原生 机密计算

WorkPlus SE | 全国第1个永久免费的即时通讯软件!

BeeWorks

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