重構-改善既有代碼的設計:重構原則(二)

1.什么是重構

重構(Refactoring):在不改變軟件的功能和外部可見性的情況下,為了改善軟件的結構,提高清晰性、可擴展性和可重用性而對軟件進行的改造,對代碼內部的結構進行優化。

2.為何重構

  1)改進軟件設計(整理代碼)

重構和設計是相輔相成的,它和設計彼此互補。有了重構,你仍然必須做預先的設計,但是不必是最優的設計,只需要一個合理的解決方案就夠了,如果沒有重構、程序設計會逐漸腐敗變質,愈來愈像斷線的風箏,脫韁的野馬無法控制。重構其實就是整理代碼,讓所有帶著發散傾向的代碼回歸本位。

  2)提高代碼質量和可讀性,使軟件系統更易理解和維護

 "任何一個傻瓜都能寫出計算機可以理解的程序,只有寫出人類容易理解的程序才是優秀的程序員"。有些程序員總是能夠快速編寫出可運行的代碼,但代碼中晦澀的命名使人暈眩得需要緊握坐椅扶手,試想一個新兵到來接手這樣的代碼他會不會想當逃兵呢?

軟件的生命周期往往需要多批程序員來維護,我們往往忽略了這些后來人。為了使代碼容易被他人理解,需要在實現軟件功能時做許多額外的事件,如清晰的排版布局,簡明扼要的注釋,其中命名也是一個重要的方面。一個很好的辦法就是采用暗喻命名,即以對象實現的功能的依據,用形象化或擬人化的手法進行命名,一個很好的態度就是將每個代碼元素像新生兒一樣命名,也許筆者有點命名偏執狂的傾向,如能榮此雅號,將深以此為幸。

對于那些讓人充滿迷茫感甚至誤導性的命名,需要果決地、大刀闊斧地整容,永遠不要手下留情!

  3)幫助盡早的發現錯誤(Defects)

孔子說過:溫故而知新。重構代碼時逼迫你加深理解原先所寫的代碼。程序員經常對自己的程序邏輯不甚理解的情景,曾為此驚悚過,后來發現這種癥狀居然是許多程序員?;嫉?quot;感冒"。當你也發生這樣的情形時,通過重構代碼可以加深對原設計的理解,發現其中的問題和隱患,構建出更好的代碼。

  4)提高編程速度

良好設計是維持軟件開發速度的根本,重構可以幫助你更快的開發軟件。因為它防止系統腐敗變質。甚至還可以提高設計質量。當你發現解決一個問題變得異常復雜時,往往不是問題本身造成的,而是你用錯了方法,拙劣的設計往往導致臃腫的編碼。

    改善設計、提高可讀性、減少缺陷都是為了穩住陣腳。良好的設計是成功的一半,停下來通過重構改進設計,或許會在當前減緩速度,但它帶來的后發優勢卻是不可低估的。

3.何時重構

    1)重構應該是隨時隨地進行。不應該為重構而重構。
    2)三次法則:第一次做某件事只管去做;第二次做類似的事會產生反感,但無論如何還是可以去做 第三次 再做類似的事情,就應該重構了。
    3)添加功能
    4)修復bug
    5)復審代碼,即Code Review時候
    重構可能會引入更多見階層,重構往往需要把大型對象拆成多個小型對象。把大型函數拆成多個小型函數。間接層是把雙刃劍:一是你需要管理多分內容。
    但間接層有以下作用:
    1)允許邏輯共享,小函數復用性高。
    2)分開解釋意圖和實現:可以選擇類名和函數名解釋實現意圖的做法。
    3)隔離變化
    4)封裝條件邏輯:對象有一種奇妙的機制:多態消息,可以靈活而清晰地表達條件邏輯。將條件邏輯轉化為消息形式,往往能降低代碼的重復。增加清晰度并提高彈性。

4.何時不該重構

    1)代碼是在太混亂了,設計完全錯誤。
    2)如果項目已近最后期限,應該避免重構。  

    3)重構還不如重新編碼。即重構的工作量顯著的影響Estimate 

5.重構流程

   1)讀懂代碼(包括測試例子代碼)

   2)進行重構

   3)運行所有的Unit Tests 

