你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Java专栏
跨越边界:浅谈Java模型以外的类型策略(2)
 
另一种观点则认为现代软件开发团队通常会运行自动测试,动态语言的支持者声称,即使是最简单的自动测试也可以捕捉到大多数的类型错误。而动态语言的支持者所能提供的对编译时错误检测不利的最好论据是,早期检测所带来的好处相对于成本来说是得不偿失的,因为不管是否使用动态类型,最终都要进行测试。

  一种有趣的折中方法是在静态类型语言中使用隐式类型,从而减少类型的成本。开放源代码语言 Objective Caml (OCaml) 是静态类型语言 Lisp 的衍生物,它既能提供很好的性能,又不会牺牲生产率。OCaml 使用隐式类型,因此可以编写下面这样的采用静态类型的代码:

  # let x = 4+7

  OCaml 返回:

  val x : int = 11

  根据表达式中的语法线索,OCaml 推断出 x 的类型。4 是 int 型,7 也是 int 型,因此 x 也必定是 int 型。隐式类型语言可以拥有 Java 语言所具有的所有类型安全性,甚至更多。不同之处在于您需要提供的信息量,以及在阅读程序时可用的信息量。很多喜欢静态类型的人更偏爱隐式类型。他们宁愿让编译器来做这种事情,而不愿意被迫重复地在代码中输入变量的类型。

  隐式类型系统一个较大的优点是,不需要为函数的参数声明类型,因为编译器会从传入的值推断出参数的类型。因此同一个方法可以有多种用途。

  关于重构的谬误

  有些人认为,要获得具有重构(refactoring)支持的良好 IDE,就必须具有静态类型特性,这种观点是荒谬的。大多数现代 IDE 多少从早期的 Smalltalk IDE 中吸收了一些东西。实际上,Eclipse 早期也有一些基本的东西是 Visual Age for Java 中的,而后者最初就是被发布在 Smalltalk 虚拟机上!Smalltalk Refactoring Browser 仍然是如今可用的功能最完善的重构工具之一(见参考资料)。Java 语言仍然比大多数流行的动态语言(除了 Smalltalk)具有更好的工具,静态类型是最大的原因。

并不是只有编译器才能利用静态类型所提供的附加信息。IDE 可以通过静态类型为重构提供更好的支持。几年前,一种革命性的思想改变了开发环境的工作方式。在 IDEA 和 Eclipse 中,您的代码看上去像一个文本视图,但是开发环境实际上正在编辑 Abstract Syntax Tree (AST)。因此,当需要重新命名一个方法或者类的时候,开发环境很容易通过在 AST 中精确定位找到方法或类被引用的每个地方。如今,如果没有通过静态类型简化的优秀的重构,我们很难想像用 Java 语言编程。在我探索 Ruby 的时候,相对于其他任何工具或特性,我更怀念 IDEA。

  静态类型还有其他一些优点,在这里我不会详细描述。静态类型可以提供更好的安全性,而且显然还可以提高代码的可读性。静态类型还可以提供更多的信息,使得编译器更容易进行优化,从而提高性能。但是静态类型赢得开发人员青睐的最大原因是更容易检测错误,而且有更多可用的工具。

  动态类型的优点

  Ruby 专家 Dave Thomas 将动态类型称作duck typing(见参考资料),这有两层意思。第一层意思是说,这种语言不真正实现类型 —— 它利用鸭子理论 解决这个问题。第二层意思是说,如果什么东西走起来像鸭子,叫起来也像鸭子,那么它很可能就是一只鸭子。在编程语言的上下文中,duck typing 意味着如果一个对象对于某种类型的方法有反应,那么事实上就可以把它看作那种类型。这样的特性可以导致一些有趣的优化。

  大多数偏爱动态类型的开发人员除了强调早期错误检测会带来不必要的成本外,还提到动态类型语言具有很好的可表达性和生产率。很简单,您通常可以用更少的关键词表达更多的思想。作为一名新的 Ruby 拥护者,我深信动态语言更能提高生产率,虽然我不能比常见的静态语言的支持者拿出更多具体的证据来。但是,从我开始编写更多的 Ruby 代码起,我就感觉到自己的生产率有了明显的提高。诚然,我仍然会看到静态类型的优点,尤其是在工具集方面,但是我逐渐认识到了静态类型的缺点。 当我开始用 Ruby 编写代码时,我受到的最大改变是产生和使用元编程结构的能力。如果您从头开始一直关注跨越边界 系列统的话,您就知道元编程,或者说编写用于编写程序的程序,是 Ruby on Rails 的一大推动力量,更一般地说,是特定于领域的语言的一大推动力量。用 Ruby 编程时,我通常会编写更大的构建块,或者用更大的块进行构建。我发现,与使用 Java 编程相比,我可以用更多类型的可重用块扩展我的程序。就像在 Java 编程中,您可以用新的类来扩展程序。还可以添加方法和数据到已有的类中,因为类是开放式的。您可以使用 mix-in(后面 运行时绑定 会讲到)来添加核心功能到已有的类中。还可以在任何时候根据需要改变一个对象的定义。我还是一名 Ruby 编程新手,这些功能用到的不多,但是当我真正开始使用它们时,结果令人大吃一惊。

(编辑:aniston)

  推荐精品文章

·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 
·2023年7月目录
·2023年6月目录 
·2023年5月目录
·2023年4月目录 
·2023年3月目录 
·2023年2月目录 
·2023年1月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089