嵌入式軟件的重構-總論



單擊此處編輯母版樣式,單擊此處編輯幻燈片母版樣式,第二層,第三層,第四層,第五層,*,*,*,輕松,自如的培訓氛圍,咖啡,泡茶時間:5分鐘,“咖啡,,茶,果珍”,1,嵌入式軟件的重構系列培訓,總論,李春生,2004年05月13日,2,通過本次課程,你想學到什么?,3,本次培訓內(nèi)容,重構的定義,;,嵌入式軟件的重構,;,壞味道;,重構的實例(6個),;,重構在現(xiàn)實開發(fā)中的推廣和障礙;,成立重構研究小組;,4,什么是程序?什么是軟件?,5,一,、重構的定義,6,重構關于本次培訓,培訓取材:,重構改善既有代碼的設計,高度評價:,和設計模式并列為“,JAVA,行業(yè)的圣經(jīng);,GOF,,四巨頭的重視;,適用性 :,面向?qū)ο蟮某绦蛟O計,重構功能:,增加程序的可性,可維護性,可測試性,,模塊化和單元測試的必然基礎;,7,重構我的感受,改善軟件質(zhì)量:,可讀性,可測試性,可維護性;,質(zhì)量活動的開展:,單元測試,同行評審,培訓,模塊化;,提高軟件的開發(fā)能力:,讓重構成為程序員開發(fā)準則和習慣;,獨特的特征 :,和編程規(guī)范不同,是一種動態(tài)的行為;,軟件工程 :,真正擺脫作坊式的軟件開發(fā),走向正,規(guī)開發(fā)的必然之路;,8,重構的至理名言,任何一個傻瓜都能寫出計算器可以理解的代碼,唯有寫出人類容易理解的代碼,才是優(yōu)秀的程序員;,事不過三,三則重構;,當你接獲bug提報,請先撰寫一個單元測試來揭發(fā)這個bug;,當你感覺需要撰寫注釋,請先嘗試重構,試著讓所有的注釋變得多余;,當你發(fā)現(xiàn)自己需要為程序增加一個特性,而代碼結構使你無法方便的這樣做,就先重構那個程序;,9,重構的至理名言,重構之前,必須建立一套可靠的測試機制;,寫軟件就像種樹,優(yōu)秀的程序員挖成小坑后隨及填好,繼續(xù)挖下一個,只會產(chǎn)生一系列小坑,不會有大坑,,菜鳥則不會意識到所挖的坑正在變大,還是不停的挖,直到自己掉進大坑,爬不出來,陷入無盡的痛苦深淵;,開發(fā)時間越長,越能體會垃圾代碼的痛苦,卻不知道如何改進;,Kent Beck:我不是一個偉大的程序員,我只是個有著一些優(yōu)秀習慣的好程序員而已;,10,重構的定義:,對軟件內(nèi)部結構的一種調(diào)整,目的是在不改變軟件之可察性前提下,提高其可理解性,降低其修改成本。
11,重構的作用,改進軟件設計;,有使軟件更易被理解;,幫助你找到,BUG;,幫助你提高編程速度;,12,重構作用的高度總結,增加軟件的可讀性,可維護性,可測試性;,單元測試,同行評審,培訓的完美組合;,模塊化的必然之路;,軟件開發(fā)的長遠眼光,未來的受益者;,從編碼層次上升的軟件設計層次;,13,重構的起源?,我們或多或少都做過的事情;,更多的存在于專家領域;,優(yōu)秀程序員的自覺行為與菜鳥的被迫行為;,沒有總結,提煉成一種思想,一種標準來指導我們;,14,二,、嵌入式軟件的重構,15,嵌入式軟件的重構,缺點,I.,面向?qū)ο蟮能浖O計和結構化設計不一樣;,II.,側重于軟件的設計而不是具體的實現(xiàn);,III.,面向?qū)ο蟮暮诵睦^承和多態(tài)在結,構化設計中無法表達;,IV.,嵌入式軟件更多的和硬件打交道,更注重,軟件的實現(xiàn),面向?qū)ο蟮能浖t重視軟件,的設計和復用;,16,嵌入式軟件的重構,優(yōu)點,I.,軟件的核心思想是一樣的;,II.,函數(shù)和數(shù)據(jù)都和面向?qū)ο蠡疽恢?,原有?class,可以轉換成模塊的思想,對象之間的重,構可以看作模塊之間的重構III.,代碼模塊相當于面向?qū)ο蟮念悾?IV.,共同的軟件質(zhì)量屬性可測試性,可讀性,,可維護性;,V.,嵌入式軟件代碼規(guī)模小,更適合重構,見效,更快;,17,三,、壞味道,18,壞味道,改進軟件,最重要的是要知道改進哪里,Kent給了我們很生動的描述“壞味道”。
當我們察看代碼的時候,每個人的嗅覺是不一樣的,嗅覺靈敏的一下子就可以察覺到那些壞味道的存在;,嗅覺能力是需要培養(yǎng)的,這就是資深工程師和入門者之間的差別19,壞味道舉例,重復的代碼:,如果你在一個以上的地點看到相同的程序結構,那么可以肯定:設法將它們合而為一,程序?qū)⒆兊酶眠^長函數(shù):,程序愈長愈難理解更應該積極的分解函數(shù),需要注釋的地方提煉出去條件式和循環(huán)常常也是提煉的信號過小結構:,過多單一全局變量,合并成結構進行統(tǒng)一管理數(shù)據(jù)泥團:,參數(shù),變量數(shù)據(jù),函數(shù)集中管理,修改成結構20,壞味道舉例,過多參數(shù)列表:,函數(shù)調(diào)用太多的參數(shù)模塊信息的封裝:,提供過多的接口,內(nèi)部變量泄漏,沒有實現(xiàn)信息的隱藏過大結構:,按功能結構劃分,裁減到舒服的使用過度耦合:,模塊之間關系不清晰,高內(nèi)聚,低耦合21,討論,在你的代碼里,有哪些壞味道?,你的嗅覺如何?,22,四,、重構舉例,23,一,、,重新組織你的函數(shù),重構手法中,很大一部分是對函數(shù)進行整理處理過長代碼,重復代碼是最重要的功能之一24,重構方法提煉函數(shù):,1)小結:有一段代碼可以被組織在一起獨立出來,將這段代碼放進一個獨立函數(shù)中,并讓函數(shù)名稱解釋該函數(shù)的用途。
2)動機:對付過長的函數(shù),對付重復代碼;,3)好處:復用機會大,容易理解(代替注釋),容易覆寫;,4)問題:局部變量的處理5)實用性:非常大,最好的重構方法25,二,、,重新組織你的數(shù)據(jù),主要是對數(shù)據(jù)的處理,封裝,可理解性,常,數(shù)的替換,對象之間的關聯(lián)26,重構方法封裝值域:,1)概括:直接訪問一個值域,會增加與值域的耦合,為這個值域建立設值/取值函數(shù),并且只以這些函數(shù)來訪問值域2)動機:可以通過覆寫一個函數(shù)改變獲取數(shù)據(jù)的途徑,支持更靈活的數(shù)據(jù)管理方式3)好處:封裝數(shù)據(jù),模塊化用,容易修改,減少耦合4)問題:函數(shù)增加,不必所有的值域都這樣封裝5)實用性:模塊化對外不留接口,模塊內(nèi)部基本可以不用這種方式;,27,重構方法用結構代替數(shù)組:,1)小結:數(shù)組的各個元素各自代表不同的東西,可以用結構來代替,結構的成員來描述數(shù)組的元素2)動機:數(shù)組描述了不同類型的成員,容易出錯3)好處:管理方便,可讀性強;,4)問題:;,5)實用性:碰到這種情況,一定要替換,用數(shù)組是入門練習的做法28,三,、模塊之間搬移特性,面向?qū)ο蟮念?,我們可以相應的認為就,是文件,功能模塊的一個體現(xiàn)適用在各個文件內(nèi)的組織變量和函數(shù)的,位置,責任,解決軟件的耦合性,如是驅(qū)動,還,是單板相關,還是cpu,操作系統(tǒng)相關。
29,重構方法搬移函數(shù):,1)概括:某個函數(shù)與另一個模塊之間的關系更密切,調(diào)用后者,或者被后者調(diào)用,或者從邏輯關系,功能上講,更適合另一個模塊2)動機:模塊的功能過大,耦合太多、;,3)好處:功能穩(wěn)定,減少耦合;,4)問題:,,5)實用性:比較大,如獲取單板硬件版本號算在哪個模塊30,重構方法引入外加函數(shù):,1)概括:一個已經(jīng)提交或者沒有源代碼的模塊,需要增加一個額外函數(shù),建立一個新的函數(shù),并且把相應模塊的結構傳遞進來2)動機:增加模塊的功能;已有穩(wěn)定的模塊或者庫文件沒有源代碼,而需要增加新的功能,3)好處:不要破壞成熟的模塊,或者無法獲得源代碼;,4)問題:效率,定義麻煩;,5)實用性:對于模塊化的實施,或者對已有模塊的擴展,這個函數(shù)放的位置不是很重要31,四,、,簡化條件表達式,將復雜的條件邏輯分成若干小塊使得切換邏,輯和操作細節(jié)分開32,重構方法合并重復的條件片斷:,1)概括:在條件式的每個分支上有著相同的一段代碼,將這段重復代碼搬移到條件式之外2)動機:不同條件含有相同代碼,可以清晰描述變化3)好處:容易維護,不容易出錯4)問題:注意代碼出現(xiàn)的位置5)實用性:很重要,一定采納;,33,五,、,簡化函數(shù)調(diào)用,函數(shù)式代碼最重要的組成單位,函數(shù)的信息隱藏,,參數(shù)個數(shù),查詢和修改分離,函數(shù)命名等。
34,重構方法將查詢函數(shù)和修改函數(shù)分離:,1)概括:某個函數(shù)既返回對象狀態(tài)值,又修改對象狀態(tài),建立兩個不同的函數(shù),一個負責查詢,一個負責修改2)動機:注意函數(shù)調(diào)用的副作用,分離會讓函數(shù)功能更明確,更容易維護;,3)好處:方便管理,不要手動保持同步;,4)問題:,5)實用性:結構化設,驅(qū)動設計等用的很多;,35,五,、,處理概括關系,主要用在各個模塊之間的封裝和函數(shù)調(diào)用關,系,注意這里和面向?qū)ο蟛顒e很大36,重構方法提煉模塊:,1)概括:將多個模塊共有的屬性提煉出來作為單獨模塊;,2)動機:方便擴展3)好處:方便管理,例如uc/os-ii,vxWorks的信號量處理;,4)問題:5),實用性:根據(jù)情況37,五,、,重構在現(xiàn)實開發(fā)中的推廣和障礙,38,為什么開發(fā)者不愿意重構他們的程序?,新手不相信重構,老手不知道如何重構;,如果這些利益是長遠才體現(xiàn)的,何必現(xiàn)在付出這些努力呢?說不定當項目收獲這些利益時,你已經(jīng)不在職位上了;,代碼重構是一項額外工作,項目經(jīng)理則是進度為第一驅(qū)動力;,重構可能破壞現(xiàn)有程序;,39,我想到的解決辦法,重構系列培訓,單板軟件試點,組建重構小組;,重構同樣可以短期受益,正如鍛煉身體和飲食調(diào)控;,降低重構帶來的額外開銷,頂住項目壓力,獲得領導的支持;,安全的進行重構,先從新項目練習,等到水平提高后,再去動大系統(tǒng)吧;,40,六,、成立重構研究小組,41,重構試點項目,VIGAPU 控制模塊:從ENIL 控制模塊繼承;,對該模塊不斷進行單元測試;,對該模塊不斷進行同行評審;,對該模塊不斷進行重構;,有多年開發(fā)經(jīng)驗的程序員組成;,42,重構系列化培訓,在VxWorks培訓之后開展;,底層軟件自由選擇參加;,43,周末愉快,!,44,。