6. 重構與設計

    1)很多人都把設計看作軟件開發的關鍵換進。而把編程看作只是機械式的低級勞動。
    2)另外的觀點就是:重構可以取代預先設計。你不必要做任何設計,只管按照最初的想法開始編碼,讓代碼運作,然后再將它重構成型。

    實際上重構與設計是互補的,程序應該是先設計,而在開始編碼后,設計上的不足可以用重構來彌補.設計應該是適度的設計,而不必過度的設計.如果能很容易的通過重構來適應需求的變化,那么就不必過度的設計,當需求改變時再重構代碼 。

7.重構與性能

    三種快速編寫軟件的方法:

   1)時間預算法

        在設計時就對程序花費的時間進行預算,通常用于性能要求極高的實時系統.普通的企業應用程序一般對性能要求不高.只要不太慢就可以了 。

   2) 持續關注法

        要求程序員在任何時間都要設法保持系統的高性能.這個方法有個缺陷,就是大部分的程序90%的優化工作都是白費勁,這樣會浪費大量的時間 。

   3) 良好的分解方式

       這個方式是在開發程序階段不對性能投以任何關注,直到進入性能優化階段,再分析程序中性能差的程序,然后對這些程序進分解,查出性能差的程序,進行優化。

轉自:http://blog.csdn.net/hguisu/article/details/7591081

原創文章,作者:s19930811,如若轉載,請注明出處:http://www.www58058.com/2821

(0)
s19930811s19930811
上一篇 2015-04-07
下一篇 2015-04-07

相關推薦

  • Hadoop集群配置(最全面總結)

    通常,集群里的一臺機器被指定為 NameNode,另一臺不同的機器被指定為JobTracker。這些機器是masters。余下的機器即作為DataNode也作為TaskTracker。這些機器是slaves\ 官方地址:(http://hadoop.apache.org/common/docs/r0.19.2/cn/cluster_setup.ht…

    Linux干貨 2015-04-13
  • 馬哥教育網絡班21期+第12周課程練習

    httpd學習前知識必備: I/O類型 同步和異步 synchronous asynchronous  關注的是消息通知機制,如何通知調用者,站在被調用者的角度 同步:調用發出后不會立即返回,一旦返回即是最終結果 異步:調用發出后會立即返回消息,但不是最終結果,被調用者通過狀態,通知機制,或回調函數處理結果 阻塞和非阻塞 block nonbloc…

    Linux干貨 2016-08-15
  • LInux系統啟動與內核管理(下)

    從上一篇介紹了系統啟動流程可以得知,在BIOS讀取相關信息之后,接下來就是去找第一個可以啟動的設備當中的MBR中讀取Boot Loader信息,Boot Loader提供具有慘淡功能,直接加載內核信息,以及相關的控制權轉交功能。啟動系統必須有Boot Loader,然后才能去加載內核,Boot Loader存儲于MBR當中,MBR只有512字節,其中前446…

    Linux干貨 2016-09-19
  • iptables的DNAT、SNAT配置

    DNAT:目的地址轉換。當外網主機訪問內網的某臺服務器的時候,如果直接暴露服務器的IP于公網,可能會遭受各種各樣的攻擊,而DNAT的主要作用就是在服務器前面添加一臺防火墻。將防火墻的地址公布出去,讓外網客戶端通過訪問防火墻的地址就可以訪問到本地服務器。這樣就起到了保護服務器的目的; SNAT:源地址轉換。內網主機在訪問互聯網的時候所有源地址都轉換為防火墻的外…

    2017-06-12
  • 群集簡介和LVS_nat模式配置

    群集簡介: 群集(或集群)和稱呼來自于英文單詞cluster,表示一群、一串的意思,用在服務器領域則表示大量服務器的集合體,以區分于單個服務器。 根據實際企業環境的不同,群集所提供的功能也各不相同,采用的技術細節也可能各有千秋,但無論哪種群集,都至少包括兩臺節點服務器。而對外表現為一個整體,只提供一個訪問入口(域名或IP地址),相當于一臺大型計算機。根據群集…

    Linux干貨 2017-02-13
  • 0803linux基礎小記

    讓普通用戶無法登錄: centos 6  touch /etc/nologin echo "wating" > /etc/nologin 普通用戶登錄時不能進入系統,有提示信息 centos7  touch /etc/nologin 或touch /run/nologin  chage -l …

    Linux干貨 2016-08-05
欧美性久久久久