本书第1章简要介绍Groovy,这是设计用来增强Java平台的唯一的脚本语言。它提供类似于Java的语法,内置对如下主题的支持:映射(Map)、列表(List)、方法、类、闭包(closure),以及生成器。依赖于动态的弱类型,以及对Java应用程序接口(API)的无缝访问,Groovy语言非常适合于开发小型和中型应用程序。
1.1 为什么使用脚本语言
一般来说,脚本语言,比如Groovy,具有更好的表示能力;相对于系统编程语言,比如Java语言,能够提供更高的抽象等级。这通常会提供更快捷的应用程序开发能力,以及更高的编程生产力。但是,脚本语言和系统编程语言的目标是不同的。脚本语言被设计用于把应用程序集成起来,而不是实现复杂的数据结构和算法。因此,为了保证实用性,脚本语言必须能够访问不同类型的组件。
通常,脚本语言不会替代系统编程语言。它们相互补充(Ousterhout, 1998)。一般来说,系统编程语言应该被用于如下目的:
开发复杂的算法或者数据结构
实现计算密集型应用
操作大型数据集
实现良好定义的、缓慢变更的需求
是大型项目的一部分。
但是,脚本语言应该被用于如下目的:
连接已有的组件
处理经常变化的多种类型的实体
具有图形化用户界面
拥有快速变化的功能
是小型或者中型项目的一部分。
相对于系统编程语言,脚本语言的主要长处是所需的编码工作量相对少。通常,系统编程语言的代码看起来非常复杂,难以维护。这是因为系统编程语言的代码需要大量的模板或者转换代码。
系统编程语言是强类型的,能够确保代码的安全性和健壮性。在强类型语言中,变量必须被指定为一种类型,只能按照固定方式使用。尽管强类型特性使得大型程序的可管理性更好,并且允许编译器(静态地)检测特定类型的错误,但可能有时候起不到类型安全保护作用。比如,当事先很难或者不可能决定变量的类型时,强类型是没有用处的。当连接组件时,这种情况会经常发生。
为简化组件连接任务,脚本语言被设计成弱类型。这意味着,在不同环境下,变量可以以多种方式使用。但是,当代码被实际执行时,才会检测变量是否被非法使用。比如,尽管Groovy在编译时(静态地)检查程序的语法,(动态地)检测方法调用是否正确发生在运行时。最终结果是,正确编译的Groovy脚本在运行时也许会抛出异常,甚至导致非正常结束。
弱类型并不意味着代码是不安全的,或者不健壮。极限编程(Beck, 2004)已经成为一种软件开发方法。这个方法注重测试,使用全面的单元测试方案(Link, 2003)来驱动开发过程。通过在不同环境下执行所编写的代码,就可以保证代码的安全性和健壮性。当开发Groovy脚本时,单元测试应该是基础的开发过程。实际上,开发经验已经证明,在弱类型语言中,综合运用弱类型和单元测试通常比传统系统编程语言的强类型检测更好(请参考http:// www.mindview.net/WebLog/log-0025的相关文档)。这样的话,就同时拥有弱类型的灵活性和单元测试的全面保障。