作者 | 魚皮
來源 | 程序員魚皮(ID:coder_yupi)
分享自己寫代碼時的好習慣,讓你的編程能力突飛猛進!
很多同學在學編程時不注重代碼質量,養成壞習慣的同時,失去了提升自己編程能力的機會。如何有意提升自己的代碼質量呢?我根本就發現不了自己代碼中的問題,以為已經寫得很棒棒了,怎么辦?
要解決這個問題其實非常簡單,既然自己經驗不足、或者是 “只緣身在此山中”,看不出來代碼哪里寫的不好,那就找其他朋友或有經驗的程序員幫你看看代碼,給出一些意見。
雖然每個正常的程序員都無法忍受自己寫的代碼被人說是辣雞,但是虛心接受指正,并加以修改,的確能大大加深我們的印象,下次寫代碼時就會注意了。慢慢地,就養成了好習慣,不僅注重自己的代碼質量,還會 “繼承傳統”,開始說別人寫的代碼辣雞,從而幫助更多人改進。
但有一個很殘酷的現實,誰這么好心幫我看代碼呢?
我大學期間,雖然做過很多項目,寫過很多代碼,但是自己的代碼基本都只給自己看。即使把大作業的代碼交給老師,他們也根本不看代碼,只看運行效果的,這也是上次提到的為什么大家越來越不注重代碼質量的原因之一。而且實不相瞞,我也曾經求學長幫我看代碼,但換位思考一下,如果不是和你關系非常好,誰閑的蛋疼免費去幫你看你寫的辣雞代碼?
求人不得,只能求己。
一種方式就是把自己開發好的作品上線,讓用戶來使用它,從而幫你發現一些自己沒注意到的 Bug 或功能問題,驅使你去仔細閱讀和改進代碼。還可以把自己的代碼公開到 GitHub 等代碼托管平臺,允許其他同學閱讀和指出問題。但是,這種方式過于硬核,前期需要耗費大量精力去做推廣,否則根本沒人用你的項目,也沒人去看你的 GitHub!
硬核的方式咱玩不了,那我就教大家人人都能輕松學會的一招,也是我自己一直堅持的編程習慣。
下面一起來看看我寫代碼時的小倔強吧,有效提高你的代碼質量,編程能力突飛猛進!
我的編程習慣
就像之前說的,我們之所以發現不了代碼中的問題,很大程度上是因為我們的編程態度是 “樂觀” 的,相信視頻教程、相信書本、相信編輯器,只要沒報錯,那就是對的。
但我寫代碼時,非常地 “悲觀” 且倔強,我會細致入微地把自己寫過的每一行代碼都看作是病人,堅持認為他們是有問題的,甚至可以說是從雞蛋里挑骨頭!
有同學說了,你特么不就是在說廢話么,這不就是仔細檢查代碼?或者說是防御性編程?
先別急,這和防御性編程可不一樣,我有多倔,舉個栗子你就明白了,下面請跟上我的思路~
我有多倔?
假如我寫了這樣一端前端代碼,作用是獲取某條狗的名字:
// 默認狗名
let name = '無名狗';
// 狗、狗信息、狗名稱都存在
if (dog && dog.info && dog.info.name) {
name = dog.info.name;
}
你覺得這段代碼有問題么?
如果你覺得沒有問題,那么很好,你很樂觀。
無所謂了,我才不要你覺得,我很倔,我就偏偏覺得這段代碼有問題,沒問題我也得挑挑問題 。
嗯,代碼邏輯好像沒毛病,那硬要說有問題的話,代碼量是不是有點多?
比如在獲取狗名時,為了防止報錯,要先判斷狗是否存在,再判斷狗的信息是否存在,最后才能取到狗名,好啰嗦啊。如果還要獲取一堆其他的信息,這代碼簡直沒法看了。
所以,我就開始思考,如何讓這段代碼更加精簡,有沒有更好的寫法呢?
通過百度,我發現了一個牛逼的玩意兒,叫 可選鏈操作符( ?. ),允許讀取對象深處的屬性值,而不必明確驗證鏈中的每個引用是否有效;在引用為空的情況下不會引起錯誤,會自動短路返回值。
于是,代碼變成了這樣:
// 默認狗名
let name = '無名狗';
// 狗、狗信息、狗名稱都存在
if (dog?.info?.name) {
name = dog.info.name;
}
已經比剛剛簡化了不少,但我不滿足,獲取個狗名竟然要寫 4 行代碼?這肯定有問題啊!能不能再簡化一下呢?
思考了一下,這次我憑著自己賊硬的基礎知識儲備,沒有百度就想出了更精簡的寫法,使用 JAVAScript 的三元運算符就行了,代碼如下:
let name = dog?.info?.name ? dog.info.name : '無名氏';
怎么樣,一行代碼搞定!
下面給大家個機會,代碼寫成這樣還有問題不?或者說,你看這行代碼覺得舒服么?
反正我覺得不太行,我魚某偏要從雞蛋里挑骨頭!
仔細看,我們發現 dog、info、name 這三個單詞都重復出現了兩遍,那有什么辦法再精簡一下呢?
再次打開搜索引擎,這次搜了半天都沒找到優化的方法,那我干脆就去搜了 “JavaScript 小技巧”、“JavaScript 高級寫法” 等關鍵詞,終于找到了答案。
空值合并操作符( ?? ),當左側的操作數為 或者 undefined 時,返回其右側操作數,否則返回左側操作數。
最終,代碼縮成了這樣:
let name = dog?.info?.name ?? '無名狗';
舒服多了吧!
這就是我寫代碼時的倔強,通過這次挑問題,起碼幫助我學到了兩個 JavaScript 操作符的用法,爽死了!
值得么?
那有同學說了:像你這樣寫代碼,不累么?這么認真地去摳代碼的細節,不會很花時間么?
小了,格局小了。
從這一次寫代碼來看,的確我花了更多的時間,代碼能跑就行了,管那么多別的干啥呢?但從長遠來看,這是學習的必經之路,通過自己思考去發現問題、解決問題,學到的知識可以說是深深地刻在了腦海里,以后再寫類似的代碼時,就能更輕松、規范和高效,省下的時間是無限的!
當然,摳細節也要看情況,如果你要開發的東西很緊急,肯定還是先以完成功能為主。但等后面有空了,一定要記得優化一下,否則你也算是為代碼 “屎山” 貢獻了自己的一份力量。
悲觀編程還有什么其他的好處呢?
樂觀編程時,我們往往是被動地發現問題,以為代碼跑的很順利,但卻往往被別人來提 Bug,再被迫修改,心態會越來越差。
而悲觀編程時,我們是自己主動找問題,主動去優化代碼。當你通過思考、搜索和實踐,將原本很復雜的代碼化繁為簡后,你會驚喜地發現:我去,原來代碼還可以這樣寫!牛逼牛逼!
然后,你就會收獲成就感,繼續堅持這種習慣,不斷進步。
這讓我不禁想起了拼多多,早期沒有給用戶很高的預期,讓他們覺得這是個多牛逼的產品。而是主動降低用戶的預期,讓大家都覺得這是個土味兒產品,后來再一次次地超出預期,最終走向成功。
找不到問題?
看到這里,大家應該理解我寫代碼時的倔強了。但一定會有同學表示,我沒有這種敏銳的直覺,看不出自己代碼中的問題咋辦呢?
我自己有一些經驗方法,大家可以嘗試一下:
-
當你覺得有段代碼寫起來很麻煩時,多半有問題,不妨去搜索下有沒有現成的組件,或者別人是怎么實現的。
-
當你重復寫某段代碼時,一定有問題,不妨把它抽象成函數或組件、或者用設計模式來優化。
-
當某段代碼中寫了大量的 If Else 時,一定有問題,試著重新梳理邏輯,減少條件和分支。
-
多關注開發工具的報黃和報紅提示,通常能得到很多好的優化建議,盡早發現問題。
再給大家一道練習題,上面舉的栗子是前端的,這次就舉個 Java 的吧。
目標是獲得所有狗的名字列表,老弟小阿巴寫的代碼如下:
// 獲得所有狗的名字列表
List<Dog> dogList = new ArrayList<>;
List<String> dogNameList = new ArrayList<>;
if (dogList != && dogList.size > 0) {
for (int i = 0; i < dogList.size; i++) {
Dog dog = dogList.get(i);
if (dog != ) {
dogNameList.add(dog.getName);
}
}
}
return dogNameList;
這段代碼有問題么?如何優化呢?大家快來試試吧~
小提示,一行代碼就可以實現同樣的功能!歡迎在評論區交流。