在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

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

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

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

关注

评论

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

浅谈SAP顾问未来十年在中国的发展前景

SAP虾客

SAP顾问 技术专家 行业专家

原生即时通讯APP四合一成品聊天软件源码搭建个性化需求定制开发

BeeWorks

他做了跟世界首富同样的选择|ONES 人物

万事ONES

数仓血缘关系数据的存储与读写

NebulaGraph

图数据库 知识图谱 Nebula Graph

行业分析| 智能安防的发展

anyRTC开发者

人工智能 AI 音视频 安防 快对讲

等保测评师是做什么的?工资怎么样?

行云管家

网络安全 IT运维 等保测评 等保测评师

JavaScript this全解析

源字节1号

软件开发 前端开发 后端开发 小程序开发

大数据培训 | Doris数据导入与导出

@零度

Doris 大数据开发

TiDBv6.0与TiDBv5.1.2 TiKV 节点重启后 leader 平衡加速,提升业务恢复速度对比测试

TiDB 社区干货传送门

Apipost 6.0.4版本 支持离线使用

Xd

后端 接口测试 API

数据指标体系如何搭建才最有效,从0到1带你快速入门丨02期直播回顾

袋鼠云数栈

5G 时代,我们需要更便捷的RTC技术服务

曲多多(嗨翻屋)版权音乐

RTC 音乐

50万条数据 深挖四川数字经济“发展密码”:四川数字经济发展分析

易观分析

数字经济

深度学习利器之GPU

AIWeker

人工智能 深度学习 gpu 5月月更

王者荣耀商城异地多活架构设计

哈喽

「架构实战营」

在RPA立项阶段,银行需要做哪三件事?

易观分析

银行

喜讯|旺链科技成为TBI数字藏品项目组首批成员

旺链科技

区块链 产业区块链 数字藏品

【直播回顾】Hello HarmonyOS进阶课程第四课——ArkUI动画开发

HarmonyOS开发者

HarmonyOS

消灭非稳态噪音的利器 - AI 降噪

ZEGO即构

RTC AI降噪 网络降噪

linux之xargs使用技巧

入门小站

Linux

做SAP freelancer 的几个注意事项

SAP虾客

SAP freelancer 黑名单 业界名声

如何挑选文档管理软件?

小炮

文档管理

leetcode 34. Find First and Last Position of Element in Sorted Array 在排序数组中查找元素的第一个和最后一个位置(中等)

okokabcd

LeetCode 查找

得物技术Filament Creator材质编辑工具的实现

得物技术

模型 3D模型 3D 渲染 引擎

当前中小企业网络营销缺少的三个方面

源字节1号

前端开发 后端开发 小程序开发 网站开发

Yii2文件/图片上传实例

Owen Zhang

php

【LeetCode】房屋偷盗Java题解

Albert

LeetCode 5月月更

java培训 | Mybatis 中的 PreparedStatement 预编译

@零度

mybatis JAVA开发

【云管理】企业多元化私有云设施管理用什么软件好?

行云管家

云计算 私有云 IT运维 云管理

EAM与ERP有什么区别?

低代码小观

资产管理 企业管理系统 ERP CRM系统 ERP系统

Apipost 多人多角色实时协作 爆赞!!!

Xd

数据库 后端 接口测试 API

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