復(fù)雜系統(tǒng)架構(gòu)治理終極難題之重構(gòu)_第1頁
復(fù)雜系統(tǒng)架構(gòu)治理終極難題之重構(gòu)_第2頁
復(fù)雜系統(tǒng)架構(gòu)治理終極難題之重構(gòu)_第3頁
復(fù)雜系統(tǒng)架構(gòu)治理終極難題之重構(gòu)_第4頁
復(fù)雜系統(tǒng)架構(gòu)治理終極難題之重構(gòu)_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

演講人:王曉波重構(gòu)的意義重構(gòu)-Refactoring重構(gòu)的定義重構(gòu)的目的重構(gòu)和重寫重構(gòu)

名詞對軟件內(nèi)部結(jié)構(gòu)的一種調(diào)整,目的是在不改變軟件可觀察行為的前提下,提高其可理解性,降低其修改成本。重構(gòu)

動詞使用一系列重構(gòu)的手法,在不改變軟件可觀察行為的前提下,調(diào)整其結(jié)構(gòu)。a2m.msup.com.cn重構(gòu)-

Refactoring保持行為不變a2m.msup.com.cn盡管重構(gòu)會對代碼的內(nèi)部結(jié)構(gòu)進(jìn)行調(diào)整,但其功能和對外表現(xiàn)必須保持一致。內(nèi)部優(yōu)化重構(gòu)關(guān)注的是代碼的內(nèi)部實(shí)現(xiàn),通過改善代碼結(jié)構(gòu)來使其更具模塊化、更易理解和維護(hù)。持續(xù)性貫穿在軟件開發(fā)的各個(gè)階段,而不是一次性的任務(wù)。持續(xù)的重構(gòu)可以防止代碼質(zhì)量在開發(fā)過程中逐漸惡化。重構(gòu)-

Refactoring目標(biāo)01.

提高可讀性a2m.msup.com.cn清晰且易于理解的代碼使開發(fā)人員能夠更快速地理解和上手03.

減少重復(fù)和相似代碼消除重復(fù)代碼,減少維護(hù)多個(gè)相似代碼片段的成本02.

增加可維護(hù)性使得錯(cuò)誤更容易被發(fā)現(xiàn)和修復(fù),添加功能變得更加高效率04.

提升項(xiàng)目性能在重構(gòu)過程中常常能夠發(fā)現(xiàn)并修復(fù)性能瓶頸重構(gòu)的目的重構(gòu)和重寫如果重寫比重構(gòu)還容易,就別重構(gòu)了,此時(shí)重寫反而是更高效和正確的選擇!局部范圍,逐步進(jìn)行的低風(fēng)險(xiǎn),不改變外部行為時(shí)間成本低,開發(fā)中同步進(jìn)行不涉及系統(tǒng)架構(gòu)重新設(shè)計(jì)a2m.msup.com.cn重構(gòu)重構(gòu)和重寫重寫全面的,大規(guī)模的改動高風(fēng)險(xiǎn),引入新Bug或不兼容時(shí)間成本高,暫停其他工作系統(tǒng)架構(gòu)整個(gè)重新設(shè)計(jì)原則和挑戰(zhàn)重構(gòu)的原則何時(shí)重構(gòu)產(chǎn)品經(jīng)理挑戰(zhàn)風(fēng)險(xiǎn)管理挑戰(zhàn)團(tuán)隊(duì)協(xié)作挑戰(zhàn)重構(gòu)的原則強(qiáng)調(diào)在保證代碼外部行為不變的前提下,通過逐步的、小規(guī)模的改動來優(yōu)化代碼的內(nèi)部結(jié)構(gòu)。要正確地進(jìn)行重構(gòu),前提是得有一套穩(wěn)固的測試集合,幫助我們避免疏漏。030102重構(gòu)的原則a2m.msup.com.cn保持行為不變保持已有的測試用例關(guān)注代碼可讀性,風(fēng)格統(tǒng)一關(guān)注重構(gòu)后的性能變化,逐步優(yōu)化性能優(yōu)化消除,重復(fù)或相似功能的代碼優(yōu)化代碼設(shè)計(jì)和代碼架構(gòu)新功能理解代碼撿垃圾代碼評審重構(gòu)的最佳時(shí)機(jī)就在添加新功能之前,比如:已經(jīng)有函數(shù)提供了我需要的大部分功能,做一個(gè)簡單的重構(gòu),就能快速完成功能。當(dāng)我們花費(fèi)了數(shù)分鐘才弄懂“這段代碼到底在做什么”的時(shí)候,就需要考慮重構(gòu)了。撿垃圾方式的重構(gòu),雖然我已經(jīng)理解代碼在做什么,但是發(fā)現(xiàn)它們做得比較差。復(fù)審代碼時(shí)做重構(gòu),當(dāng)我們做

