2011-11-21 46 views
3

我目前工作的一個Rails項目,並且已經發現時間它是最容易做的圍繞對象的類來控制流/條件是否糟糕?

if object.class == Foo 
    ... 
else if object.class == Bar 
    ... 
else 
    ... 

我開始在我需要不同的方式顯示不同的對象的意見這樣做,但發現自己使用它在現在的其他地方,比如在以對象作爲參數的函數中。我不確定爲什麼,但我覺得這不是好習慣。

如果不是很好的做法,爲什麼這樣呢?

如果這完全沒問題,那麼有人可能想要特別使用它的時候?

謝謝!

回答

3

不知道爲什麼這對你有用。當你需要測試object是否Foo類的實例,你應該使用

object.is_a? Foo 

但無論如何它不是在Ruby中一個很好的做法。只要有可能,使用多態就會好得多。例如,如果代碼中的某處可以有兩個不同類的對象,並且需要以不同的方式顯示它們,則可以在兩個類中定義display方法。之後,您可以撥打object.display並使用相應課程中定義的方法顯示對象。

該方法的優點是,當您需要添加對第三類或一大堆新類的支持時,您需要做的就是在每個類中定義display方法。但是在實際使用此方法的地方沒有任何變化。

+0

''to_s''將會從'object.class'返回的類名上被調用,以嘗試使類型兼容,所以它應該工作。另外'==='將用於檢查類型。'object === Foo' –

+0

在1.8.7和1.9.2中試過它:'object.class == A'工作正常(甚至沒有'==='),但是'object.class =='A' '不起作用。 –

+0

是的,我很累,並不意味着把雙引號。編輯問題以供將來參考,謝謝你的回答! –

2

使用子類型表示類型特定行爲更好。 讓物體知道它們是如何顯示的。創建一個方法Display()並將所有需要的外部參數作爲參數傳遞。讓「Foo」知道顯示foo和「Bar」知道如何顯示欄。

有很多關於用多態性替換條件的文章。

+0

一些示例文章:http://www.artima.com/interfacedesign/PreferPoly.html –

+0

StackOverflow問答http://stackoverflow.com/questions/4192837/how-does-one-use-polymorphism-instead-of- instanceof-and-why –

+0

感謝您的鏈接!我一定會閱讀他們。 –

2

由於幾個原因,這不是一個好主意。其中之一是duck typing - 一旦開始在代碼中明確檢查對象類,就不能再簡單地傳遞與原始對象相似的不同類的實例。這使代理,嘲笑和其他常見的設計技巧更難。 (該點也可以概括爲破壞了封裝,它可以說,對象的類是一個實現細節,你作爲消費者應該沒興趣。殘破的封裝≈緊耦合≈痛苦。)

另一個理由是可擴展性。當你有一個巨大的對象類型切換並且想要添加一個事例時,你必須改變切換代碼。例如,如果此代碼嵌入到庫中,則庫用戶不能簡單地擴展庫的行爲而不更改庫代碼。理想情況下,對象的所有行爲都應該是對象本身的一部分,以便通過添加更多對象類型來添加新行爲。

如果您需要以不同方式顯示不同的對象,難道您不能簡單地將繪圖代碼作爲對象的一部分嗎?

+0

謝謝,你描述的觀點完全是我的疑慮!我絕對同意你和KL-7的看法,即製作顯示方法是最明智的方法。 –

相關問題