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