【AICon】硅谷视野+中国实践,汇聚全球顶尖技术的 AI 科技盛会 >>> 了解详情
写点什么

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

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

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

关注

评论

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

开源一夏 | 基于若依架构的列表详情展示

六月的雨在InfoQ

bootstrap 开源 若依 8月月更

重要的不是成为海贼王,而是像路飞一样去冒险

沃德

2022Nginx实战教程,由浅入深

LoneWalker、

nginx

论文分享:「FED BN」使用LOCAL BATCH NORMALIZATION方法解决Non-iid问题

隐语SecretFlow

密码学和算法 机器学习/深度学习

分贝通SAAS企业大数据体系建设经验分享

阿里云大数据AI技术

大数据

Java技术:SpringBoot实现邮件发送功能

天使不哭

Java email #开源 8月月更

【React源码系列】全网最详细的React异常捕获及处理机制

爱切图的木子老师

前端 React react源码 异常捕获

阿里云架构师耗时几个月编写这份MySQL高可用和性能优化技术宝典

了不起的程序猿

Java MySQL 性能优化 JAVA开发 java程序员

“稚晖君”为2022昇腾AI创新大赛打call 期待广大开发者加入

Geek_2d6073

SpringMVC(三、JDBCTemplate)

开源 springmvc 8月月更

视频是主动学习吗?

FunTester

为什么数字钱包需要引入小程序生态

Speedoooo

小程序 第三方支付 小程序容器 移动钱包

图解VirtualBox安装CentOS 7

万猫学社

Centos 7 virtualbox

“车家互联”新态势,小程序实现物联网多场景互通

Speedoooo

小程序 智能家居 小程序容器 电动车

跨端技术方案选什么好?

Geek_99967b

跨端

winpe工具WEPE微PE工具箱

肖飞码字

windows 操作系统

双屏协作更高效,华硕灵耀X 双屏Pro 2022创作体验再升级

科技热闻

ebook下载 | 《 企业高管IT战略指南——企业为何要落地DevOps》

York

云计算 DevOps 云原生 数字化转型 降本增效

10个 Istio 流量管理 最常用的例子,你知道几个?

万猫学社

云原生 istio envoy Istio流量管理

毕昇编译器优化:Lazy Code Motion

华为云开发者联盟

云计算 后端 表达式 毕昇编译器

基于设计稿识别的可视化低代码系统实践

Shopee技术团队

前端 设计 低代码

十步以内,用小程序快速生成App!

Geek_99967b

小程序

分享 6 个 Vue3 开发必备的 VSCode 插件

pingan8787

vue.js 前端 vscode vuejs

README_Albumentations

G_Meteor

shell之变量详解,让你秒懂!

Albert Edison

Linux centos 运维 shell脚本编程 8月月更

2022 首期线下 Workshop!面向应用开发者们的数据应用体验日来了 | TiDB Workshop Day

TiDB 社区干货传送门

开源一夏 | 对于Angular表达式以及重要指令的研究心得【前端实战Angular框架】

恒山其若陋兮

开源 8月月更

在“企业通讯录”的盲区,融云的边界与分寸

融云 RongCloud

企业 IM im开发

Go-Excelize API源码阅读(五)—— Close()

Regan Yue

Go 开源 源码刨析 8月日更 8月月更

开源一夏 | Mysql开启ssl加密协议及Java客户端配置操作指南

六月的雨在InfoQ

MySQL 开源 SSL证书 SSL 连接 8月月更

5个 Istio 访问外部服务流量控制最常用的例子,你知道几个?

万猫学社

云原生 istio envoy Istio流量管理

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