初始化Ruby类的惯用法

时间:2016-07-25 20:43:36

标签: ruby

初始化Person对象的惯用方法是什么?我个人更喜欢person2但我不熟悉Ruby。

class Person
    attr_reader :first, :middle, :last, :phone_number

    def initialize(first, middle, last, phone_number)
        @first = first
        @middle = middle
        @last = last
        @phone_number = phone_number
    end
end

if caller.length == 0
    person1 = Person.new("John", "T", "Smith", "555-5555")
    person2 = Person.new(
        first=       "John",
        middle=      "T",
        last=        "Smith", 
        phone_number="555-5555",
    )
end

2 个答案:

答案 0 :(得分:3)

通常在ruby中,对象可以像person1一样创建,也可以按以下方式创建:

class Person
    attr_reader :first, :middle, :last, :phone_number

    def initialize(options)
        @first = options[:first]
        @middle = options[:middle]
        @last = options[:last]
        @phone_number = options[:phone_number]
    end
end

person = Person.new(first: "John", middle: "T", last: "Smith", phone_number"555-5555")

这种替代方法的好处在于,您可以选择包含任意数量的属性,也可以允许任意排序。

答案 1 :(得分:1)

person1 = Person.new("John", "T", "Smith", "555-5555")

在我看来,这是一个更好的选择。会有一些不同意,但这就是为什么我认为。

首先,您应该编写尽可能可读的代码。这样,人们就不必问很多问题就能理解为什么会按原样编写/构建某些东西。所以,如果你是第二种方式,那么你就会解释。但是,通过第二种方式,它就像是承认阅读你的代码的人没有写出它本来是第一次。您的软件的任何开发人员都知道他们可以查看构造函数参数名称,或者您的IDE已经使用自动文档的形式指定。上述两种表示法的替代方法是在构造函数中初始化人员姓名,如下所示

person1 = Person.new("John Smith")

甚至更好......

person1 = Person.new()

然后根据需要设置字段以解释发生的情况。

person1.address = "Blah street"
person1.phoneNumber = "555-5555"

现在,虽然我完全理解为什么第二个可能看起来更好,但从长远来看它会受到伤害。它在代码中不必要的毛茸茸,可以通过更精简的设计和强大的工具更好地删除。