code

review

的時(shí)候,提出一些建議,加入重構(gòu)。何時(shí)重構(gòu)a2m.msup.com.cn“怎么和經(jīng)理說重構(gòu)的事情?”經(jīng)理會認(rèn)為,重構(gòu)要么是在彌補(bǔ)過去犯下的錯(cuò)誤,要么是不增加價(jià)值的浪費(fèi)人力。如果團(tuán)隊(duì)的經(jīng)理不具備技術(shù)或研發(fā)思維,他們不理解代碼的健康對生產(chǎn)率的影響,那么就:不要告訴經(jīng)理!重構(gòu)能讓軟件的新功能開發(fā)的更快,受進(jìn)度驅(qū)動的經(jīng)理會要求我們盡快的完成任務(wù)。因?yàn)橹貥?gòu)能讓持續(xù)交付任務(wù)更快,所以我們就做重構(gòu)。來自產(chǎn)品經(jīng)理的挑戰(zhàn)a2m.msup.com.cn引入新Bug歷史項(xiàng)目兼容性來自風(fēng)險(xiǎn)管理的挑戰(zhàn)a2m.msup.com.cn現(xiàn)有代碼理解可能比較困難,特別是大型,歷史悠久的項(xiàng)目,代碼缺乏文檔,理解起來會更加困難。重構(gòu)可能帶來一些不可預(yù)見的副作用,引入新的Bug之類。所以需要驗(yàn)證行為不能改變,要有充分的測試覆蓋,如果測試功能不完整,會有風(fēng)險(xiǎn)。隨著技術(shù)的發(fā)展,可能需要將代碼遷移到新的框架或語言,這增加了重構(gòu)的復(fù)雜性,重構(gòu)時(shí)要考慮新舊技術(shù)棧的兼容性,避免引入新的問題。避免沖突團(tuán)隊(duì)成員可能對重構(gòu)有不同的看法,確保團(tuán)隊(duì)成員在重構(gòu)過程中保持同步,避免沖突和重復(fù)工作。a2m.msup.com.cn代碼風(fēng)格團(tuán)隊(duì)成員風(fēng)格不一致,可能導(dǎo)致重構(gòu)后的代碼風(fēng)格不統(tǒng)一??梢允褂么a風(fēng)格檢查工具,如Prettier、ESLint等,統(tǒng)一代碼風(fēng)格。資源分配重構(gòu)可能與其他團(tuán)隊(duì)的開發(fā)任務(wù)沖突,導(dǎo)致資源和時(shí)間分配的困難。將重構(gòu)任務(wù)拆分為多個(gè)小的、可管理的迭代,合理分配優(yōu)先級。新成員新成員可能對現(xiàn)有代碼和重構(gòu)計(jì)劃不熟悉,導(dǎo)致融入困難??梢源罱ü蚕碇R庫,幫助新成員快速上手。來自團(tuán)隊(duì)協(xié)作的挑戰(zhàn)代碼的壞味道壞代碼案例其他壞味道壞味道本身并不僅僅是錯(cuò)誤或bug,也是代碼質(zhì)量的警示信號。a2m.msup.com.cn理解和識別這些壞味道,對于保持代碼的可維護(hù)性和質(zhì)量至關(guān)重要。代碼的壞味道重復(fù)代碼大量重復(fù)這是一段獲取時(shí)間和分鐘的代碼在整個(gè)項(xiàng)目的

