像寫詩一樣寫代碼:扁平化管理你的代碼
引言
大家好,我是有清
《史記》有云:大樂必易,大禮必簡,寫給機(jī)器看的代碼簡單,但是寫給人看的代碼就需要一點(diǎn)心思
在我們平常的開發(fā)過程中,如果遇到代碼嵌套過深的函數(shù),那么我們會
什么叫嵌套過深呢
我們可以簡單看一段發(fā)工資的例子
我們將函數(shù)內(nèi)部一個左花括號視為一個嵌套深度,那么我們這個函數(shù)具有足足 5 層深度,正常情況下超過 3 層深度,這段代碼便會散發(fā)出臭的味道,當(dāng)然這不是業(yè)界定義,只要你覺得這一段代碼不好理解,那么這一段代碼就存在可以優(yōu)化的空間
扁平化
那如何減少我們這個嵌套深度呢?扁平化管理我們代碼呢
通常情況下,我們具有兩種手段,第一種是提煉,將一段代碼提煉到一個獨(dú)立的函數(shù);第二種是反轉(zhuǎn),盡快將結(jié)果返回給函數(shù)。
接下來,我們開始使用這兩種手段,去重構(gòu)一下我們的代碼。
提煉
我們什么時候可以提煉函數(shù)呢?
就是當(dāng)我們 「需要花一段時間去理解這一段代碼是用來干什么的時候我們就可以將這一段代碼去提煉為函數(shù)」
舉個簡單一點(diǎn)的??
有時候我們需要檢查response 是否正確,正確的話,我們才會進(jìn)行一系列對應(yīng)的邏輯處理
通常情況下,我們要去閱讀主要邏輯之前,我們需要去看一下if這到底是什么情況才會走入我們的邏輯,但其實(shí)這邊都是一些常規(guī)的校驗,我們大多數(shù)的時候根本不關(guān)心這個校驗的具體邏輯,因為它是用來預(yù)防我們的代碼出現(xiàn)異常的取值報錯
那么,我認(rèn)為這種的 if 就可以提煉出來一個函數(shù)
讀者只需要關(guān)心,這個 response 是 sucess 即可,不需要具體關(guān)心我是怎么 check 這個 response,因為它相對主邏輯來說不是那么的重要
當(dāng)然還有一種情況,在代碼邏輯中區(qū)分紅花和綠葉,這也是阿里開發(fā)手冊中推薦的我們的一點(diǎn),單個方法的總行數(shù)不要超過 80 行,代碼邏輯分清紅花和綠葉,個性和共性,綠葉邏輯單獨(dú)出來成為額外方法,使主干代碼更加清晰;共性邏輯抽取成為共性方法,便于復(fù)用和維護(hù)
好,接下來我們優(yōu)化一下引言中的代碼
優(yōu)化之后,主干邏輯就清晰了,我們想要知道每個情況下的工資是如何發(fā)放的,只需要點(diǎn)進(jìn)去具體的函數(shù)查看即可
但是這么多的 if 嵌套,看的還是很不舒服,我們繼續(xù)下一個動作
反轉(zhuǎn)
通常情況下,我們的if、else 就是用來區(qū)分在不同的情況下,代碼是走向陽光道還是獨(dú)木橋,陽光道就是可以理解為都是我們重要的邏輯,讀者都需要看
獨(dú)木橋你可以理解為異常情況,需要立刻從函數(shù)中返回回去,我們通常稱這樣的語句為衛(wèi)語句,基于我們防御性編程的思想下,盡快的檢查返回該函數(shù)結(jié)果
同樣阿里規(guī)范也給我們提到了這一點(diǎn)
那么我們根據(jù)這個思想再進(jìn)一步優(yōu)化一下我們引言的代碼
最后再對比一下重構(gòu)前后的代碼
總結(jié)
在本文中我們接觸到了,可以借助提煉以及反轉(zhuǎn)去優(yōu)化我們的代碼嵌套,其實(shí)你可以看看當(dāng)前你的項目中的代碼是否存在這樣的情況,可以考慮是否優(yōu)化一波,當(dāng)然優(yōu)化的時候切記回歸測試的重要性
借用熊節(jié)的一句話:據(jù)說古時高僧有云 “時時勤拂拭,勿使惹塵?!保a當(dāng)如是,專業(yè)人士的技藝應(yīng)當(dāng)如是
希望大家都能像寫詩一樣的寫代碼
寫在最后
在朋友的安利下,上周去了西溪濕地尋梅
順著路標(biāo)的最佳賞梅點(diǎn),我們一路往前走,但其實(shí)花還是沒有那么的密集,我們可疑惑,是梅花還沒開,還是已經(jīng)謝了
直到,我們看見有個游人,在拍照的時候不斷的搖那個梅花樹想讓自己更為出片,我才悟了,原來不密集的梅花,不是樹的不挽留,而是愛美的人的追求