團(tuán)隊(duì)里的妹子讓阿粉跟她說說怎樣寫出好的代碼
本文轉(zhuǎn)載自微信公眾號(hào)「Java極客技術(shù)」,作者鴨血粉絲。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java極客技術(shù)公眾號(hào)。
昨天,團(tuán)隊(duì)里的妹子很突然地就讓阿粉跟她說說怎么才能寫出一手好的代碼
阿粉本著負(fù)責(zé)任的態(tài)度,專門寫了一篇文章出來,妹子嘛,就是要寵的嘛
寫好注釋
寫代碼這件事情,大概就是一時(shí)編程一時(shí)爽,過后調(diào)試火葬場(chǎng)
阿粉有過一次經(jīng)歷,就是當(dāng)時(shí)開發(fā)任務(wù)緊,把功能實(shí)現(xiàn)之后就完事兒了,也沒有好好寫注釋。結(jié)果過了兩三個(gè)月之后,那個(gè)功能因?yàn)樾枨笞儎?dòng)出 bug 了,出了 bug 就去解決唄
但是!!!因?yàn)榘⒎蹧]有寫注釋,當(dāng)時(shí)的實(shí)現(xiàn)邏輯,為什么這樣寫全忘了,所以相當(dāng)于又重頭捋了一遍邏輯,那個(gè)味道,真是酸爽
圖片
所以阿粉要把這個(gè)建議放在第一個(gè)!
寫注釋的時(shí)候,如果邏輯比較復(fù)雜,可以先寫一下大體思路,然后下面具體實(shí)現(xiàn)時(shí)再詳細(xì)寫,比如阿粉曾經(jīng)寫過的代碼(做了脫敏處理,大家不要太較真啦,重點(diǎn)是阿粉寫的注釋
- /**
- * 進(jìn)行 XX 操作時(shí)調(diào)用此方法,用來向數(shù)據(jù)庫插入數(shù)據(jù)
- * @param saveModel 要插入的數(shù)據(jù)
- * @return 是否保存成功
- *
- * @author a'fen
- * @date 2020-10-17 23:50:45
- */
- public Boolean isSaveSuccess(SaveModel saveModel) {
- /*
- 整體思路:
- 1 接收傳入的所有 id/name 的信息
- 2 插入相關(guān)信息
- 2.1 XX 信息插入成功之后,再去 YY 表進(jìn)行相關(guān)信息插入
- 3 對(duì) YY 表進(jìn)行插入時(shí),先判斷是否有相關(guān)信息,如果有則進(jìn)行更新,如果沒有則直接插入
- 4 是否添加 AA ,如果業(yè)務(wù)上配置了 AA ,則需要將相關(guān)內(nèi)容更新到 ZZ 表中
- 注: 在 BB 界面點(diǎn)擊下一步時(shí),已經(jīng)將相關(guān)信息插入到了 ZZ 表中
- 所以在這里只做更新即可
- */
- // 1 接收傳入的所有 id/name 的信息
- // 創(chuàng)建 xxList 用來接收所有的 id/name 的信息
- List<XXModel> xxList = new ArrayList<>();
- // 對(duì)傳入的信息按照 id 進(jìn)行排序,方便接下來的操作
- saveModel.getIdList().stream.collect(Collectors.groupingBy(SaveModel::getId))
- .forEach((String mapKey, List<SaveModel> save) -> {
- xxList.addAll(save);
- });
- // 2 插入相關(guān)信息
- // 循環(huán) xxList
- for (XXModel model : xxList) {
- // 向 XX 表插入信息
- 實(shí)現(xiàn)代碼
- // 2.1 插入成功,去 YY 表做相關(guān)信息插入
- 實(shí)現(xiàn)代碼
- }
- // 3 對(duì) YY 表進(jìn)行插入時(shí),先判斷是否有相關(guān)信息,如果有則進(jìn)行更新,如果沒有則直接插入
- 實(shí)現(xiàn)代碼
- // 4 是否添加 AA ,如果業(yè)務(wù)上配置了 AA ,則需要將相關(guān)內(nèi)容更新到 ZZ 表中
- 實(shí)現(xiàn)代碼
- }
在寫代碼之前,先想想可能的應(yīng)用場(chǎng)景
有時(shí)候拿到需求之后,如果著急去做,后期可能會(huì)耗費(fèi)不少的精力
阿粉曾經(jīng)做過一個(gè)業(yè)務(wù),類似用戶充值的場(chǎng)景,當(dāng)時(shí)阿粉拿到這個(gè)需求之后,就想著不就是充值錢嘛,那就定義一個(gè) Integer 類型不就完了,然后一頓操作猛如虎,上線之后也沒啥問題
結(jié)果有一次公司運(yùn)營和其他一些第三方合作,用的就是充值這個(gè)接口,然后因?yàn)檫\(yùn)營大批量的持續(xù)充值,直接超出了 Integer 的允許范圍,導(dǎo)致整條業(yè)務(wù)線都沒辦法跑通
然后排查問題排查到最后,發(fā)現(xiàn)是阿粉造成的,而且還是因?yàn)橐粋€(gè)數(shù)據(jù)類型引發(fā)的...阿粉當(dāng)時(shí)真的是想鉆到地下
代碼是寫給人看的,所以讓自己的代碼干凈整潔一些
代碼是寫給人看的,不是寫給機(jī)器看的。你想嘛,如果想要讓機(jī)器看,直接寫 0110001 這種編碼方式不香嗎!畢竟機(jī)器它只認(rèn) 0 或者 1
所以代碼是寫給人看的,那么寫代碼的時(shí)候就讓它干凈整潔一些
比如:該縮進(jìn)的縮進(jìn),該空一行的就空一行,比如下面這樣:
- public static void sleep(long millis, int nanos)
- throws InterruptedException {
- if (millis < 0) {
- throw new IllegalArgumentException("timeout value is negative");
- }
- if (nanos < 0 || nanos > 999999) {
- throw new IllegalArgumentException(
- "nanosecond timeout value out of range");
- }
- if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
- millis++;
- }
- sleep(millis);
- }
要縮進(jìn)有縮進(jìn),該空一行就空一行,不用你們夸,我自己都覺得這代碼寫的,真是好!(Thread 源碼誰敢說不好?!
沒事兒就和阿粉多聊聊源碼
其實(shí)想要寫一手好的代碼,最重要的就是要多看,自己多寫
看什么呢?阿粉覺得看源碼就夠了。JDK 源碼這么多人都在用,足以說明 JDK 源碼的代碼寫的有多優(yōu)秀
所以呢,沒事兒就和阿粉多聊聊源碼,沒事兒就約約阿粉去圖書館一起研究研究源碼,平時(shí)自己寫代碼的時(shí)候,多注意借鑒從源碼中學(xué)到的實(shí)現(xiàn)思路,學(xué)到的編程技巧,日積月累下來肯定能在編程上有一個(gè)很好的提升