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

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 19:23
下一篇 2015-04-07 19:24

相關推薦

  • N22-第一周博客作業

    1、計算機的組成和及其功能? 計算機由硬件,操作系統,軟件三大部分組成。 硬件: 計算機系統中所使用的電子線路和物理設備,主要由中央處理器( CPU )、存儲器、外部設備(輸入輸出設備、I/O設備)及總線等組成。 a、中央處理器(CPU)的主要功能是根據存儲器內的程序 ,逐條地執行程序所指定的操作。中央處理器的主要組成部分是:數據寄存器、指令寄存器、指令譯碼…

    Linux干貨 2016-08-15
  • 一次css頁面加載異常的折騰

    1       原始需求 近期在搭建平臺,因多域名會分割流量,所以希望將類似 ansible.178linux.com  salt.178linux.com qa.178linux.com 這些平臺整合為一個平臺,所示如下 ansible.178linux.com =è www.178li…

    系統運維 2015-06-10
  • 馬哥教育網絡班21期-第六周課程練習

    第六周作業 請詳細總結vim編輯器的使用并完成以下練習題 1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; [root@qq tmp]# cp /etc/rc.d/rc.sysinit /tmp [root@qq&nbsp…

    Linux干貨 2016-08-02
  • N21天天第十五周課程練習

    1、總結sed和awk的詳細用法; sed Sed本質上是一個編輯器,但是它是非交互式的;同時它又是面向字符流的,輸入的字符流經過sed的處理后輸出。 Sed本身是一個管道命令,可以分析standard input的,主要是用來分析關鍵字的使用、統計等,此外還可以將數據進行替換、刪除、   選取特定行等功能 格式:sed&nbs…

    Linux干貨 2016-12-05
  • 邏輯卷管理—LVM

    邏輯卷管理—LVM   LVM:Logical  Volume  Manager        使用軟件方式來組織一個或多個底層硬件設備為一個抽象的邏輯設備。 1、查看分區情況: 2、創建分區:(更改分區類型為8e:Linux LVM) 3、創建分區成功: 5、創建物理…

    Linux干貨 2016-09-01
  • AOP面向方面編程

    1.引言         軟件開發的目標是要對世界的部分元素或者信息流建立模型,實現軟件系統的工程需要將系統分解成可以創建和管理的模塊。于是出現了以系統模塊化特性的面向對象程序設計技術。模塊化的面向對象編程極度極地提高了軟件系統的可讀性、復用性和可擴展性。向對象方法的焦點在于選擇對象作為模塊的主要單元,并將對象與系統的…

    Linux干貨 2015-04-07
欧美性久久久久