無代碼開發(fā)平臺(國內(nèi)無代碼開發(fā)平臺推薦)">國內(nèi)無代碼開發(fā)平臺(國內(nèi)無代碼開發(fā)平臺推薦)
1376
2022-05-30
“這代碼真爛”或“代碼寫得真好”。這描述太籠統(tǒng),具體怎么爛了、怎么就好了?
也有一些工程師對如何評價(jià)代碼質(zhì)量有所認(rèn)識,如好代碼易擴(kuò)展、易讀、簡單、易維護(hù),但更深入的,“怎么算可讀性好?代碼怎么算易擴(kuò)展、易維護(hù)?可讀、可擴(kuò)展與可維護(hù)之間有什么關(guān)系?可維護(hù)中‘維護(hù)’兩字該如何理解?”
如果連啥是好代碼、爛代碼,都分不清,又談何寫好代碼?
如何評價(jià)代碼質(zhì)量的高低?
對代碼質(zhì)量的一種描述:
“好”籠統(tǒng)地表示代碼質(zhì)量高
“爛”籠統(tǒng)地表示代碼質(zhì)量低
其他描述方法語義更豐富、更專業(yè)、更細(xì)化:
靈活性(flexibility)、可擴(kuò)展性(extensibility)、可維護(hù)性(maintainability)、可讀性(readability)、可理解性(understandability)、易修改性(changeability)、可復(fù)用(reusability)、可測試性(testability)、模塊化(modularity)、高內(nèi)聚低耦合(high cohesion loose coupling)、高效(high effciency)、高性能(high performance)、安全性(security)、兼容性(compatibility)、易用性(usability)、整潔(clean)、清晰(clarity)、簡單(simple)、直接(straightforward)、少即是多(less code is more)、文檔詳盡(well-documented)、分層清晰(well-layered)、正確性(correctness、bug free)、健壯性(robustness)、魯棒性(robustness)、可用性(reliability)、可伸縮性(scalability)、穩(wěn)定性(stability)、優(yōu)雅(elegant)、好(good)、壞(bad)……
到底該用啥詞描述代碼質(zhì)量?很難通過其中某個(gè)詞匯全面評價(jià)代碼質(zhì)量,因?yàn)槎际菑牟煌鰜碚f。代碼質(zhì)量高低需綜合各種因素,如一段代碼的可擴(kuò)展性好,但可讀性差,也不能說這段代碼質(zhì)量高。
不同評價(jià)維度也并不是完全獨(dú)立的,有些是具有包含關(guān)系、重疊關(guān)系或互相影響的。如代碼的可讀性好、可擴(kuò)展性好,就意味著代碼可維護(hù)性好。而且,各種評價(jià)維度也不是非黑即白。如不能簡單將代碼分為可讀、不可讀。
可以客觀量化代碼質(zhì)量高低嗎?No!代碼質(zhì)量評價(jià)常有很強(qiáng)主觀性。如代碼可讀性,每個(gè)人標(biāo)準(zhǔn)不一。正因代碼質(zhì)量評價(jià)的主觀性,使得這種主觀評價(jià)的準(zhǔn)確度,跟工程師自身經(jīng)驗(yàn)有極大關(guān)系。越有經(jīng)驗(yàn),給出評價(jià)越準(zhǔn)確。
常用評價(jià)標(biāo)準(zhǔn)
有些詞過于籠統(tǒng)、抽象,比較偏向?qū)τ谡w的描述,如優(yōu)雅、好、壞、整潔、清晰
有些過于細(xì)節(jié)、偏重方法論,比如模塊化、高內(nèi)聚低耦合、文檔詳盡、分層清晰等
有些可能并不僅僅局限于編碼,跟架構(gòu)設(shè)計(jì)等也有關(guān)系,比如可伸縮性、可用性、穩(wěn)定性等
為有的放矢,挑選最常用的、最重要評價(jià)標(biāo)準(zhǔn)詳細(xì)講解:可維護(hù)性、可讀性、可擴(kuò)展性、靈活性、簡潔性(簡單、復(fù)雜)、可復(fù)用性、可測試性。
1.可維護(hù)性(maintainability)
“維護(hù)”不過就是修bug、修老代碼、添加新代碼。
代碼易維護(hù),不破壞原有代碼設(shè)計(jì)、不引入bug情況下,能快速修改或添加代碼
代碼不易維護(hù),修改或者添加代碼需要冒著極大的引入新bug的風(fēng)險(xiǎn),且需費(fèi)很長時(shí)間才能完成
一個(gè)項(xiàng)目,維護(hù)代碼時(shí)間>>編碼時(shí)間。大部分時(shí)間可能都是在修bug、改老邏輯、添加新邏輯。所以,代碼可維護(hù)性很重要。
如何判斷代碼可維護(hù)性好壞呢?
很難量化、偏向?qū)Υa整體的評價(jià)標(biāo)準(zhǔn),類似“好”“壞”“優(yōu)雅”。可維護(hù)性由多因素作用:
可讀性好、簡潔、可擴(kuò)展性好,就易維護(hù);相反,就不易維護(hù)
更細(xì)地,如代碼分層清晰、模塊化好、高內(nèi)聚低耦合、遵從基于接口編程等,就易維護(hù)。此外,代碼易維護(hù)性還和項(xiàng)目代碼量、業(yè)務(wù)復(fù)雜度、技術(shù)復(fù)雜度、文檔是否全面、團(tuán)隊(duì)開發(fā)水平有關(guān)
所以,從正面去分析一個(gè)代碼是否易維護(hù)稍微有點(diǎn)難度。不過,我們可以從側(cè)面上給出一個(gè)比較主觀但又比較準(zhǔn)確的感受。如果bug容易修復(fù),修改、添加功能能夠輕松完成,那我們就可以主觀地認(rèn)為代碼對我們來說易維護(hù)。相反,如果修改一個(gè)bug,修改、添加一個(gè)功能,需要花費(fèi)很長的時(shí)間,那我們就可以主觀地認(rèn)為代碼對我們來說不易維護(hù)。
你可能會說,這樣的評價(jià)方式也太主觀了吧?沒錯(cuò),是否易維護(hù)本來就是針對維護(hù)的人來說的。不同水平的人對于同一份代碼的維護(hù)能力并不是相同的。對于同樣一個(gè)系統(tǒng),熟悉它的資深工程師會覺得代碼的可維護(hù)性還不錯(cuò),而一些新人因?yàn)椴皇煜ごa,修改bug、修改添加代碼要花費(fèi)很長的時(shí)間,就有可能會覺得代碼的可維護(hù)性不那么好。這實(shí)際上也印證了我們之前的觀點(diǎn):代碼質(zhì)量的評價(jià)有很強(qiáng)的主觀性。
2.可讀性(readability)
Martin Fowler說過:“Any fool can write code that a computer can understand. Good programmers write code that humans can understand.”
傻瓜都會寫計(jì)算機(jī)能理解的代碼。好的程序員能編寫人能夠理解的代碼。
時(shí)刻要考慮代碼是否易讀、易理解。因?yàn)槠湟灿绊懘a可維護(hù)性。畢竟,不管干啥,首先就是要讀懂代碼。代碼讀不懂,就可能考慮不全,天天寫bug。
如何評價(jià)可讀性?
符合編碼規(guī)范?命名信達(dá)雅?注釋詳盡?函數(shù)長短合適?模塊劃分清晰?高內(nèi)聚低耦合?地區(qū),很難給出一個(gè)覆蓋所有評價(jià)指標(biāo)的列表。這也是無法量化可讀性的原因。
其實(shí)CR是很好的測驗(yàn)代碼可讀性的途徑:
同事能輕松讀懂你的代碼,說明可讀性很好
他有很多疑問,那就說明你的代碼可讀性有很大進(jìn)步空間
3 可擴(kuò)展性(extensibility)
代碼應(yīng)對后續(xù)需求變化的能力,也很決定代碼是否易維護(hù)。
在不修改或少修改原有代碼情況下,通過擴(kuò)展方式添加新功能代碼。即代碼預(yù)留一些功能擴(kuò)展點(diǎn),你能把新功能代碼,直接插到擴(kuò)展點(diǎn),而無需因?yàn)橐砑右粋€(gè)功能而大動干戈,改動大量原始代碼!
“對修改關(guān)閉,對擴(kuò)展開放”設(shè)計(jì)原則與之密切相關(guān)。
4 靈活性(flexibility)
挺抽象的標(biāo)準(zhǔn),下定義還真難。何時(shí)會說代碼寫得靈活呢?
添加一個(gè)新功能代碼時(shí),原有代碼已預(yù)留好擴(kuò)展點(diǎn),無需修改原有代碼,只要在擴(kuò)展點(diǎn)添加新代碼即可。可以說代碼易擴(kuò)展,還能說寫得好靈活
實(shí)現(xiàn)一個(gè)功能時(shí),發(fā)現(xiàn)原有代碼已抽象出很多底層可復(fù)用模塊、類,可拿來直接用。除了說代碼易復(fù)用,也能說代碼靈活。
使用某組接口時(shí),若這組接口可以應(yīng)對各種使用場景,滿足各種不同需求,除了說接口易用,也能說靈活。
看來,只要一段代碼易擴(kuò)展、易復(fù)用或易用,都能說這段代碼靈活,意義很寬泛。
5 簡潔性(simplicity)
KISS原則:“Keep It Simple,Stupid”,盡量保持代碼簡單。代碼簡單、邏輯清晰,就意味著易讀、易維護(hù)。編寫代碼時(shí),優(yōu)先考慮簡單、清晰。
很多編程經(jīng)驗(yàn)不足的程序員覺得簡單代碼無技術(shù)含量,喜歡引入復(fù)雜設(shè)計(jì)模式。實(shí)際上,思從深而行從簡,高手能用最簡單方法解決最復(fù)雜問題。
怎么樣的代碼算簡潔?
后續(xù)講KISS原則,會通過實(shí)例給你解釋為何KISS原則看似非常簡單、好理解,但實(shí)際上用好不容易。
6 可復(fù)用性(reusability)
簡單理解為盡量減少重復(fù)代碼,多復(fù)用代碼:
OOP繼承、多態(tài)目的之一就是提高代碼可復(fù)用性
單一職責(zé)原則也跟代碼可復(fù)用性相關(guān)
重構(gòu)技巧,解耦、高內(nèi)聚、模塊化等都能提高代碼的可復(fù)用性
可復(fù)用性也是重要標(biāo)準(zhǔn),是很多設(shè)計(jì)原則、思想、模式等所要達(dá)到的最終效果。
跟DRY(Don’t Repeat Yourself)設(shè)計(jì)原則關(guān)系密切。
7 可測試性(testability)
較少被提及,但又重要的代碼質(zhì)量評價(jià)標(biāo)準(zhǔn)。能從側(cè)面非常準(zhǔn)確反應(yīng)代碼質(zhì)量。代碼可測試性差,難寫單元測試,那基本上就能說明代碼設(shè)計(jì)有問題。
如何寫出高質(zhì)量代碼
等于問,如何寫出易維護(hù)、易讀、易擴(kuò)展、靈活、簡潔、可復(fù)用、可測試的代碼?
掌握更細(xì)化、更能落地的編程方法論,包括面向?qū)ο笤O(shè)計(jì)思想、設(shè)計(jì)原則、設(shè)計(jì)模式、編碼規(guī)范、重構(gòu)技巧等。
如OOP的繼承、多態(tài)能讓我們寫出可復(fù)用的代碼;編碼規(guī)范能讓我們寫出可讀性好的代碼;設(shè)計(jì)原則中的單一職責(zé)、DRY、基于接口而非實(shí)現(xiàn)、里式替換原則等,可以讓我們寫出可復(fù)用、靈活、可讀性好、易擴(kuò)展、易維護(hù)的代碼;設(shè)計(jì)模式可以讓我們寫出易擴(kuò)展的代碼;持續(xù)重構(gòu)可以時(shí)刻保持代碼的可維護(hù)性等。
機(jī)器學(xué)習(xí)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。