2013-04-30 46 views
4

我正在開發一個ruby項目,我們正在計劃使用ruby字符串進行一些操作。一些操作很簡單(比如計算單詞的數量),另外一些操作更復雜(比如檢查給定的字符串是否使用正確的語言)。猴子修補基礎ruby課是一個不好的做法嗎?

實現這種可能的方式是通過修補String類額外的方法,,而無需修改任何現有的方法,並添加行爲,如"some string".word_count"some string".cjk?

基於FileUtils的另一種方法是創建一個充滿方法的類或模塊,並始終使用字符串作爲參數,如OddClassName.word_count("some string")OddClassName.cjk?("some string")。我們喜歡第一個更好,因爲可讀性。

據我所知,修補第一個選項中描述的基本類的猴子可能會有名稱衝突。但是,如果這是主要的應用程序,而不是圖書館,我應該擔心它嗎?

所以,問題是:

  • 是添加方法與紅寶石基類一種不好的做法?如果是,那麼在所有情況下還是僅在某些情況下?
  • 完成此操作的最佳方法是什麼?
  • 什麼可能是'OddClassName'的名稱?

請提出任何替代方案。

+1

您使用的是哪個版本的Ruby?我相信2中有一些不同的猴子修補選項。0 – 2013-04-30 18:39:35

+0

@CharlesCaldwell我使用的是1.9,但如果它適合,也可以隨意在答案中加上2.0。 – fotanus 2013-04-30 18:42:25

+1

您不需要使用標題標記問題中的部分。 StackOverflow的外觀更加交談式,不太正式。刪除標題和您的問題將流動非常好。不過,一定要將諸如「Ruby」之類的名稱用於大寫。 – 2013-04-30 19:12:30

回答

4

猴修補是不被認爲是一種不好的做法,除非你正在寫沒有PatchedClass相關行爲古怪的方法(例如,String.monkeyPatchForMakingJpegFromString是相當糟糕,但Jpeg.fromString是不夠好。)

但是,如果您的項目相當大,您在其中使用的庫可能碰巧發生了碰撞補丁,所以您可能會遇到所有這些補丁的問題。在Ruby 2.0中,改進來幫助。它們的工作方式如下:在其中定義一個module,refine你的(甚至核心)類,然後在需要的地方使用該模塊。所以,在你的代碼它的工作原理爲:

YourClass.new.refinedMethodFromCoreClass #=> some result 

CoreClass.refinedMethodFromCoreClass 

產生undefined method例外。

這就是所有的猴子修補的東西:猴子修補是有用的和方便的,但改進增加了一些功能,使您的代碼更安全,可維護和整潔。

+0

感謝您的回答,您是否有這方面的參考:「猴子修補,基本上不被認爲是一種不好的做法」適用於基礎班? – fotanus 2013-04-30 19:08:40

+0

[採訪w/matz](http://fredwu.me/post/36493181321/an-interview-with-yukihiro-matz-matsumoto),第6個回答: – tkroman 2013-04-30 19:13:36

+0

謝謝,看來他告訴你可以擴展基類,但沒有告訴我們這是一個好的做法。反正考慮到這一點。 – fotanus 2013-04-30 19:24:14

1

我會使用一個新班級,稱之爲Doc或其他什麼東西,因爲讓字數和檢查語言聽起來像文件操作。

讓它將一個字符串作爲構造函數參數,並通過修改鏈來返回一個新的Doc。還給它一個返回字符串的to_s方法。

class Doc 
    def initialize(str) 
    @str = str 
    end 

    def to_s 
    @str 
    end 

    define word_count, cjk?, etc. 
end 

Doc.new("Some document").word_count 
# => 2