InfoQ

新闻

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

作者 Sadek Drobi译者 王丽娟 发布于 2008年4月17日 下午7时49分

社区
Architecture
主题
编程,
设计
标签
依赖注入,
框架,
Guice,
Spring框架,
静态分析

Debasish Ghosh对一场动态VS.静态语言的讨论做出了回应,提出了用静态语言编程时动态类型检查的使用问题。他回忆了Greenspun第十编程法则:“任何使用静态类型检查语言编写的、足够复杂的程序都包含一个特定、非正式定义、容易引入Bug且缓慢的动态检查语言实现。”

Ghosh认为如今不一定要这样。他主张,Java泛型(比如Guice和EasyMock)能避免那些为了强制执行运行时类型检查而采取的权宜之计:

原先在有些情况下不得不模拟运行时类型检查,既缓慢又容易引入Bug,而利用Java泛型,这些框架就可以通过编译时类型检查来达到同样的效果。Guice和EasyMock是我用过的比较优秀的两个框架,它们利用泛型实现了突出的类型安全。[……]

看一下下面这段代码,它用Guice Binder把实现SpecialServiceImpl绑定到接口Service上。

public class MyModule implements Module {
    public void configure(Binder binder) {
            binder.bind(Service.class)
                         .to(SpecialServiceImpl.class)
                         .in(Scopes.SINGLETON);
    }
}

尽管“ServiceSpecialServiceImpl之间的“实现”关系看起来是在运行时完成的”,但所有的类型检查实际上是在编译时进行的:

快速看一下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

没有回复

回复

独家内容

Tapestry for Nonbelievers

I. Drobiazko和R. Zubairov合作撰写了一篇文章,详细介绍Apache Tapestry 版本5——一个面向组件web框架。文章向读者展示了创建组件方法,并谈到了Tapestry中的IoC以及Ajax的相关特性。

ESB拓扑方案

在本文中,Adrien Louis讨论了两种基于ESB的SOA拓扑方案的优缺点:单个公司级ESB vs. 彼此互联的“部门级”ESB系统。Adrien讨论了每种方案对管理、业务监测、治理、可靠性和编配等问题的影响。

毛新生谈Project Zero和软件新发展

InfoQ中文站有幸与IBM中国开发中心Web 2.0首席架构师毛新生聊了聊Project Zero和软件新发展的相关话题,其中包括Project Zero的组织形式、支持的语言、以及未来发展方向等等。

Google图表及gchartrb初探

Google图表是一项用于生成图表的Web服务。这篇文章详细介绍了Google图表的接口以及可以允许Ruby方便创建图表的gchartrb库。

使用Erlang和Yaws开发REST式的服务

在这篇文章中,Steve Vinoski解释了如何用Erlang和Yaws Web服务器创建REST式Web服务。

Segundo Velasquez与客户眼中的敏捷

在某个软件产品设计的初始阶段,Segundo Velasquez曾以客户的身份与一个敏捷团队共同工作;Deborah Hartmann就这段经历对他进行了采访。

开放平台技术架构剖析

本视频从互联网的分类讲起,介绍了开放平台的类型、开放的价值以及开放平台对开发者的机会和挑战。然后以雅虎的NCP开放平台为例,讲解了NCP的特点、基本架构和具体的开发过程。

用UML做好系统分析

使用UML如何能让我们做好系统分析的工作呢?就让我们通过基金模拟项目,先睹为快,抢先体验一番。 本文节选自《系统分析师UML实务手册》的第二章。