讓你編程能力禿飛猛進(jìn)的好習(xí)慣
分享自己寫代碼時(shí)的好習(xí)慣,讓你的編程能力突飛猛進(jìn)!
大家好,我是魚皮,上回說到,很多同學(xué)在學(xué)編程時(shí)不注重代碼質(zhì)量,養(yǎng)成壞習(xí)慣的同時(shí),失去了提升自己編程能力的機(jī)會(huì)。
還沒讀上篇文章的同學(xué),請先閱讀:勞資的代碼會(huì)有問題 ?!
在文末我拋出了問題:
如何有意提升自己的代碼質(zhì)量呢?我根本就發(fā)現(xiàn)不了自己代碼中的問題,以為已經(jīng)寫得很棒棒了,怎么辦?

要解決這個(gè)問題其實(shí)非常簡單,既然自己經(jīng)驗(yàn)不足、或者是 “只緣身在此山中”,看不出來代碼哪里寫的不好,那就找其他朋友或有經(jīng)驗(yàn)的程序員幫你看看代碼,給出一些意見。
雖然每個(gè)正常的程序員都無法忍受自己寫的代碼被人說是辣雞,但是虛心接受指正,并加以修改,的確能大大加深我們的印象,下次寫代碼時(shí)就會(huì)注意了。慢慢地,就養(yǎng)成了好習(xí)慣,不僅注重自己的代碼質(zhì)量,還會(huì) “繼承傳統(tǒng)”,開始說別人寫的代碼辣雞,從而幫助更多人改進(jìn)。

但有一個(gè)很殘酷的現(xiàn)實(shí),誰這么好心幫我看代碼呢?
我大學(xué)期間,雖然做過很多項(xiàng)目,寫過很多代碼,但是自己的代碼基本都只給自己看。即使把大作業(yè)的代碼交給老師,他們也根本不看代碼,只看運(yùn)行效果的,這也是上次提到的為什么大家越來越不注重代碼質(zhì)量的原因之一。而且實(shí)不相瞞,我也曾經(jīng)求學(xué)長幫我看代碼,但換位思考一下,如果不是和你關(guān)系非常好,誰閑的蛋疼免費(fèi)去幫你看你寫的辣雞代碼?

求人不得,只能求己。
一種方式就是把自己開發(fā)好的作品上線,讓用戶來使用它,從而幫你發(fā)現(xiàn)一些自己沒注意到的 Bug 或功能問題,驅(qū)使你去仔細(xì)閱讀和改進(jìn)代碼。還可以把自己的代碼公開到 GitHub 等代碼托管平臺(tái),允許其他同學(xué)閱讀和指出問題。但是,這種方式過于硬核,前期需要耗費(fèi)大量精力去做推廣,否則根本沒人用你的項(xiàng)目,也沒人去看你的 GitHub!
比如我的 編程導(dǎo)航
項(xiàng)目已經(jīng)開源 4 個(gè)多月了,文檔編寫非常用心,也做過一點(diǎn)推廣,才收獲了 600+ star,確實(shí)是很不容易。

這幾天我又大大地優(yōu)化了下文檔,并且將后端的代碼也開源了!如果大家對前端、React、后端、Java、Spring Boot、騰訊云開發(fā)、公眾號(hào)開發(fā)、文檔站點(diǎn)生成等感興趣,都?xì)g迎大家的關(guān)注~
地址: https://github.com/liyupi/code-nav
(也可以點(diǎn)擊文章下方閱讀原文直達(dá))

回歸正題,硬核的方式咱玩不了,那我就教大家人人都能輕松學(xué)會(huì)的一招,也是我自己一直堅(jiān)持的編程習(xí)慣。
下面一起來看看我寫代碼時(shí)的 小倔強(qiáng)
吧,有效提高你的代碼質(zhì)量,編程能力突飛猛進(jìn)!

