2010-02-12 66 views
7

我注意到在Ruby中,供應商API將結果作爲數組傳回的情況非常普遍?不應該普通的舊對象(像Java中的POJO)更像是一個標準嗎? 如果我寫我自己的圖書館不應該使用 的POJO 波羅斯?Ruby中的普通舊對象?

回答

3

這是所有的對象,所有的時間。關鍵是被返回的對象是否具有與其相關的行爲。它的優良做到這一點:

def read_first_and_last_name(data_source) 
    [data_source.read_string, data_source.read_string] 
    end 

但你會發現有一個與這些數據項相關行爲的那一刻...

def print_name(first_name, last_name) 
    puts "#{first_name} #{last_name}" 
    end 

    def read_and_print_name 
    first_name, last_name = read_first_and_last_name(data_source) 
    print_name(first_name, last_name) 
    end 

...那麼就應該是一個類:

class FullName 

    def FullName.read(data_source) 
     FullName.new(data_source.read_string, data_source.read_strng) 
    end 

    def initialize(first_name, last_name) 
     @first_name = first_name 
     @last_name = last_name 
    end 

    def print 
     puts "#{@first_name} #{@last_name}" 
    end 

    end 

與名稱的行爲很好地封裝,使用變得簡單:

def read_and_print_name 
    FullName.read(data_source).print 
    end 
4

我認爲陣列VS對象是一個錯誤的二分法。

這是完全合理的,API調用返回一個以上的事物,它是一個數組的形式(和一個數組是一個相當簡單的對象,因此可以說是'PORO',在紅寶石反正)

編輯:在回答您的意見:

你舉的例子(http://github.com/cjheath/geoip)返回不同的項目的數組。我同意這不一定是最好的格式來返回數據。在這種情況下,我會認爲一個具有明智命名鍵的散列會是一個更好的結構。

正如約翰·託普利說,紅寶石的OO性質意味着人們不必去創造這樣的術語爲「PORO」,作爲哈希是相當多的,你可以得到簡單。

+1

沒有,因爲你需要參考API文檔,以確定哪些值將在在什麼地點回來了。如果它在自定義對象中,則不必引用rdoc。 – Zombies 2010-02-12 13:56:29

+0

你實際上是指一個數組,你在數組的預定義點有不同的類實例嗎?你能鏈接到你所指的那種東西的例子嗎? – DanSingerman 2010-02-12 13:59:17

+0

http://github.com/cjheath/geoip ....這似乎是這些功能將在數組 – Zombies 2010-02-12 14:12:10

2

什麼結果這些陣列包含哪些內容?答案是在Ruby中它們包含對象,因爲Ruby中的所有東西都是對象。

的POJO在Java世界中是反對一些由企業級Java例如對世界造成的複雜的反應EJB的。引用馬丁·福勒誰創造了這個詞:

「我們想知道,爲什麼人們如此 反對他們 系統使用常規的對象,並得出結論,這是 因爲簡單對象缺乏看中 名稱,以便我們給了他們其中一個, 非常漂亮。「

幸運的是,在Ruby中,人們只需練習面向對象的編程就很自然,不需要圍繞它發明術語。

+1

我想我真正要問的是,如果有更好的方式來獲得命名屬性返回,爲什麼它不被更多地使用,所以也許我應該重新提出這個問題! – Zombies 2010-02-12 14:06:17

+1

其中一個原因可能是,諸如HTTParty這樣的Gems使得在Ruby中包裝Web服務變得非常簡單,並且免費獲得了返回的JSON或XML的輕量級對象包裝。 – 2010-02-12 14:08:59

2

我個人使用波羅斯在幾乎所有的東西我寫的不是一個完整的一次性腳本。

我發現自己經常創建一個數據持有者類,它可以管理和保存特定類型的多個對象,幷包含一些輔助方法。我發現當別人必須使用我的代碼時,這很方便。

我覺得這個問題是非常主觀的,因爲沒有一個答案總是正確的。有時候傳回數組很好,不需要創建額外的類。有時候額外的抽象層次會讓用戶更加清楚。

+0

這正是我想知道的。感謝您添加您的輸入。我不認爲這是主觀的,因爲我正在試圖去看看別人做什麼,並將所有這些考慮在內以供我自己的啓發。 – Zombies 2010-02-12 14:43:43