當前位置: 華文星空 > 知識

為啥你寫的程式碼總是這麽復雜?

2021-05-12知識
摘要: 有句話說得很好,「程式碼品質決定生活品質」,當你把軟體的復雜性降低了,bug減少了,系統可維護性更高了,自然也就帶來了更好的生活品質。

本文分享自華為雲社群【寫出的程式碼復雜度太高?看下專家怎麽說】,原文作者:元閏子 。

前言

在進行軟體開發時,我們常常會追求軟體的高可維護性,高可維護性意味著當有新需求來時,系統易擴充套件;當出現bug時,開發人員易定位。而當我們說一個系統的可維護性太差時,往往指的是該系統太過復雜,導致給系統增加新功能時容易出現bug,而出現bug之後又難以定位。

那麽,軟體的復雜性又是如何定義的呢?

John Ousterhout給出的定義如下:

Complexity is anything related to the structure of a software system that makes it hard to understand and modify the system.

可見,軟體的復雜性是一個很泛的概念,任何使軟體難以理解和難以修改的東西,都屬於軟體的復雜性。為此,John Ousterhout提出了一個公式來度量一個系統的復雜性:

式中,p p 表示系統中的模組,c_{p} cp 表示該模組的認知負擔(Cognitive Load,即一個模組難以理解的程度),t_{p} tp 表示在日常開發中在該模組花費的開發時間。

從公式上看,一個軟體的復雜性由它的各個模組的復雜性累加而成,而 模組復雜性 = 模組認知負擔 * 模組開發時間,也就是模組的復雜性即和模組本身有關,也跟在該模組上花費的開發時間有關。需要註意的是,如果一個模組非常難以理解,但是後續開發過程中幾乎沒有涉及到它,那麽它的復雜性也是很低的。

導致軟體復雜的原因

導致軟體復雜的原因可以細分出很多種來,而概括起來莫過於兩種: 依賴(dependencies) 隱晦(obscurity) 。前者會讓修改起來很費勁而且容易出現bug,比如當修改模組1時,往往也涉及到模組2、模組3、... 的改動;後者會讓軟體難以理解,定位一個bug,甚至是僅僅讀懂一段程式碼都需要花費大量的時間。

軟體的復雜性往往伴隨著如下幾種癥狀:

散彈式修改(Change amplification) 。當只需要修改一個功能,但又不得不對許多模組作出改動時,我們稱之為散彈式修改。這通常是因為模組之間耦合過重,相互依賴太多導致的。 比如,有一組Web頁面,每個頁面都是一個HTML檔,每個HTML都有一個背景內容。由於各個HTML的背景內容都是分開定義的,因此如果需要把背景顏色從橙色修改為藍色時,就需要改動所有的HTML檔。

認知負擔(Cognitive load) 。當我們說一個模組隱晦、難以理解時,它就有過重的認知負擔,這種情況下往往需要讀者花費大量時間才能明白該模組的功能。比如,

< style data-emotion-css="19xugg7"> .css-19xugg7{position:absolute;width:100%;bottom:0;background-image:linear-gradient(to bottom,transparent,#ffffff 50px);} < style data-emotion-css="12cv0pi"> .css-12cv0pi{box-sizing:border-box;margin:0;min-width:0;height:100px;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:absolute;width:100%;bottom:0;background-image:linear-gradient(to bottom,transparent,#ffffff 50px);}
< style data-emotion-css="1pr2waf"> .css-1pr2waf{font-size:15px;color:#09408e;}
釋出於 2021-05-12 14:06
< style data-emotion-css="ch8ocw"> .css-ch8ocw{position:relative;display:inline-block;height:30px;padding:0 12px;font-size:14px;line-height:30px;color:#1772F6;vertical-align:top;border-radius:100px;background:rgba(23,114,246,0.1);}.css-ch8ocw:hover{background-color:rgba(23,114,246,0.15);}
< style data-emotion-css="1xlfegr"> .css-1xlfegr{background:transparent;box-shadow:none;} < style data-emotion-css="1gomreu"> .css-1gomreu{position:relative;display:inline-block;}
軟體開發