我的編程習(xí)慣
就像之前說的,我們之所以發(fā)現(xiàn)不了代碼中的問題,很大程度上是因?yàn)槲覀兊木幊虘B(tài)度是 “樂觀” 的,相信視頻教程、相信書本、相信編輯器,只要沒報(bào)錯(cuò),那就是對的。
但我寫代碼時(shí),非常地 “悲觀” 且倔強(qiáng),我會(huì)細(xì)致入微地把自己寫過的每一行代碼都看作是病人,堅(jiān)持認(rèn)為他們是有問題的,甚至可以說是從雞蛋里挑骨頭!
有同學(xué)說了,你特么不就是在說廢話么,這不就是仔細(xì)檢查代碼?或者說是防御性編程?
啥是防御性編程,可以看我的這篇文章:揭秘軟件開發(fā)的達(dá)摩克利斯之劍
先別急,這和防御性編程可不一樣,我有多倔,舉個(gè)栗子你就明白了,下面請跟上我的思路~

我有多倔?
假如我寫了這樣一端前端代碼,作用是獲取某條狗的名字:
//?默認(rèn)狗名
let?name?=?'無名狗';
//?狗、狗信息、狗名稱都存在
if?(dog?&&?dog.info?&&?dog.info.name)?{
??name?=?dog.info.name;
}
你覺得這段代碼有問題么?
如果你覺得沒有問題,那么很好,你很樂觀。
無所謂了,我才不要你覺得,我很倔,我就偏偏覺得這段代碼有問題,沒問題我也得挑挑問題 。

嗯,代碼邏輯好像沒毛病,那硬要說有問題的話,代碼量是不是有點(diǎn)多?
比如在獲取狗名時(shí),為了防止報(bào)錯(cuò),要先判斷狗是否存在,再判斷狗的信息是否存在,最后才能取到狗名,好啰嗦啊。如果還要獲取一堆其他的信息,這代碼簡直沒法看了。
所以,我就開始思考,如何讓這段代碼更加精簡,有沒有更好的寫法呢?
通過百度,我發(fā)現(xiàn)了一個(gè)牛逼的玩意兒,叫 可選鏈操作符( ?.
),允許讀取對象深處的屬性值,而不必明確驗(yàn)證鏈中的每個(gè)引用是否有效;在引用為空的情況下不會(huì)引起錯(cuò)誤,會(huì)自動(dòng)短路返回值。
于是,代碼變成了這樣:
//?默認(rèn)狗名
let?name?=?'無名狗';
//?狗、狗信息、狗名稱都存在
if?(dog?.info?.name)?{
??name?=?dog.info.name;
}
已經(jīng)比剛剛簡化了不少,但我不滿足,獲取個(gè)狗名竟然要寫 4 行代碼?這肯定有問題?。∧懿荒茉俸喕幌履??
思考了一下,這次我憑著自己賊硬的基礎(chǔ)知識(shí)儲(chǔ)備,沒有百度就想出了更精簡的寫法,使用 JavaScript 的三元運(yùn)算符就行了,代碼如下:
let?name?=?dog?.info?.name???dog.info.name?:?'無名氏';
怎么樣,一行代碼搞定!

下面給大家個(gè)機(jī)會(huì),代碼寫成這樣還有問題不?或者說,你看這行代碼覺得舒服么?
反正我覺得不太行,我魚某偏要從雞蛋里挑骨頭!
仔細(xì)看,我們發(fā)現(xiàn) dog、info、name 這三個(gè)單詞都重復(fù)出現(xiàn)了兩遍,那有什么辦法再精簡一下呢?
再次打開搜索引擎,這次搜了半天都沒找到優(yōu)化的方法,那我干脆就去搜了 “JavaScript 小技巧”、“JavaScript 高級(jí)寫法” 等關(guān)鍵詞,終于找到了答案。
空值合并操作符( ??
),當(dāng)左側(cè)的操作數(shù)為 null
或者 undefined
時(shí),返回其右側(cè)操作數(shù),否則返回左側(cè)操作數(shù)。
最終,代碼縮成了這樣:
let?name?=?dog?.info?.name????'無名狗';
舒服多了吧!
這就是我寫代碼時(shí)的倔強(qiáng),通過這次挑問題,起碼幫助我學(xué)到了兩個(gè) JavaScript 操作符的用法,爽死了!