31

文件中有

61

段重復(fù)神秘變量命名代碼中的,m,m1,hour,hour1

都不是一個(gè)好名字壞代碼案例a2m.msup.com.cn面向字符串編碼這是一段

Go

語言代碼,Order是數(shù)據(jù)庫取出來來的訂單信息不使用類和對象的屬性,使用字符串的類型作為屬性的key,失去了編輯器和編譯期的檢查壞代碼案例a2m.msup.com.cn霰彈式修改這段代碼,將

order

對象的

is_pool_order

屬性轉(zhuǎn)為

int

類型的代碼,散落在項(xiàng)目的各個(gè)地方,如果要修改邏輯,需要修改項(xiàng)目的很多處壞代碼案例a2m.msup.com.cn錯(cuò)誤的利用數(shù)據(jù)類型的特性Go語言

中對時(shí)間類型

Format

是對時(shí)間的格式化,返回的類型是String代碼中的意圖很明顯,比較

start_time和

now

哪個(gè)時(shí)間更大。但是,代碼中卻使用了

String

類型的比較,雖然也能符合邏輯預(yù)期,但充滿著壞味道壞代碼案例a2m.msup.com.cn手搓拼裝 j

s

o

n 字符串看過很多壞味道的項(xiàng)目,代碼拼接

xml,json

等數(shù)據(jù),雖然能正確運(yùn)行,但是有極大的隱患。應(yīng)該使用struct

class

來讓程序序列化生成。另外,變量名拼寫也發(fā)生了錯(cuò)誤,pricePamars

猜測應(yīng)該是

priceParam

。壞代碼案例a2m.msup.com.cn定時(shí)炸彈這段

Python

代碼可讀性很差,第

3572

行,name[0][0]

有空指針潛在問題。For

循環(huán)的兩層嵌套,時(shí)間復(fù)雜度是

n*m,一般

循環(huán)嵌套

可能都有點(diǎn)壞味道。第

3585

行的

break,意圖不明顯,看到

最后

return

data的代碼,猜測意圖break應(yīng)該跳出所有For循環(huán),但顯然這里的break

沒有符合預(yù)期。壞代碼案例a2m.msup.com.cn在我電腦上好好的呀!強(qiáng)制的依賴某個(gè)運(yùn)行環(huán)境,導(dǎo)致項(xiàng)目在他的電腦上運(yùn)行的很好,其他環(huán)境就未必。壞代碼案例a2m.msup.com.cn過長參數(shù)列表描述:方法的參數(shù)列表過長,調(diào)用復(fù)雜。影響:增加了調(diào)用復(fù)雜度和理解難度。解決方法:使用數(shù)據(jù)類封裝參數(shù),或者采用方法重載。a2m.msup.com.cn01依戀情結(jié)描述:一個(gè)類頻繁訪問另一個(gè)類的數(shù)據(jù)和方法。影響:職責(zé)劃分不明確,類的內(nèi)聚性低。解決方法:將功能移動到更相關(guān)的類中,提高內(nèi)聚性。02神秘命名描述:變量、方法或類的命名不清晰,不能直觀反映其功能。影響:增加了代碼的理解難度。解決方法:使用清晰、描述性且一致的命名。03數(shù)據(jù)暴露描述:類直接暴露內(nèi)部數(shù)據(jù),違背了封裝原則。影響:降低了數(shù)據(jù)的安全性和代碼的維護(hù)性。解決方法:使用getter和setter方法訪問數(shù)據(jù),保持?jǐn)?shù)據(jù)的封裝性。注釋和壞味道當(dāng)你看到一段代碼有著長長的注釋,然后發(fā)現(xiàn)這些注釋之所以存在乃是因?yàn)榇a很糟糕,就嗅到了壞味道。其他壞味道04總結(jié)重構(gòu)壞代碼是一個(gè)持續(xù)不斷的過程,

通過識別代碼中的壞味道,

制定重構(gòu)計(jì)劃,

編寫和運(yùn)行測試,

逐步執(zhí)行重構(gòu),

持續(xù)集成和部署,

并通過團(tuán)隊(duì)協(xié)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論