只要你想,哪怕是初學者也能夠對代碼進行重構。php
重構是創建在代碼正確能夠運行的基礎上對其進行優化、改進的過程,咱們要作的是使能知足最基本的需求的代碼變得更易讀、易維護、效率更高 。thinkphp
這裏介紹的是最基礎的一些重構的方法。要想系統的學習,能夠看這本書《重構:改善代碼的既有設計》設計模式
1.易讀:框架
咱們寫的代碼是給別人看的,寫完的代碼你不可能永遠維護着,因此有必要讓本身的格式代碼更容易被別人看懂。less
(1)足夠多的換行、空格 ,反正解析代碼的時候並不會解析這些空白的部分,不用白不用啊,還能顯的代碼行數多呢^^學習
(2)要作到這一點,最簡單的是添加足夠的註釋,說明類和方法的功能,方法的入參出參的含義、格式,方法中關鍵語句的邏輯;優化
(3)命名方式:用直白的類名、方法名、變量名,用駝峯型(或其餘大家項目組規定的變量格式),用$a,$123這樣變量名的哪怕加了註釋也是夠了的。設計
2.不重複:對象
(1)類的功能不該該重複:若是重複了說明你應該考慮使用類的繼承的繼承
(2)方法的功能不該該重複:哪怕是在不一樣的類中,完成相同功能的方法用同一個就能夠了,將方法的屬性設置爲public就能夠被別的類調用了。若是有不少這樣通用的方法,不妨創建一個專門的類存放這樣的方法,不至於在調用的時候亂了手腳;
(3)重複使用變量:在類中頻繁的使用某個變量,能夠考慮建立一個全局的變量取代它,下降內存的耗用;
3.使用設計模式進行重構
通俗的說,模式就是前面不少人在進行相同的需求開發,發現本身累死累活的作出來的東西基本都是大同小異的,那麼幹嗎不建立一種模板,之後碰到相似需求開發的時候,直接套用不就行了。
《深刻php對象、模式與實踐》一書中講了這樣一個栗子:
假設有這麼一個基類Lesson表示新東方的課程,Lesson類有兩個子類:ChineseLesson類表示語文課程,EnglishLesson類表示英語課程;按照上課的形式分爲白班和晚班兩種,上課的課時和收費都不同;
因而按照傳統的方法會先創建5個類:Lesson類 - ChineseLesson類 - DayChineseLesson類()和NightChineseLesson類
- EnglishLesson類 - DayEnglishLesson類和NightEnglishLesson類,如圖所示:
底層的4個子類中分別包含了課程安排的方法lesson()和收費的方法charge()
若是後面有更多種的課程或更多通用的方法(必然會如此),代碼重複狀況就更嚴重了,重複意味着高耦合,這是一種很差的現象
一種比較好的解決方案是採用策略模式,經過剔除最底層的方法將Lesson類 - ChineseLesson + EnglishLesson 簡化,建立一個策略類Strategy類 - DayStrategy + NightStrategy 。
將Lesson類和Strategy類組合起來,經過建立Strategy類的子類添加新的課程安排或收費模式,而且不會影響到Lesson類,如圖所示
經常使用的設計模式:單例模式、策略模式、觀察者模式、工廠模式……
經常使用的框架:Yii,thinkphp,CI……