置頂 碼出優美

2022-03-14 14:23:08 字數 2150 閱讀 6506

乙份擁有良好可讀性和拓展性的**是專案裡的良藥,它不僅看著舒服,改起來也方便,甚至還能重用,各模組邏輯分明。「見碼知功底」,而要達到高手那種簡潔有力的境界,需要進行大量的總結和練習,今天我們就來談談如何寫出優美的**。

命名

好的命名應該具有如下特徵:

1,意思正確。這是最基本的要求,不要掛羊頭賣狗肉,詞不達意,要一眼就知道什麼意思。就算一眼看不出來,複製到有道詞典翻譯一下也能知道什麼意思;

2,單複數分明。如果是乙個陣列,要麼加s/es結尾表明其是複數,要麼加入list表示它是乙個陣列。如cars,carlist都可以表達乙個車的列表;

3,慎用縮略詞。縮略詞可以讓我們的命名更加簡潔,但是一!定!要!是!業!界!通!用!縮!略!詞!比如info原意為information,msg原意為message,fn原意function,conf原意config等等,這些縮略詞都是業內傳統了,大家都知道什麼意思,切記不要自己亂造縮略詞;

4,有具體含義。根據業務場景去命名,而不是根據抽象命名;比如getunreadmsglist,一看就知道是獲取未讀訊息列表的意思,而getdata這種說了跟沒說一樣,缺乏具體含義。

注釋

有表達力的**是不需要注釋的。比如乙個init函式,一看就知道是用於做一些初始化的工作,沒必要寫多餘的注釋來說明。

但是有一些場景注釋是非常有必要的,下面幾種場景要新增注釋:

1,一些針對特殊業務場景而訂製的特殊邏輯。比如當我們更新個人資訊的時候,由於後端的問題,需要少傳乙個諸如生日的資訊,或者更新頭像時要多傳乙個時間戳來供其他業務以後使用。這些莫名其妙的增刪屬性,如果不加以注釋,將導致後續自己都無法理解;

2,可能會出現隱患的**。由於自身水平所限,或者本身技術上就無法實現,只能通過一些特殊技巧來仿製一些效果,往往會存在安全隱患,比如:使用者操作太快會出問題,網路太慢會出問題,某個介面調不通這頁面會全掛了,一些特殊的操作會引起的暫時無法解決的bug等等場景,都需要注釋說明;

3,涉及到某些高深的或者生僻的技術知識。這種也要注釋,以提醒自己和其他開發者。

一般來說,注釋基本上都是在表達「這裡我為什麼這麼做」,很少有注釋會去表達「我是乙個什麼玩意兒」,如果是後者的注釋,只能說明命名沒做好。

函式

函式是**的靈魂,也是寫邏輯的載體,以下幾個要求是判斷乙個開發者函式寫的好不好的標準。

1,是不是單一職責。乙個函式應該只做一件事,而這件事應該能通過函式名就可以清晰的展示。這是乙個非常好的特性,乙個辣雞的函式可能動輒幾百行**,各種邏輯堆積在一起,看得人頭腦發暈,甚至開發者自己都理不清楚;判斷這個函式是不是單一職責的技巧很簡單:看看它還能不能再拆分。

2,有沒有層級之分函式與函式之間是有身份地位之分的,有負責整體大局觀的高階函式,也有專注細節的打工仔低階函式。如果不建立起層級結構,就容易迷失在細節的海洋裡。比如:

對於做一頓飯這個函式來說,他不需要關心諸如買菜時反覆挑選這種細節,它只需要知道,大概有三個大步驟就行了。所以這段邏輯會根據其地位拆分出不同等級的函式,假設沒有層級之分,那麼從第一步的「搭公交」一直寫到最後一步的「倒垃圾」,這東西會變得極難維護。

3,承載的場景是否足夠簡單。有時候我們會遇到這樣一種場景:乙個函式在很多地方都會用到,但是不同地方傳入的引數不一樣,這樣我們為了函式的通用性,就針對入參做了很多種場景的識別,導致入參非常多,裡面還需要根據不同的場景做邏輯上的細微調整。所以單單是取傳入引數都夠嗆了,一堆的if else或switch case。

這個函式太難了,而且這已經違背了函式的單一職責原則,它在裡面做了多種場景的判斷,從而表現出不同的行為,但這些行為又不是完全不同,而是「大體相同」,如果重寫好像又會增加很多的重複的**。解決的方法是做更小粒度的拆分,將那些真正與業務脫鉤的部分抽離出來,而不同場景對應不同的處理函式,剛剛抽離的業務脫鉤函式正好作為這些不同場景函式公共部分!

如何設計出優美的Web API?

熱文索引,堅持原創不易,請小夥伴們不吝 推薦 支援 1.程式設計師必須掌握的效能調優 x y z 2.程式設計師必須懂的架構入門課 1 2 3 3.如何把單體式應用拆解成微服務?上 4.如何把單體式應用拆解成微服務?下 5.如何寫好產品幫助文件?web api的應用場景非常豐富,例如 將已有系統的功...

碼出高效讀書筆記 SQL注入

q1 什麼是sql注入?a1 sql注入是注入式攻擊中的常見型別,sql注入式攻擊是未將 與資料進行嚴格的隔離,導致在讀取使用者資料的時候,錯誤地將資料作為 的一部分執行,從而導致一些安全問題。典型的sql注入的例子是當對sql語句進行字串拼接操作時,直接使用未加轉義的使用者輸入內容作為變數。例如 ...

awk統計使用者輸入錯誤的驗證碼每個字母出現的次數

功能 awk統計使用者輸入錯誤的驗證碼每個字母出現的次數 指令碼 cat log.txt grep 驗證碼校驗 awk awk f awk f grep result 1 awk f awk begin sort uniq c 分析 1.找出含有 驗證碼校驗 的日誌行 2.以空格為分割符,列印出第6...