2016-07-25 56 views
1

初始化Person對象的習慣用法是什麼?我個人更喜歡person2,但我是Ruby的新手。初始化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 

回答

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") 

有關此替代方法的好處是,你可以選擇包括儘可能多或儘可能少的屬性爲你喜歡,以及允許任意排序。

+0

感謝您的回覆。我在'def __init __(self,** kwargs)'中看到了類似Python的東西。我個人認爲,這使得初始化程序非常難以閱讀。 'options'或'** kwargs'沒有告訴我傳遞給初始值設定項的任何信息,所以我必須深入瞭解實現邏輯以瞭解如何正確初始化對象。我想現在我會堅持用'person1'的例子:) – Ben

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" 

現在,雖然我完全理解爲什麼第二個可能看起來更好,但從長遠來看,它會受到傷害。代碼中不必要的絨毛,通過精簡的設計和強大的工具可以更好地去除。

+0

感謝您的回覆。如果我明確設置字段(即'person1.address =「blah」'),那麼我將不得不將'attr_reader'的'address'字段更改爲'attr_accessor'。再說一遍,我是Ruby的新手,但對於訪問控制儘可能限制性地使用它是否有意義? – Ben

+1

說實話,我不是主要的Ruby開發人員。我花了大約2年的時間與Ruby,但主要在C#工作,所以我的建議應該與一粒鹽。當涉及到儘可能的限制時,它取決於你計劃如何在生命週期中使用對象。如果它應該作爲一種常數並在系統的各個部分之間傳遞,那麼是的,我會堅持使用構造函數初始化或針對您的環境更詳細的說明。否則,你需要暴露一些可以工作的形式的setter。最好的情況下,你可以使用工廠。 – cmw2379