国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

用JBuilder2005實(shí)現(xiàn)重構(gòu)之認(rèn)識重構(gòu)

2019-11-18 11:17:13
字體:
供稿:網(wǎng)友

  為什么要重構(gòu)
  從Martin Fowler所著的《重構(gòu)--改善既有代碼的設(shè)計(jì)》一書連續(xù)兩年成為最暢銷的計(jì)算機(jī)圖書之一,就可以知道重構(gòu)給程序員所帶來的欣喜程度了。
  
  那么什么是重構(gòu)呢?重構(gòu)就是在不改變軟件現(xiàn)有功能的基礎(chǔ)上,通過調(diào)整程序代碼改善軟件的質(zhì)量、性能,使其程序的設(shè)計(jì)模式和架構(gòu)更趨合理,提高軟件的擴(kuò)展性和維護(hù)性。
  
  也許有人會(huì)問,為什么不在項(xiàng)目開始時(shí)多花些時(shí)間把設(shè)計(jì)做好,而要以后花時(shí)間來重構(gòu)呢?要知道一個(gè)完美得可以預(yù)見未來任何變化的設(shè)計(jì),或一個(gè)靈活得可以容納任何擴(kuò)展的設(shè)計(jì)是不存在的。系統(tǒng)設(shè)計(jì)人員對即將著手的項(xiàng)目往往只能從大方向予以把控,而無法知道每個(gè)細(xì)枝末節(jié),其次永遠(yuǎn)不變的就是變化,提出需求的用戶往往要在軟件成型后,始才開始"品頭論足",系統(tǒng)設(shè)計(jì)人員究竟不是先知先覺的神仙,功能的變化導(dǎo)致設(shè)計(jì)的調(diào)整再所難免。所以"測試為先,持續(xù)重構(gòu)"作為良好開發(fā)習(xí)慣被越來越多的人所采納,測試和重構(gòu)像黃河的護(hù)堤,成為保證軟件質(zhì)量的法寶。
  
  通過重構(gòu)可以達(dá)到以下的目標(biāo):
  
  持續(xù)偏糾和改進(jìn)軟件設(shè)計(jì)
  重構(gòu)和設(shè)計(jì)是相輔相成的,它和設(shè)計(jì)彼此互補(bǔ)。有了重構(gòu),你仍然必須做預(yù)先的設(shè)計(jì),但是不必是最優(yōu)的設(shè)計(jì),只需要一個(gè)合理的解決方案就夠了,假如沒有重構(gòu)、程序設(shè)計(jì)會(huì)逐漸腐敗變質(zhì),愈來愈像斷線的風(fēng)箏,脫韁的野馬無法控制。重構(gòu)其實(shí)就是整理代碼,讓所有帶著發(fā)散傾向的代碼回歸本位。
  
  使代碼更易為人所理解
  Martin Flower在《重構(gòu)》中有一句經(jīng)典的話:"任何一個(gè)傻瓜都能寫出計(jì)算機(jī)可以理解的程序,只有寫出人類輕易理解的程序才是優(yōu)秀的程序員。"對此,筆者感慨很深,有些程序員總是能夠快速編寫出可運(yùn)行的代碼,但代碼中晦澀的命名使人暈眩得需要緊握坐椅扶手,試想一個(gè)新兵到來接手這樣的代碼他會(huì)不會(huì)想當(dāng)逃兵呢?
  
  軟件的生命周期往往需要多批程序員來維護(hù),我們往往忽略了這些后來人。為了使代碼輕易被他人理解,需要在實(shí)現(xiàn)軟件功能時(shí)做許多額外的事件,如清楚的排版布局,簡明扼要的注釋,其中命名也是一個(gè)重要的方面。一個(gè)很好的辦法就是采用暗喻命名,即以對象實(shí)現(xiàn)的功能的依據(jù),用形象化或擬人化的手法進(jìn)行命名,一個(gè)很好的態(tài)度就是將每個(gè)代碼元素像新生兒一樣命名,也許筆者有點(diǎn)命名偏執(zhí)狂的傾向,如能榮此雅號,將深以此為幸。
  
  對于那些讓人布滿迷茫感甚至誤導(dǎo)性的命名,需要果決地、大刀闊斧地整容,永遠(yuǎn)不要手下留情!
  
  幫助發(fā)現(xiàn)隱藏的代碼缺陷
  孔子說過:溫故而知新。重構(gòu)代碼時(shí)逼迫你加深理解原先所寫的代碼。筆者常有寫下程序后,卻發(fā)生對自己的程序邏輯不甚理解的情景,曾為此驚悚過,后來發(fā)現(xiàn)這種癥狀居然是許多程序員?;嫉?感冒"。當(dāng)你也發(fā)生這樣的情形時(shí),通過重構(gòu)代碼可以加深對原設(shè)計(jì)的理解,發(fā)現(xiàn)其中的問題和隱患,構(gòu)建出更好的代碼。
  
  從長遠(yuǎn)來看,有助于提高編程效率
  當(dāng)你發(fā)現(xiàn)解決一個(gè)問題變得異常復(fù)雜時(shí),往往不是問題本身造成的,而是你用錯(cuò)了方法,拙劣的設(shè)計(jì)往往導(dǎo)致臃腫的編碼。
  
  改善設(shè)計(jì)、提高可讀性、減少缺陷都是為了穩(wěn)住陣腳。良好的設(shè)計(jì)是成功的一半,停下來通過重構(gòu)改進(jìn)設(shè)計(jì),或許會(huì)在當(dāng)前減緩速度,但它帶來的后發(fā)優(yōu)勢卻是不可低估的。
  
  何時(shí)著手重構(gòu)
  新官上任三把火,開始一個(gè)全新的項(xiàng)目時(shí),程序員往往也會(huì)燃起三把火:緊鑼密鼓、腳不停蹄、加班加點(diǎn),一支聲勢浩大的千軍萬"碼"夾裹著程序員激情和扣擊鍵盤的鳴金奮力前行,勢如破竹,攻城掠地,直指"黃龍府"。
  
  開發(fā)經(jīng)理是這支浩浩湯湯代碼隊(duì)伍的統(tǒng)帥,他負(fù)責(zé)這支隊(duì)伍的命運(yùn),當(dāng)齊恒公站在山頂上看到管仲練習(xí)的隊(duì)伍整潔劃一地前進(jìn)時(shí),他感嘆說"我有這樣一支軍隊(duì)哪里還怕沒有勝利呢?"。但很遺憾,你手中的這支隊(duì)伍原本只是散兵游勇,在前進(jìn)中招兵買馬,不斷壯大,所以隊(duì)伍變形在所難免。當(dāng)開發(fā)經(jīng)理發(fā)覺隊(duì)伍變形時(shí),也許就是克制住攻克前方山頭的誘惑,停下腳步整頓隊(duì)伍的時(shí)候了。
  
  Kent Beck提出了"代碼壞味道"的說法,和我們所提出的"隊(duì)伍變形"是同樣的意思,隊(duì)伍變形的信號是什么呢?以下列述的代碼癥狀就是"隊(duì)伍變形"的強(qiáng)烈信號:
  
  代碼中存在重復(fù)的代碼
  中國有118 家整車生產(chǎn)企業(yè),數(shù)量幾乎等于美、日、歐所有汽車廠家數(shù)之和,但是全國的年產(chǎn)量卻不及一個(gè)外國大汽車公司的產(chǎn)量。重復(fù)建設(shè)只會(huì)導(dǎo)致效率的低效和資源的浪費(fèi)。
  
  程序代碼更是不能搞重復(fù)建設(shè),假如同一個(gè)類中有相同的代碼塊,請把它提煉成類的一個(gè)獨(dú)立方法,假如不同類中具有相同的代碼,請把它提煉成一個(gè)新類,永遠(yuǎn)不要重復(fù)代碼。
  
  過大的類和過長的方法
  過大的類往往是類抽象不合理的結(jié)果,類抽象不合理將降低了代碼的復(fù)用率。方法是類王國中的諸侯國,諸侯國太大勢必動(dòng)搖中心集權(quán)。過長的方法由于包含的邏輯過于復(fù)雜,錯(cuò)誤機(jī)率將直線上升,而可讀性則直線下降,類的健壯性很輕易被打破。當(dāng)看到一個(gè)過長的方法時(shí),需要想辦法將其劃分為多個(gè)小方法,以便于分而治之。
  
  牽一毛而需要?jiǎng)尤淼男薷?/b>
  當(dāng)你發(fā)現(xiàn)修改一個(gè)小功能,或增加一個(gè)小功能時(shí),就引發(fā)一次代碼地震,也許是你的設(shè)計(jì)抽象度不夠理想,功能代碼太過分散所引起的。
  
  類之間需要過多的通訊
  A類需要調(diào)用B類的過多方法訪問B的內(nèi)部數(shù)據(jù),在關(guān)系上這兩個(gè)類顯得有點(diǎn)狎昵,可能這兩個(gè)類本應(yīng)該在一起,而不應(yīng)該分家。
  
  過度耦合的信息鏈
  "計(jì)算機(jī)是這樣一門科學(xué),它相信可以通過添加一個(gè)中間層解決任何問題",所以往往中間層會(huì)被過多地追加到程序中。假如你在代碼中看到需要獲取一個(gè)信息,需要一個(gè)類的方法調(diào)用另一個(gè)類的方法,層層掛接,就象輸油管一樣節(jié)節(jié)相連。這往往是因?yàn)殂暯訉犹嘣斐傻?,需要查看就否有可移除的中間層,或是否可以提供更直接的調(diào)用方法。
  
  各立山頭干革命
  假如你發(fā)現(xiàn)有兩個(gè)類或兩個(gè)方法雖然命名不同但卻擁有相似或相同的功能,你會(huì)發(fā)現(xiàn)往往是因?yàn)殚_發(fā)團(tuán)隊(duì)成員協(xié)調(diào)不夠造成的。筆者曾經(jīng)寫了一個(gè)頗好用的字符串處理類,但因?yàn)闆]有及時(shí)通告團(tuán)隊(duì)其他人員,后來發(fā)現(xiàn)項(xiàng)目中居然有三個(gè)字符串處理類。革命資源是珍貴的,我們不應(yīng)各立山頭干革命。
  
  不完美的設(shè)計(jì)
  在筆者剛完成的一個(gè)比對報(bào)警項(xiàng)目中,曾安排阿朱開發(fā)報(bào)警模塊,即通過Socket向指定的短信平臺、語音平臺及客戶端報(bào)警器插件發(fā)送報(bào)警報(bào)文信息,阿朱出色地完成了這項(xiàng)任務(wù)。后來用戶又提出了實(shí)時(shí)比對的需求,即要求第三方系統(tǒng)以報(bào)文形式向比對報(bào)警系統(tǒng)發(fā)送請求,比對報(bào)警系統(tǒng)接收并響應(yīng)這個(gè)請求。這又需要用到Socket報(bào)文通訊,由于原來的設(shè)計(jì)沒有將報(bào)文通訊模塊獨(dú)立出來,所以無法復(fù)用阿朱開發(fā)的代碼。后來我及時(shí)調(diào)整了這個(gè)設(shè)計(jì),新增了一個(gè)報(bào)文收發(fā)模塊,使系統(tǒng)所有的對外通訊都復(fù)用這個(gè)模塊,系統(tǒng)的整體設(shè)計(jì)也顯得更加合理。
  
  每個(gè)系統(tǒng)都或多或少存在不完美的設(shè)計(jì),剛開始可能注重不到,到后來才會(huì)慢慢凸顯出來,此時(shí)唯有勇于更改才是最好的出路。
  
  缺少必要的注釋
  雖然許多軟件工程的書籍常提醒程序員需要防止過多注釋,但這個(gè)擔(dān)心好象并沒有什么必要。往往程序員更感愛好的是功能實(shí)現(xiàn)而非代碼注釋,因?yàn)榍罢吒軒沓删透校源a注釋往往不是過多而是過少,過于簡單。人的記憶曲線下降的坡度是陡得嚇人的,當(dāng)過了一段時(shí)間后再回頭補(bǔ)注釋時(shí),很輕易發(fā)生"提筆忘字,愈言且止"的情形。
  
  曾在網(wǎng)上看到過微軟的代碼注釋,其詳盡程度讓人嘆為觀止,也從中體悟到了微軟成功的一個(gè)經(jīng)驗(yàn)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 武山县| 景德镇市| 蒙城县| 商城县| 蒙阴县| 临泽县| 天全县| 绍兴市| 樟树市| 沈阳市| 普陀区| 兰坪| 邛崃市| 衡东县| 吉林省| 抚远县| 屏东县| 香格里拉县| 海原县| 贡山| 江安县| 奉贤区| 同仁县| 闵行区| 河南省| 廊坊市| 定日县| 二手房| 双峰县| 咸丰县| 客服| 兰州市| 北海市| 荆门市| 古交市| 宜城市| 格尔木市| 丰城市| 黑河市| 尚志市| 北京市|