值得么?
那有同學(xué)說了:像你這樣寫代碼,不累么?這么認(rèn)真地去摳代碼的細(xì)節(jié),不會(huì)很花時(shí)間么?
小了,格局小了。
從這一次寫代碼來看,的確我花了更多的時(shí)間,代碼能跑就行了,管那么多別的干啥呢?但從長遠(yuǎn)來看,這是學(xué)習(xí)的必經(jīng)之路,通過自己思考去發(fā)現(xiàn)問題、解決問題,學(xué)到的知識(shí)可以說是深深地刻在了腦海里,以后再寫類似的代碼時(shí),就能更輕松、規(guī)范和高效,省下的時(shí)間是無限的!
當(dāng)然,摳細(xì)節(jié)也要看情況,如果你要開發(fā)的東西很緊急,肯定還是先以完成功能為主。但等后面有空了,一定要記得優(yōu)化一下,否則你也算是為代碼 “屎山” 貢獻(xiàn)了自己的一份力量。

悲觀編程還有什么其他的好處呢?
樂觀編程時(shí),我們往往是被動(dòng)地發(fā)現(xiàn)問題,以為代碼跑的很順利,但卻往往被別人來提 Bug,再被迫修改,心態(tài)會(huì)越來越差。
而悲觀編程時(shí),我們是自己主動(dòng)找問題,主動(dòng)去優(yōu)化代碼。當(dāng)你通過思考、搜索和實(shí)踐,將原本很復(fù)雜的代碼化繁為簡后,你會(huì)驚喜地發(fā)現(xiàn):我去,原來代碼還可以這樣寫!牛逼牛逼!

然后,你就會(huì)收獲成就感,繼續(xù)堅(jiān)持這種習(xí)慣,不斷進(jìn)步。
這讓我不禁想起了拼多多,早期沒有給用戶很高的預(yù)期,讓他們覺得這是個(gè)多牛逼的產(chǎn)品。而是主動(dòng)降低用戶的預(yù)期,讓大家都覺得這是個(gè)土味兒產(chǎn)品,后來再一次次地超出預(yù)期,最終走向成功。
找不到問題?
看到這里,大家應(yīng)該理解我寫代碼時(shí)的倔強(qiáng)了。但一定會(huì)有同學(xué)表示,我沒有這種敏銳的直覺,看不出自己代碼中的問題咋辦呢?
我自己有一些經(jīng)驗(yàn)方法,大家可以嘗試一下:
當(dāng)你覺得有段代碼寫起來很麻煩時(shí),多半有問題,不妨去搜索下有沒有現(xiàn)成的組件,或者別人是怎么實(shí)現(xiàn)的。
當(dāng)你重復(fù)寫某段代碼時(shí),一定有問題,不妨把它抽象成函數(shù)或組件、或者用設(shè)計(jì)模式來優(yōu)化。
當(dāng)某段代碼中寫了大量的 If Else 時(shí),一定有問題,試著重新梳理邏輯,減少條件和分支。
多關(guān)注開發(fā)工具的報(bào)黃和報(bào)紅提示,通常能得到很多好的優(yōu)化建議,盡早發(fā)現(xiàn)問題。

再給大家一道練習(xí)題,上面舉的栗子是前端的,這次就舉個(gè) Java 的吧。
目標(biāo)是獲得所有狗的名字列表,老弟小阿巴寫的代碼如下:
//?獲得所有狗的名字列表
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;
這段代碼有問題么?如何優(yōu)化呢?大家快來試試吧~
小提示,一行代碼就可以實(shí)現(xiàn)同樣的功能!歡迎在評論區(qū)交流。
好了以上就是本期分享,有幫助的話求個(gè) 贊 ,希望讓更多人學(xué)到。

我是魚皮,原創(chuàng)不易,如果覺得文章還不錯(cuò)的話,希望朋友們 點(diǎn)贊 支持下,給俺點(diǎn)創(chuàng)作動(dòng)力。
最近還在開發(fā)我的 編程導(dǎo)航( https://www.code-nav.cn ),一個(gè)幫大家找編程資源的項(xiàng)目,歡迎使用!

我是如何在大學(xué)期間通過自學(xué),拿到騰訊、字節(jié)等大廠 offer 的,可以看這篇文章,不再迷茫!
我學(xué)計(jì)算機(jī)的四年,共勉?。?https://t.1yb.co/q0mS )