開(kāi)發(fā)規(guī)范真的很重要
掃描二維碼
隨時(shí)隨地手機(jī)看文章
最近阿里巴巴的 Java 開(kāi)發(fā)手冊(cè)出了新版(可直接到 github alibaba-p3c 上獲取相關(guān)資源哦),我就跟著這個(gè)事情說(shuō)一下我對(duì)開(kāi)發(fā)規(guī)范的理解吧。
提起開(kāi)發(fā)規(guī)范,我印象中最深的就是讀研究生期間,帶我的大牛師兄某導(dǎo)對(duì)我的要求。當(dāng)時(shí)是開(kāi)發(fā)一款 B/S 的 3D 渲染引擎,其中 Web 部分由我負(fù)責(zé),在大師兄在對(duì)我進(jìn)行 code review 的過(guò)程中,對(duì)我提出了“嚴(yán)厲”的批評(píng)(也一直很感謝他當(dāng)時(shí)的嚴(yán)格要求),原因不是別的,就是我開(kāi)發(fā)的網(wǎng)頁(yè)中有一部分是文字介紹,里面的標(biāo)點(diǎn)符號(hào)是中英文混用,且代碼也不規(guī)范,比如縮進(jìn)不一致、該有的空格沒(méi)有等等問(wèn)題。就是從那個(gè)時(shí)候起,我對(duì)代碼規(guī)范非常重視。這對(duì)后來(lái)自己寫(xiě)畢業(yè)論文等等方面也起到了良好的促進(jìn)作用,因?yàn)閷?dǎo)師對(duì)這塊要求也相對(duì)嚴(yán)格。
回到代碼規(guī)范這件事情上,好的代碼讀起來(lái)真的是賞心悅目,當(dāng)然自己也一直在追求寫(xiě)出好的代碼。代碼規(guī)范中的 code style 只是其中最簡(jiǎn)單的一種,上述提到的 Java 開(kāi)發(fā)手冊(cè)也對(duì)這部分做出了嚴(yán)格的說(shuō)明,但實(shí)際上能做到的人也不多。按道理,這部分也是最容易做到的一種,因?yàn)橛心0?,直接遵守即可。記得有一部電視?。ń猩秮?lái)著?)講的就是一堆情侶因?yàn)榧m結(jié)到底是用空格還是 tab 鍵(或者是 Vim 和 Emacs)分手,哈哈這當(dāng)然是一個(gè)笑話。不過(guò)在一個(gè) team 里保持統(tǒng)一的代碼風(fēng)格還是有必要的,畢竟你寫(xiě)的代碼不是只有你一個(gè)人看,在不同的終端,不同的編輯器來(lái)講空格和 tab 可能顯示效果都不一樣,也就影響了閱讀體驗(yàn)。
(圖 1. hackthon 團(tuán)隊(duì)合影)
對(duì)于代碼規(guī)范來(lái)講,我也希望通過(guò)自己的努力去感染身邊的人。比如之前在宜信的 hackthon,我就組隊(duì)發(fā)起了一個(gè)叫 “code review advisor” 項(xiàng)目,實(shí)現(xiàn)的目的其實(shí)也很簡(jiǎn)單,就是讓大家在預(yù)先統(tǒng)一的規(guī)范下編碼,如果有違反規(guī)范的,直接以 Comment 形式告訴代碼提交者需要修改。
(圖 2. hackthon 項(xiàng)目截圖)
后來(lái),我到了大疆,又要求 team 同學(xué)嚴(yán)格遵守規(guī)范,并且使用了一些技術(shù)手段完全規(guī)范大家提交的代碼,對(duì)于違反相應(yīng)規(guī)則的代碼直接不讓提交和打包,當(dāng)時(shí)其實(shí)就是利用了 alibaba 對(duì)外開(kāi)源的工具支持。不得不說(shuō),還是很佩服阿里巴巴對(duì)社區(qū)做的相應(yīng)貢獻(xiàn)的。
現(xiàn)在,我在阿里,發(fā)現(xiàn)現(xiàn)實(shí)就是規(guī)范其實(shí)也是一個(gè)美好的愿景,因?yàn)楦鞣N歷史等原因,其實(shí)大家的代碼并沒(méi)有按照預(yù)期的規(guī)范去執(zhí)行和實(shí)施。這應(yīng)該也是普遍的現(xiàn)狀吧。就像在其中一次交流會(huì)上,孤盡大佬說(shuō)的那樣,美好愿景肯定是需要的,實(shí)現(xiàn)她,是需要大家花時(shí)間和精力去推進(jìn)的。
(圖 3. 孤盡大佬簽名版開(kāi)發(fā)手冊(cè))
上圖是在那次交流會(huì)上,得到孤盡大佬簽名版的開(kāi)發(fā)手冊(cè)(原諒我沒(méi)文化,認(rèn)不出)。下面我就以其中的一個(gè)例子來(lái)說(shuō)明一下規(guī)范的好處。
public class SimpleDateFormatTest {
public static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) {
Date now = new Date();
String printedDate = simpleDateFormat.format(now);
System.out.println(printedDate);
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Date date = simpleDateFormat.parse(printedDate);
System.out.println(simpleDateFormat.format(date));
} catch (ParseException e) {
e.printStackTrace();
}
}
}).start();
}
}
}
上面代碼片段就是規(guī)范中提到的 SimpleDateFormat
使用場(chǎng)景中一個(gè)錯(cuò)誤的示例,其實(shí)就是一個(gè)線程安全的問(wèn)題,跑上面代碼片段,預(yù)期輸出應(yīng)該是一個(gè)正確的字符串表達(dá)(例如 2020-04-25 15:41:34
),實(shí)際過(guò)程有可能會(huì)拋異常(例如 java.lang.NumberFormatException
),也可能會(huì)輸出一些奇奇怪怪的時(shí)間(例如 0015-03-25 15:41:34
),這其實(shí)都還好,因?yàn)楫吘挂串惓A?,要么“時(shí)間不正?!?,最要命的是可能會(huì)輸出一個(gè)正確格式的時(shí)間,只不過(guò)不是預(yù)期的,這種問(wèn)題就相對(duì)很難排查了。
還有比如前面剛跨年的時(shí)候各個(gè)系統(tǒng)都爆出的時(shí)間跨年問(wèn)題(yyyy
和 YYYY
的問(wèn)題),在此手冊(cè)中其實(shí)也都有說(shuō)明。所以,其實(shí)類似的規(guī)范多多了解更好。
特別推薦一個(gè)分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒(méi)關(guān)注的小伙伴,可以長(zhǎng)按關(guān)注一下:
長(zhǎng)按訂閱更多精彩▼
如有收獲,點(diǎn)個(gè)在看,誠(chéng)摯感謝
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!