天天看點

讓你程式設計能力秃飛猛進的好習慣

> 分享自己寫代碼時的好習慣,讓你的程式設計能力突飛猛進!

大家好,我是魚皮,上回說到,很多同學在學程式設計時不注重代碼品質,養成壞習慣的同時,失去了提升自己程式設計能力的機會。

> 還沒讀上篇文章的同學,請先閱讀:[勞資的代碼會有問題 ?!](https://mp.weixin.qq.com/s/iXMGLJv3NbNW-5kszWg-lQ)

**在文末我抛出了問題:**

如何有意提升自己的代碼品質呢?我根本就發現不了自己代碼中的問題,以為已經寫得很棒棒了,怎麼辦?

![](https://qiniuyun.code-nav.cn/image-20210528200902621.png)

要解決這個問題其實非常簡單,既然自己經驗不足、或者是 “隻緣身在此山中”,看不出來代碼哪裡寫的不好,那就找其他朋友或有經驗的程式員幫你看看代碼,給出一些意見。

雖然每個正常的程式員都無法忍受自己寫的代碼被人說是辣雞,但是虛心接受指正,并加以修改,的确能大大加深我們的印象,下次寫代碼時就會注意了。慢慢地,就養成了好習慣,不僅注重自己的代碼品質,還會 “繼承傳統”,開始說别人寫的代碼辣雞,進而幫助更多人改進。

![](https://qiniuyun.code-nav.cn/a8158b22752759e1ca24e55a9fdd4fb6.jpg)

**但有一個很殘酷的現實,誰這麼好心幫我看代碼呢?**

我大學期間,雖然做過很多項目,寫過很多代碼,但是自己的代碼基本都隻給自己看。即使把大作業的代碼交給老師,他們也根本不看代碼,隻看運作效果的,這也是上次提到的為什麼大家越來越不注重代碼品質的原因之一。而且實不相瞞,我也曾經求學長幫我看代碼,但換位思考一下,如果不是和你關系非常好,誰閑的蛋疼免費去幫你看你寫的辣雞代碼?

![](https://qiniuyun.code-nav.cn/image-20210528201138536.png)

**求人不得,隻能求己。**

一種方式就是把自己開發好的作品上線,讓使用者來使用它,進而幫你發現一些自己沒注意到的 Bug 或功能問題,驅使你去仔細閱讀和改進代碼。還可以把自己的代碼公開到 GitHub 等代碼托管平台,允許其他同學閱讀和指出問題。但是,這種方式過于硬核,前期需要耗費大量精力去做推廣,否則根本沒人用你的項目,也沒人去看你的 GitHub!

比如我的 `程式設計導航` 項目已經開源 4 個多月了,文檔編寫非常用心,也做過一點推廣,才收獲了 600+ star,确實是很不容易。

![程式設計導航開源項目](https://qiniuyun.code-nav.cn/image-20210528140648777.png)

這幾天我又大大地優化了下文檔,并且将後端的代碼也開源了!如果大家對前端、React、後端、Java、Spring Boot、騰訊雲開發、公衆号開發、文檔站點生成等感興趣,都歡迎大家的關注~

**位址:** https://github.com/liyupi/code-nav

(也可以點選文章下方閱讀原文直達)

![程式設計導航開源項目](https://qiniuyun.code-nav.cn/image-20210528140810636.png)

回歸正題,硬核的方式咱玩不了,那我就教大家人人都能輕松學會的一招,也是我自己一直堅持的程式設計習慣。

下面一起來看看我寫代碼時的 `小倔強` 吧,有效提高你的代碼品質,程式設計能力突飛猛進!

![](https://qiniuyun.code-nav.cn/image-20210528201249051.png)

## 我的程式設計習慣

就像之前說的,我們之是以發現不了代碼中的問題,很大程度上是因為我們的程式設計态度是 **“樂觀”** 的,相信視訊教程、相信書本、相信編輯器,隻要沒報錯,那就是對的。

但我寫代碼時,非常地 **“悲觀”** 且倔強,我會細緻入微地把自己寫過的每一行代碼都看作是病人,堅持認為他們是有問題的,甚至可以說是從雞蛋裡挑骨頭!

有同學說了,你特麼不就是在說廢話麼,這不就是仔細檢查代碼?或者說是防禦性程式設計?

> 啥是防禦性程式設計,可以看我的這篇文章:[揭秘軟體開發的達摩克利斯之劍](https://mp.weixin.qq.com/s/7S0oxd2VYMcE__eidK19Ag)

先别急,這和防禦性程式設計可不一樣,我有多倔,舉個栗子你就明白了,下面請跟上我的思路~

![](https://qiniuyun.code-nav.cn/image-20210528201623206.png)

### 我有多倔?

假如我寫了這樣一端前端代碼,作用是擷取某條狗的名字:

```javascript

// 預設狗名

let name = '無名狗';

// 狗、狗資訊、狗名稱都存在

if (dog && dog.info && dog.info.name) {

  name = dog.info.name;

}

```

你覺得這段代碼有問題麼?

如果你覺得沒有問題,那麼很好,你很樂觀。

無所謂了,我才不要你覺得,我很倔,我就偏偏覺得這段代碼有問題,**沒問題我也得挑挑問題** 。

![](https://qiniuyun.code-nav.cn/image-20210528201723589.png)

嗯,代碼邏輯好像沒毛病,那硬要說有問題的話,代碼量是不是有點多?

比如在擷取狗名時,為了防止報錯,要先判斷狗是否存在,再判斷狗的資訊是否存在,最後才能取到狗名,好啰嗦啊。如果還要擷取一堆其他的資訊,這代碼簡直沒法看了。

是以,我就開始思考,如何讓這段代碼更加精簡,有沒有更好的寫法呢?

通過百度,我發現了一個牛逼的玩意兒,叫 **可選鍊操作符**( `?.` ),允許讀取對象深處的屬性值,而不必明确驗證鍊中的每個引用是否有效;在引用為空的情況下不會引起錯誤,會自動短路傳回值。

于是,代碼變成了這樣:

if (dog?.info?.name) {

已經比剛剛簡化了不少,但我不滿足,擷取個狗名竟然要寫 4 行代碼?這肯定有問題啊!能不能再簡化一下呢?

思考了一下,這次我憑着自己賊硬的基礎知識儲備,沒有百度就想出了更精簡的寫法,使用 JavaScript 的三元運算符就行了,代碼如下:

let name = dog?.info?.name ? dog.info.name : '無名氏';

怎麼樣,一行代碼搞定!

![](https://qiniuyun.code-nav.cn/image-20210528201941304.png)

下面給大家個機會,代碼寫成這樣還有問題不?或者說,你看這行代碼覺得舒服麼?

反正我覺得不太行,我魚某偏要從雞蛋裡挑骨頭!

仔細看,我們發現 dog、info、name 這三個單詞都重複出現了兩遍,那有什麼辦法再精簡一下呢?

再次打開搜尋引擎,這次搜了半天都沒找到優化的方法,那我幹脆就去搜了 “JavaScript 小技巧”、“JavaScript 進階寫法” 等關鍵詞,終于找到了答案。

**空值合并操作符**( `??` ),當左側的操作數為 `null` 或者 `undefined` 時,傳回其右側操作數,否則傳回左側操作數。

最終,代碼縮成了這樣:

let name = dog?.info?.name ?? '無名狗';

舒服多了吧!

這就是我寫代碼時的倔強,通過這次挑問題,起碼幫助我學到了兩個 JavaScript 操作符的用法,爽死了!

![](https://qiniuyun.code-nav.cn/jiaoao.jpg)

### 值得麼?

那有同學說了:像你這樣寫代碼,不累麼?這麼認真地去摳代碼的細節,不會很花時間麼?

小了,格局小了。

從這一次寫代碼來看,的确我花了更多的時間,代碼能跑就行了,管那麼多别的幹啥呢?但從長遠來看,這是學習的必經之路,通過自己思考去發現問題、解決問題,學到的知識可以說是深深地刻在了腦海裡,以後再寫類似的代碼時,就能更輕松、規範和高效,省下的時間是無限的!

當然,摳細節也要看情況,如果你要開發的東西很緊急,肯定還是先以完成功能為主。但等後面有空了,一定要記得優化一下,否則你也算是為代碼 “屎山” 貢獻了自己的一份力量。

![](https://qiniuyun.code-nav.cn/image-20210528202305322.png)

**悲觀程式設計還有什麼其他的好處呢?**

樂觀程式設計時,我們往往是被動地發現問題,以為代碼跑的很順利,但卻往往被别人來提 Bug,再被迫修改,心态會越來越差。

而悲觀程式設計時,我們是自己主動找問題,主動去優化代碼。當你通過思考、搜尋和實踐,将原本很複雜的代碼化繁為簡後,你會驚喜地發現:我去,原來代碼還可以這樣寫!牛逼牛逼!

![](https://qiniuyun.code-nav.cn/image-20210528202328526.png)

然後,你就會收獲成就感,繼續堅持這種習慣,不斷進步。

這讓我不禁想起了拼多多,早期沒有給使用者很高的預期,讓他們覺得這是個多牛逼的産品。而是主動降低使用者的預期,讓大家都覺得這是個土味兒産品,後來再一次次地超出預期,最終走向成功。

### 找不到問題?

看到這裡,大家應該了解我寫代碼時的倔強了。但一定會有同學表示,我沒有這種敏銳的直覺,看不出自己代碼中的問題咋辦呢?

我自己有一些經驗方法,大家可以嘗試一下:

1. 當你覺得有段代碼寫起來很麻煩時,多半有問題,不妨去搜尋下有沒有現成的元件,或者别人是怎麼實作的。

2. 當你重複寫某段代碼時,一定有問題,不妨把它抽象成函數或元件、或者用設計模式來優化。

3. 當某段代碼中寫了大量的 If Else 時,一定有問題,試着重新梳理邏輯,減少條件和分支。

4. 多關注開發工具的報黃和報紅提示,通常能得到很多好的優化建議,盡早發現問題。

![](https://qiniuyun.code-nav.cn/image-20210528202643566.png)

再給大家一道練習題,上面舉的栗子是前端的,這次就舉個 Java 的吧。

目标是獲得所有狗的名字清單,老弟小阿巴寫的代碼如下:

```java

// 獲得所有狗的名字清單

List<Dog> dogList = new ArrayList<>();

List<String> dogNameList = new ArrayList<>();

if (dogList != null && dogList.size() > 0) {

  for (int i = 0; i < dogList.size(); i++) {

    Dog dog = dogList.get(i);

    if (dog != null) {

      dogNameList.add(dog.getName());

    }

  }

return dogNameList;

這段代碼有問題麼?如何優化呢?大家快來試試吧~

小提示,一行代碼就可以實作同樣的功能!**歡迎在評論區交流。**

---

好了以上就是本期分享,有幫助的話求個 **贊** ,希望讓更多人學到。

![](https://qiniuyun.code-nav.cn/dianzan.png)

我是魚皮,原創不易,如果覺得文章還不錯的話,希望朋友們 **點贊** 支援下,給俺點創作動力。

最近還在開發我的 [程式設計導航](https://www.code-nav.cn)( https://www.code-nav.cn ),一個幫大家找程式設計資源的項目,歡迎使用!

![各種程式設計資源](https://qiniuyun.code-nav.cn/%E6%9C%8B%E5%8F%8B%E5%9C%88%E9%85%8D%E5%9B%BE-20210524231057095.png)

**我是如何在大學期間通過自學,拿到騰訊、位元組等大廠 offer 的,可以看這篇文章,不再迷茫!**

[我學計算機的四年,共勉!](https://t.1yb.co/q0mS)( https://t.1yb.co/q0mS )