入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

php不是世界上最好的语言, Ruby才是

创建时间:2016-06-19 投稿人: 浏览次数:5097

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的糟糕设计>
正方观点: <驳《五大受损 全面解析PHP的糟糕设计》——为PHP正言>

作为Java程序员, 鄙人认为反方观点有理有据让人信服, 所以今天我们不讨论PHP了.

Java

class Foo{
    String name;
    Foo(String name){
        this.name=name;
    }

    public void printName(){
        System.out.print("Hi " + name);
    }
}

Ruby

不需要声明,直接在类的方法中使用@name

class Foo
    def initialize(name="World")
        @name=name;
    end

    def say_hi
        puts "Hi #{@name}";
    end

注意: 构造函数参数name = “World”, Java不支持参数的默认值, 这也是Java项目编译OK, 运行时经常报NullPointException的原因.

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的函数

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
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。