2009-01-06 127 views
8

這是更具體的問題,然後是語言特定的,但我在使用python ncurses模塊時遇到了這個問題。我需要顯示區域設置字符並將它們識別爲字符,所以我只是快速地從curses模塊中修改了一些函數/方法。猴子補丁或不?

這就是我稱之爲快速和醜陋的解決方案,即使它有效。這些變化相對較小,所以我希望我沒有搞砸任何事情。我的計劃是找到另一個解決方案,但看到它的工作和運作良好,你知道它是怎麼回事,我去了我不得不面對的其他問題,我敢肯定,如果沒有錯誤,我永遠不會使它更好。

雖然我看到了更一般的問題 - 顯然有些語言允許我們在類內部修改大塊代碼。如果這是我僅用於我自己的代碼,或者更改很少,那沒關係。如果其他開發人員需要我的代碼,他會發現我使用了一些衆所周知的模塊,因此他可以假設它已經適用。然後,這個方法突然表現出不同,然後它應該。

所以,非常主觀,我們應該使用猴子修補,如果是的話,何時以及如何?我們應該如何記錄它?


編輯:用於@guerda:

猴修補是動態地改變在執行時間一些一段代碼的行爲,而不改變代碼本身的能力。

一個小例子在Python:

import os 
def ld(name): 
    print("The directory won't be listed here, it's a feature!") 

os.listdir = ld 

# now what happens if we call os.listdir("/home/")? 
os.listdir("/home/") 
+1

您能否簡要解釋一下新手「猴子補丁」?謝謝! – guerda 2009-01-06 09:05:44

+2

+1這是主觀的和議論性的,就像大多數好的問題上SO – 2010-02-24 21:40:52

回答

6

不要!

尤其是使用免費軟件,您可以將所有可能的變化引入主發行版。但是,如果您在本地副本中存在虛弱記錄的黑客攻擊,則永遠無法發佈產品並升級到下一版本的curses(任何安全更新)都會花費很高。

請參閱this answer瞭解外國代碼庫中可能的內容。 linked screencast真的值得一看。突然間一個骯髒的黑客變成了一個寶貴的貢獻。

如果無論出於何種原因,您確實無法獲得上游補丁,至少需要創建一個本地(git)補丁來追蹤上游並在獨立分支中進行更改。

最近我遇到了一個問題,我必須接受猴子補丁作爲最後的手段:Puppet是一個「無處不在」的紅寶石代碼。由於代理必須在潛在認證的系統上運行,因此它不需要特定的ruby版本。其中一些錯誤可以在運行時通過猴子修補選擇方法解決。這些補丁是版本特定的,包含的,並且目標被凍結。我在那裏看不到其他選擇。

4

我會說沒有。

每個猴子補丁都應該是一個例外,並標記(例如用// HACK註釋),這樣它們很容易追溯。我們都知道,將醜陋的代碼留在原地很容易,因爲它很有用,所以爲什麼還要花更多的時間。所以這個醜陋的代碼將會在那裏很長一段時間。

-1

一個字:oscommerce。

如果你從來沒有與播放之前它與

// BOF: Fixed/added/removed bla bla bla 
... 
// EOF 

百病不提的是,整個代碼庫已經退化由於「放功能,不論身在何處」的心態。較新的編程概念,例如OO(想起繼承和複合類)是爲了解決這些非問題而設計的。使用它們!

0

我認爲這個問題不能用一個明確的是 - 否/好 - 壞答案來解決 - 必須考慮語言與其實現之間的差異。

在Python中,我們需要考慮一個類是否可以被猴子修補(參見SO question的討論),這與Python的稍微OO實現有關。所以我會保持謹慎,並傾向於在猴子補丁之前花費一些努力尋找替代品。

在Ruby中,OTOH被構建爲OO到解釋器中,可以修改類,而不管它們是用C還是Ruby實現的。甚至對象(幾乎所有的基類)都可以修改。所以猴子補丁在這個社區中更加熱情地被採用作爲技術。

3

我同意David在猴子補丁生產代碼通常不是一個好主意。

但是,我相信對於支持它的語言,猴子修補是一個非常有價值的單元測試工具。它允許你隔離你需要測試的代碼段,即使它有複雜的依賴關係 - 例如系統調用不能被依賴注入。