Java 框架到底怎么了?
如果你作为一个Java 程序员从事j2ee开发的话,你一定会使用到众多应用程序框架。没有任何一个语言会象java
语言社区那样活跃,任何一种新的程序理念都会很快在网上出现相应的开源实现。对应最常用的网站开发模式MVC,每一层都会有很多框架,Struts,
Tapestry 属于控制器层(C), Velocity框架属于视图层(V),你使用的数据持久层可能是 Hibernate, iBatis,
OJB, 或者是 JDO 的众多开源实现中的任何一个,比如 JPOX 。
但是你的选择太多,未必是件好事,并不是任何人都能采用正确的框架来做正确的事情。如果你的开发平台是.net,
那么你也许会避免这种情况,通常你只要安装一个 Visual Studio .net 作为开发工具,然后安装一个 MSDN
来查找资料就可以了。对于程序开发人员来说,这是非常两难的事情。我本人很喜欢 Java
,无论是学习还是实践,它的确给我们提供了很多。但是为什么我觉得 .net 那样“一站式”解决方案在很多时候是正确的呢?
作为一个Java程序员,我觉得Java一些比较明显的问题,首先是Java 太复杂,其次Java 太面向程序员了,而不是面向用户。相对C++
来说, Java已经很简单了。现在Java 程序员数量如此多就说明了这点。但是正如有人曾经说过的那样,“在linux
上,你很容易区分出谁是高手”,在 Java
领域中就不那么容易了。我就经常发现身边的同事还在犯很低级的概念性错误,他们甚至在无法准确地区分什么是接口,抽象类和Servlet的情况下仍然可以
从事多年的j2ee 开发。但为什么又说 Java
复杂呢,因为它完成一件事情,需要太多不同的技术来实现了。这样对于那些概念不很清楚的程序员来说,你如何能保证他们作出正确的选择呢?而众多框架中有没
有多少提供“一站式”服务的。最近冒头的 Spring
框架提供的服务在众多的框架中算是最多的了,但是它又有个新问题,就是它还是太面向程序员了,而不是用户。为什么这么说呢?框架本来就是面向程序员的,这
难道不对吗?Spring 虽然提供了众多选择(但是还是不够多,它本身没有ORM
),但它没有提供简单的使用方式,所以我们只能说它是面向程序员的。绝大多数java框架都存在这个问题,就是学习曲线比较高。我觉得学习曲线的高低是区
分一个框架是否是面向程序员还是用户的关键,我想这主要表现在框架的易用性上。其实框架最终的用户还是程序员,之所以用“用户”和“程序员”来区分,是因
为一些面向“程序员”的框架比较难以使用,虽然提供了大量的基础设施和零件,但是还是要求程序员自己来组装。而面向“用户”的框架就简单一些,用户只要按
照说明书来使用就可以了。为什么 Ruby on rails 会在 Java
社区引发轰动,我想原因就在于此,它提供了一个“一站式”面向用户的简单易用的框架,这是 java 框架所缺乏的。为什么 Ruby on
rails 能做到这点,难道 java 本身做不到吗? 事实是众多 Java
框架的设计者不这么做,可能是他们的思维已经限制在如何用模式设计一个好的框架上了,而没有在框架的易用性上做更多文章。使用过 Spring
的人就知道它的 xml 配置文件会渐渐的膨胀,虽然我们很容易将其分解为更多的小配置文件来解决这个问题。 但是在使用 xml
配置文件上,它沿袭了 Java 编程的习惯性概念:“Java 是最好的编程语言,XML
是最好的描述数据的语言,两者的结合是最完美的。如果一个应用不使用 xml 来描述,那么它就不是好的 java 应用”。
但是 rubyon raiils 就是在这点上和众多 java 框架区别开来,才达到了框架易用性上的一次突破。这个思想贯穿了Rails
设计的始终:习惯约定优于配置。 举个例子,通常我们写java web 应用程序,都会按照 MVC 来给对应类做区分,我个人喜欢将
Controller 类放在 web 目录中,将 View类放在 view目录中,将 model类放在
domain目录中。但是不同的人有不同的设置,不同的命名,如何让框架知道这些不同的目录呢, java 框架的解决之道,只能是通过 xml
配置文件让它了解这些信息。而 rails 的解决方式就是: 目录结构我来定义,你只要在我定义好的目录中放东西就可以了。这也就是为什么
rails 中很少有配置文件(但不是没有)的一个重要原因。虽然思想很简单,但是它带来的好处就是,Rails 的开发效率是 java 开发的
10倍(这是 rails的 fans宣称的,不过我相信这点,相信看完这篇文章你也一定会的)。那么光这点就能让 rails 开发比采用 java
更快了吗?不完全是这样,因为这还得益于 rails 的另外一个设计理念:更少的代码。并不是任何语言都能那么宣称的,rails
实现这点完全得益于它的设计语言 Ruby 。使用 Ruby 你的确能用很少的语言写很多的功能,这是其他语言所无法实现的。
想要掌握Rails,你一定要了解 Ruby。 曾经有人说:Zope (著名的 pythonweb 框架)是 python 的 killer
级应用,python是 zope的秘密武器。 我想这句话用在描述 rails 和 ruby 的关系再合适不过了。那么我们还是来先了解一下
ruby的一些基本概念吧。
Ruby 简介:
在开始写这个教程之前,我原打算简单介绍一下 Rails
的使用就可以了,网上有相应的教程,只要照着翻译一遍就行。但是有两个原因促使我要先介绍一下 ruby: 一是:作为一个 Ruby
语言的爱好者,我觉得有必要向大家介绍它的好处。它是学习 Rails 的关键所在。二是:不先学习一些 Ruby
的基本知识,Rails一些代码你就会不明白原委。
Ruby
是由日本人松本行弘发明的一种面向对象的脚本语言。虽然很多语言都宣称自己是面向对象的,但是每种语言的解释都不一样,大多是以它们自己特有的方式来解释
什么是面向对象,而实际情况中,这些面向对象语言又都采用了很多非面向对象的做法。以 Java 为例:如果你想对一个数字取绝对值,你会怎么做呢?
java 的做法是
int c = Math.abs(-166);
也就是将一个数值传递给 Math 类的一个静态函数 abs 处理。为什么这么做?因为在 java 中, 数值是基本类型不是类。
而在 Ruby 中,任何事物都是类, 也就是说,数字 –166 就是对象,取绝对值这样的操作应该属于数字本身,所以”Ruby 方式”的做法就是:
c = -166.abs
这种做法是不是更直观一点。
接着我们来介绍一下 ruby 语言的一些简单特点。
如何定义函数
def hello(name)
result = "hello, " + name
return result
end
这就是一个最简单的函数定义。Ruby 以 def 开始一个函数定义,后跟着 函数名, 然后是 参数,但是参数不必非要放在括号中,
你可以这样定义 def hello name ,之所以要用括号是为了更清晰。在 ruby 中你可以用多种方式来完成同一件事情,这也是 ruby
的设计思想。
Hello 函数很简单, 将参数和 “hello, “字符串组合在一起,赋值给临时变量 result ,然后再返回 result。 你会注意到
result 变量并没有申明,因为在 ruby 中无需申明,变量在赋值中自动使用。 另外 ruby 中不需要使用 ;
来结束每个语言,只要保持每条语句在单独一行就可以。 Ruby 也不包含 {} 来定义块结构, if , when 函数都以一个 end
关键字来结束。缩进不是语法(python 程序员要失望了)。第一次使用ruby 我也有点不习惯,因为我认为python
语言的缩进语法可以使得阅读程序代码更容易一些。但是学习了一段时间后,我发现缩进语法并不是那么重要,Ruby
本身带来的帮助远比这个更重要。而且代码的易读性也不是由缩进来改善的.此外上面的代码还可以更简化。
def hello (name)
" hello, #{name}"
end
在 ruby
中,函数的最后一条语句如果是表达式,那么它就作为返回值。在上面的代码中,用到了另外一个概念,就是表达式插入,字符串可以用单引号和双引号来括起来。
但是两者还是有一点区别。区别在于处理时间上的不同。如果使用单引号,那么处理的时间很短。如果使用双引号,那么你可以插入变量,表达式,还有就是转意字
符的替换,最常见的是 \n,\t 等。 以上面的代码为例 字符串中插入了变量 name ,字符串中插入变量以 # 开始,变量放在{}中。
但是特殊变量可以不用 {}. 那么什么是特殊变量呢。这个也是 ruby 特别的地方。在 Ruby 中,全局变量以
$开头,静态变量,也就是类变量以 @@ 开头,实例变量以 @ 开头。如果在字符串中引用 实例变量,你可以这么写。
def hello
" hello, #@name"
end
关于变量和基本结构我们就简单介绍这些,下面我们要介绍一个重要的Ruby 概念。就是 interator (迭代器)。 这个概念遍布在很多
ruby 代码中,也是最常见的 ruby way 。正是因为 interator ,在 ruby 程序中,你很少会看到循环的使用。
举个最简单的例子,如何打印从 1 到 6 的结果。
在 java 等语言中,我们的实现方法是:
for(int i = 1; i<6;i++) {
System.out.println(i);
}
而在 ruby 中,一切皆为对象,数字本身就是对象(我们在前面已经介绍过了),数字本身有它自己的迭代器 times 。那么让我们看看它的实现。
6.times {|i| p i }
是不是很简单。
迭代器的概念很有趣,它是如何在 ruby 中实现的呢。每个函数可以不光带有参数,还可以在参数后面带一个代码块。代码块在ruby 中是以 {}
和 do end 来包围起来的。通常如果是单行使用 {} ,如果是多行这使用do end 。这并非强制,只是习惯性用法。
代码块和参数并不相同,它和函数的执行可以说是并行的,确切的说是接替进行。如果在函数内部如何在运行过程中碰到了 yield
,它就会将函数执行过程交给函数附带的代码块来执行,代码快执行完了,执行流程转到函数内部继续运行。似乎很难理解,以下面这段代码来理解可以会容易一
些。
def callBlock
yield
yield
end
callBlock { puts "In the block" }
输出:
In the block
In the block
CallBlock 函数中只有两个 yield 语句,它在执行过程中将执行权交给 函数附带的 block 运行,block 输出字符串 "In
the block" ,这样最终结果就是输出两行 "In the block" 。 在函数内部使用 yield 还可以带任意多参数。比如
yield a, b, c
这三个参数对应代码块中的三个参数 {|x,y,z| p x y z }
好了, Ruby 就介绍到这里。下面正式进入正题,介绍一下 Rails 的使用。
什么是 rails ?
在写这个教程的最初,我基本上是在翻译网上的教程。但是 rails中包含了太多的程序和概
念,如果只是简单的介绍,你虽然会很快学会使用 rails ,但是对于它的一些概念了解不深。在这里我希望更多地介绍一些rails 所包含的工具,比如 rubygems , webrick 等等。
整个教程是基于ruby的 windows 发行版。Ruby 作为跨平台的脚本语言,几乎在所有的平台上都有相应的实现,很多 linux
发行版本都带有了 ruby安装文件,而 windows 平台则需要从 www.rubyforge.net上下载一个 one-click
installer 安装程序。 由于 ruby one-click installer 带有了 rubygems package
manager包,所以就省去了我们很多麻烦。我们只需要一条命令就可以从网上下载 rails 了(当然安装 rails 你需要保证你的机器连上
internet )。
简单介绍一下 rubygems. Rubygems 是最近渐渐在 ruby 社区流行起来的包管理工具。 在以前,如果你要下载一个 ruby
扩展或者应用程序的话,你需要下载相应的 zip 包,然后解压缩,将应用或者扩展安装到 ruby 对应的目录中。但是有了新的 rubygems.
所有这些麻烦都没有了,你只需要一条命令就可以从远程服务器上下载相应的包,如果相应的应用包含其他扩展,rubygems
也会提示你从远程安装所依赖的扩展。安装后 rubygems 会运行相应的程序生成 rdoc 帮助文档(类似于 javadoc )。
当然你也可以将软件包下载到本地运行 rubygems 的本地安装命令。 有了 rubygems 包管理器, ruby
应用的安装将变得前所未见的容易。 统一化的管理带来的好处就是简单。现在 ruby 社区的应用都在朝着写 gems 的方向发展,很多以前的
RAA 都转化为 gems了, 而 rubygems 也将成为 ruby 事实上的包管理器标准了。
记得以前看电影《指环王》的时候记得一句话,那就是 “one ring to rule them all”, 有了 rubygems
,你可以说是 “one gem to rule them all ” 了。
我来说两句
内容:
验证:
发表评论
最新评论
查看全部评论……(共1条)