php是一把好锤子, 很适合0计算机基础的人入门, 不过这把锤子并不像标准的羊角锤, 一头拔钉子, 一头敲钉子. 可能php更像一个两头都用来拔钉子的锤子, 别误会, 我没有任何贬低php的意思, 我的意思是至少你还可以用这把奇葩的锤子的手柄来敲钉子.

Java不是一把锤子, 而是一个手柄, 你可以在上面接各种工具头, 敲钉子就接一个锤子头, 拧螺丝就接个十字刀头, 问题是你要去找各种工具(对一个Web应用来说, 10多种第三方包不过分吧), 而且手柄本身用起来咯手.

Ruby是一把符合人体工程学设计的手柄, 你依然可以在上面接各种头. 事实上, Ruby on Rails这个工具头已经满足了Web应用的全部需求了.

目录:

五大受损 全面解析PHP的糟糕设计

声明并使用类的实例变量Ruby胜

Java
Ruby
新建类的实例Ruby胜
Java
Ruby
反射打平
Java
Ruby
setter和getterRuby胜
Java
Ruby
五大受损 全面解析PHP的糟糕设计
辩题: PHP是不是一门好的设计语言
反方观点: 
正方观点: 
作为Java程序员, 鄙人认为反方观点有理有据让人信服, 所以今天我们不讨论PHP了.
声明并使用类的实例变量(Ruby胜)
Java
class Foo{
String name;
Foo(String name){
this.name=name;
}
public void printName(){
System.out.print("Hi " + name);
}
}
Ruby
不需要声明,直接在类的方法中使用@name
class Foo
definitialize(name="World")
@name=name;
end
defsay_hi
puts "Hi #{@name}";
end
注意: 构造函数参数name = “World”, Java不支持参数的默认值, 这也是Java项目编译OK, 运行时经常报NullPointException的原因.
新建类的实例(Ruby胜)
Java
FooFooFooFoo f = new FooFooFooFoo();
Ruby
f = FooFooFooFoo.new()
反射(打平)
Java
Class cla=ReflectionDemo.class; //创建类对象,使用泛型修饰避免强转
Field[] field=cla.getFields(); //获取全部公共域(含父类)
Field[] field=cla.getDeclaredFields(); //获取全部公共域(不含父类)
Method[] method=cla.getMethods(); //获取全部方法(含父类)
Field[] field2=cla.getDeclaredMethods();//获取全部方法(不含父类)
Ruby
Foo.instance_variables(true)#列出Foo实例变量(包括父类)
Foo.instance_variables(false)#列出Foo实例变量(不包括父类)
Foo.instance_methods(true) #列出Foo的函数(包括父类)
Foo.instance_methods(false) #列出Foo的函数(不包括父类)
f = Foo.new()
f.respond_to?("foo") #检查Foo是否有名为name的函数
setter和getter(Ruby胜)
Java
class Foo{
String name;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
还好? 如果有20个实例变量需要getter和setter呢?
Ruby
class Foo
#attr_accessor自动生成"name", "name="两个函数. 前者用作getter, 后者用作setter
attr_accessor :name
end
f.respond_to?("name") #true
f.respond_to?("name=") #true