2008-09-19 22 views
5

我最近參與了一個基於網絡的遊戲使用PHP編寫的引擎的項目。遊戲運行良好,但可能更強大,並有更多的功能 - 而且代碼既舊又相當醜陋。你如何重構你的舊PHP代碼?

這段代碼的問題(以及我懷疑的一般PHP代碼)的問題在於它已經發展到了它所處的位置,結構也不是很好,有很多幾乎相同的剪切/粘貼代碼片斷,即使在涉及功能的情況下也大量使用全局變量。當然,在任何地方都不是單一的單元測試,並且代碼被硬編碼爲使用特定的數據庫,並依賴於調用代碼的網頁中的$ _REQUEST字符串。

正確的做法是將部分代碼作爲子函數進行抽取,整理並添加一些單元測試以確保它繼續工作,並在此過程中添加一些模擬對象。然而,完全用手完成這件事是很乏味和容易出錯的,我想知道你是如何做到這一點的 - 有沒有一個IDE或工具可以幫助你,例如?我想有一個工具,可以幫助產生一個定義的代碼段的功能,建議哪些變量應該是參數,按價值或參考,自動添加$ this-> reference等。

這是太多了問,還是有一個很好的解決方案?

謝謝!

回答

11

艾倫,我從來沒有見過一個功能強大的重構工具。即使Eclipse的Java重構也沒有完成這個功能。但是,重構有一些常見的提示。我通常分兩步重構應用程序。

1.把東西分開。我提取數據庫和模型相關的東西,並從主代碼中提取它們。一些對象表示會有所幫助。檢查Active RecordDAO模式爲任何ORM工作。 HTML代碼可以從主代碼中移除並移至模板文件。查看漂亮的模板引擎,強大支持查看邏輯處理 - Smarty

2.將東西放入MVC框架。MVC是一個強大的架構,非常適合web應用程序。使用PHP框架之一將鬆散的PHP文件綁定到控制器方法中。框架可以輕鬆管理URL,HTTP請求,傳遞參數,管理登錄信息,並且通常提供一些訪問控制機制。

但最重要的是:不要破壞無法修復的東西。這是重構,而不是再開發;-)

0

我感到你的痛苦。不過,我從來沒有聽說過這樣的工具,至少不會用於PHP。

0

我不認爲語言的結構足夠允許任何形式的半自動重構。無論如何,我不知道任何可以做到這一點的應用程序,但從光明的角度來看 - 手工完成所有這些都將使您對源代碼非常熟悉,它可能會在以後幫助您瞭解比您更好的方法將與自動化工具。

9

這篇文章真的突出的重構/重建舊醜陋的代碼的危險:

http://www.1729.com/blog/EconomicsOfTestingUglyCode.html

我的做法一般是一次解決一個小問題,這將啓動將大部分舊代碼隱藏在接口後面,可以在「稍後」處理,而不會影響任何新代碼。這樣,我寫的任何東西都可以精心設計,並且具有堅實的結構,但是我不必浪費太多時間來重構,然後測試幾周/幾個月/幾年的錯誤代碼。

+0

鏈接斷開,顯然不再在網上。 – Kzqai 2013-03-15 15:58:28

+0

[本文](http://thinkinghard.com/blog/EconomicsOfTestingUglyCode.html)具有相同的標題,並且在2008年與@David的答案日期一致。 – 2013-07-29 21:50:25

1

沒有工具將採取fugly代碼,並以某種方式再次使它很好。短語「回到公式」是一個成熟的項目相當可怕的前景,但與我裸...

我建議你將它移植到一個體面的MVC框架。在這樣做的時候,做結構重寫可能不是一個糟糕的時間,所以你的所有類都被優化了(這些東西在進化代碼中很少發生)。這將需要很長時間,並且如果事情不能按預期工作,將會有痛苦。

這是一個很大的步驟,但這是代碼被腐爛時發生的情況。

你的其他選擇:

  1. 做一個局部的重組,所有新的代碼都遵循一套制度,舊的代碼緩慢重建。
  2. 只是修復你的錯誤,不做重組。
-1

根據我的經驗,在這種情況下完全重寫會更經濟。