2013-04-30 45 views
0

我想盡量保持我的類封裝。任何我不應該使用這種發送方法的理由?任何我不應該用這樣的理由發送?

class MyClass 

    def self.join_two_strings(first, second) 
    new.send(:join_two_strings, first, second) 
    end 

    def join_two_strings(first, second) 
    first + second 
    end 

    private :join_two_strings 
end 
+0

可讀性。我發現MyClass.join_two_methods比MyClass.new.join_two_methods – stuartrexking 2013-04-30 05:52:07

回答

5

由於#join_two_strings實際上並不需要任何實例的狀態,它應該只是一個類的方法。

class MyClass 
    def self.join_two_strings(first, second) 
    first + second 
    end 
end 
+0

更容易閱讀。謝謝。 – stuartrexking 2013-04-30 06:03:19

0

是的,有理由不這樣做。這是因爲它是冗長的。爲了達到你想要的,你應該像Chris Heald的回答一樣編碼。 (Chris Heald建議你應該做什麼,但不回答你的問題)。

0

爲了更準確地使用#send來調用問題,它不是冗長,而是模糊了設計意圖。有時,詳細程度(例如使用完整的單詞而不是縮寫)可用於揭示設計意圖並縮短讀者瞭解代碼所需的時間。用你的代碼示例,讀者不相信你想要實現的僅僅是連接2個字符串,他們在繼續尋找更深的含義之前,承認它只是一個複雜的方法來做一件簡單的事情(並可能重構你的代碼就像Chris一樣)。至於#send本身,不要害怕它,不要害怕使用它。雖然#send不應該被用來作爲任意違反方法隱私的工具,但另一方面,Ruby方法是消息,你不必擔心在它有原因的情況下明確表示它。

相關問題