實用重構
回答
從您的角度來看,什麼是重構?
各種以改善其結構,優化某些代碼度量和一般使它更適合當今的需求,舊的代碼庫的作品。
如何,什麼時候做?
在最好的情況下,這項工作是以代碼審查的形式定期完成的。這應該是一個預防性的活動,爲時已晚。當它爲時已晚,當你看到一部分代碼處於崩潰的邊緣時,如果你試圖觸摸它來添加新的功能,那麼你會這樣做。另外,當代碼結構不再適合新增加的特性時,只是爲了目前對項目需求的理解和未來發展的方向。
根據Wikipedia,重構是「改變計算機程序的源代碼而不修改其外部功能行爲以改進軟件的某些非功能屬性的過程」。
我傾向於這樣做時,該代碼開始變得要麼所以難以維持或效率低下,這是值得花時間和精力去返工的代碼。當我即將開始處理將要添加一些新功能的程序的更新版本時,也可能會發生重構。在原始版本中需要對程序的外觀沒有任何影響的更改,以便更好地支持新版本中的新增內容。
重構是看舊代碼和收緊起來的過程,同時確保它仍然有效。有一對夫婦的方式做重構:
- 是否有可能在另一個函數來實現任何重碼/操作?
- 是不是一個班級變得太臃腫,有很多責任?
- 有沒有辦法將這一類的變化與影響他人分開?
通常我做一個測試驅動開發的一部分。首先,設置單元測試,然後編寫代碼的第一遍以使其具有功能,但它可能很難看。接下來,整理代碼,實現設計模式等,並使用單元測試來確保您的更改不會破壞代碼。
重構僅僅意味着改變程序的設計或程序的一部分。在面向對象的編程中,它通常意味着你重新思考你的類層次結構。
它做的原因很簡單,因爲你知道,早期的設計決定是錯了,這將是從長遠來看,更好地使這個大的變化,讓你有正確的設計。
某些IDE的Visual Studio有重構工具,例如有能力選擇代碼並將其提取到方法中,或者輕鬆地重命名變量。如果沒有這些,重構必須手動完成,因爲它通常用C++等語言完成,而這些語言很難自動重構。
重構正在改變現有代碼的設計,同時保持功能不變。
這個想法是,你改變了設計,以使新功能更容易實現。
關於何時做重構:當需要它
- (有人發現可以改進的問題)
- ...和項目狀態(調度,團隊負載)允許它
- ...以及這些變化會產生副作用的風險是可控的和可接受的
- ......花費在重構上的努力在可維護性,代碼重用或項目開發的任何其他方面支付回報。
從您的角度來看,什麼是重構?
作爲一個純粹的學術定義,重構是現有代碼中的一種材料改變,它不會(理論上)影響行爲或輸出。
從實際意義上講,它可以是各種各樣的東西。作爲一個小例子:
- 移動重複的代碼塊到專用功能
- 給予變量更清晰或更具體的名稱
- 塗改類之間的關係,以更好地反映真實世界的關係(或類重新設計一般)
- 解耦先前相互依存的代碼
如果聽起來這些示例中的很多應該是預先完成的,那是有意的;很多重構只是簡單地將你寫的代碼改寫成應該是已經寫過的代碼(雖然,公平地說,很多重構也是不符合)。
如何,什麼時候做?
「什麼時候」既短又很沒有幫助:什麼時候可以,什麼時候必須。
當您的可以時,務必確保您編寫的代碼不會在未來削弱(或妨礙)您。如果您預先通過快捷方式準時發貨,那麼您可能會在將來期間獲得一定的機會,爲重構貢獻一點時間。有「下一次」的想法,不過,顯然只是在商業世界的一個神話;)
時需要重構通常是一個主觀判斷,說的時候「這將花費更少的時間,爲球隊將這些代碼重構爲它需要進行的修改(或者修復這個錯誤),而不是將它編寫成適合其中的內容的方式「。這種情況應該像瘟疫一樣避免;因爲你正在改變已經(希望)已經被測試過的東西,所以重構比一般新代碼更危險(一般來說)。根據定義,在「時間緊縮」下做這件事更加危險。
與大多數維護編碼一樣,重構幾乎沒有短期收益(畢竟,您不會改變輸出)。好處包括正確的前期設計,以減少未來維護負擔和更快(並且希望更可靠)的變化形式。
上檔,重構可以是愉快的(雖然它也可以在某些時候,狂攬)
重構是產生從不可維護代碼地獄維護的代碼的過程。
I.e.如果你有類似的東西在你的代碼它是真的,真的時間去重構它:
function show_movies($num=10, $maxpages=10, $order_by="M.produced DESC", $rand=0)
{
global $template, $off, $cat, $cat_long, $cat_field, $lang, $mid, $cat_long2, $sfm;
global $sea, $seaquery, $lng, $sub, $aff, $spe, $da, $cat_not, $PHP_SELF, $HTTP_HOST;
global $q, $_SESSION, $VC_LANG, $john;
[... snip 356 lines of code that works with all those variables ...]
}
(可悲的是,這是代碼我有工作,我有沒有時間來重構它...哦,如果有人想知道,$ john啓用調試模式,並通過register_globals來獲取GET ...我討厭我的生活)
通常重構是在你還在開發時完成的,涉及到「構建一次就扔掉它」。您首先開發工作代碼,然後重構它以創建可工作的代碼和。
在許多情況下,第二步被您的前任人遺忘,而且您(幾乎)沒有可維護的工作代碼。通常它被總結爲(通常是錯誤的)遺留代碼,存在的代碼,沒有人想要觸摸,但驅動整個業務。在這種情況下,您會嘗試將代碼拆分爲多個部分,編寫測試並確保新代碼完全符合舊代碼的功能,更好,更清潔。
重構就是讓您的代碼更易於維護。
實際上,軟件的要求正在不斷變化,導致軟件的不斷變化。一段時間後,軟件開始變得複雜。正如雷曼在他關於軟件演化的傑出工作中所正確闡述的那樣,「隨着系統的發展,除非維護或減少工作,否則其複雜性會增加」。因此,我們必須定期降低軟件的複雜性,這就是爲什麼需要重構的原因。
- 1. 重構實施
- 2. 重構Zend_Auth實現
- 3. 曲線重構實現
- 4. CSS重構最佳實踐
- 5. 重用,重寫或重構?
- 6. 用core.logic重構
- 7. Rails radio_button重構最佳實踐
- 8. 將Hibernate實體重構爲子類
- 9. 如何重構JS預輸入實例
- 10. 貝葉斯點雲重構實現
- 11. 重構測試vs實現Rails和Capybara
- 12. 重構實例聲明中的方法
- 13. 重構iSeries(RPG),是否真實
- 14. 拆分臨時變量重構實例
- 15. 重構全局實例的指針
- 16. 匿名類型爲真實類重構
- 17. 代碼重用和重構
- 18. 用XSL重構XML
- 19. golang重用結構
- 20. 用模式重構
- 21. 將顯式接口實現重構隱式接口實現
- 22. 接口中方法的重複實現。重構
- 23. 重構實體框架代碼使用視圖而不是表?
- 24. 重構許多jQuery Ajax調用 - 最佳實踐?
- 25. 如何使用重構瀏覽器添加實例變量?
- 26. 我需要重構這個類而不使用實例變量
- 27. 重構服務注入/實例在Grails應用程序
- 28. 如何用最新的NVD3重構實現圖表動畫?
- 29. 你如何構建你打算重用的實體?
- 30. 使用實體框架和重構異步/等待問題
可能的重複:http://stackoverflow.com/questions/128498/what-are-the-best-code-refactoring-strategies – bignose 2010-03-22 13:36:21