簡體   English   中英

初始化Ruby類的慣用方式

[英]Idiomatic way to initialize a Ruby class

初始化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

通常在紅寶石中,像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")

關於這種替代方法的好處是,您可以選擇包括任意多個屬性,也可以允許任意排序。

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"

現在,盡管我完全理解了第二個為什么看起來更好,但從長遠來看卻很痛苦。 它在代碼中不必要的絨毛,最好通過更精簡的設計和或強大的工具消除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM