代碼潔癖系列(五):外在的格式美

代碼潔癖系列(五):外在的格式美

我們在閱讀一些優秀項目的源碼時,一定會感嘆他們代碼的整潔和一致性。而作為第一印象,代碼格式的整齊是讓人能夠繼續閱讀下去的動力。今天我們分別從垂直格式和橫向格式兩個方面來討論代碼的格式。修正格式的方法有:間隔、靠近和調整順序。<!-- more -->

垂直格式

在垂直格式方面,我們要向報紙的排版學習。

首先有一個標題告訴你這欄新聞要講什麼,好讓你知道是否要繼續閱讀下去。對應到代碼中就是類的名字,我們要力求只通過名字就可以知道這個類要描述什麼事情;然後,代碼的第一段往往都交代了整個故事的概要,類似於代碼中的介面,我們往往通過介面了解類中有哪些函數,每個函數都是幹什麼的。了解了這些之後,才會去讀詳細的內容。

newspapercode標題類名第一段介面內容方法體

此外,還需要注意的就是報紙的排版、段落和段落之間用空行做間隔。寫代碼也可以用同樣的方式,例如,我們習慣於在包聲明、導入聲明和每個函數之間用空白行來分隔。我們直接拿代碼來解釋。

package com.thoughtworks.selenium;?import org.testng.ITestContext;import org.testng.ITestResult;import org.testng.Reporter;import org.testng.internal.IResultListener;?import java.io.File;?public class ScreenshotListener implements IResultListener {? File outputDirectory; Selenium selenium;? public ScreenshotListener(File outputDirectory, Selenium selenium) { this.outputDirectory = outputDirectory; this.selenium = selenium; }? public void onTestFailure(ITestResult result) { Reporter.setCurrentTestResult(result);? try { outputDirectory.mkdirs(); File outFile = File.createTempFile("TEST-" + result.getName(), ".png", outputDirectory); outFile.delete(); selenium.captureScreenshot(outFile.getAbsolutePath()); Reporter.log("<a href=" + outFile.getName() + ">screenshot</a>"); } catch (Exception e) { e.printStackTrace(); Reporter.log("Couldnt create screenshot"); Reporter.log(e.getMessage()); }? Reporter.setCurrentTestResult(null); }}package com.thoughtworks.selenium;import org.testng.ITestContext;import org.testng.ITestResult;import org.testng.Reporter;import org.testng.internal.IResultListener;import java.io.File;public class ScreenshotListener implements IResultListener { File outputDirectory; Selenium selenium; public ScreenshotListener(File outputDirectory, Selenium selenium) { this.outputDirectory = outputDirectory; this.selenium = selenium; } public void onTestFailure(ITestResult result) { Reporter.setCurrentTestResult(result); try { outputDirectory.mkdirs(); File outFile = File.createTempFile("TEST-" + result.getName(), ".png", outputDirectory); outFile.delete(); selenium.captureScreenshot(outFile.getAbsolutePath()); Reporter.log("<a href=" + outFile.getName() + ">screenshot</a>"); } catch (Exception e) { e.printStackTrace(); Reporter.log("Couldnt create screenshot"); Reporter.log(e.getMessage()); } Reporter.setCurrentTestResult(null); }}

是不是適當增加空白行就提高了代碼的可讀性呢,這裡說的是適當增加空白行,並不代表隨意增加。事實上,如果增加一些無意義的空白行反而會使代碼的可讀性變差。

我們習慣於使有關聯的代碼彼此靠近,無明顯關聯的代碼相互分隔。因此我們不但需要使用空白行間隔代碼,還要調整代碼位置,把有關聯的代碼放在一起,通常我們把被調用的函數放在調用函數的下面。這樣別人在讀我們的代碼的時候再也不用經歷來回「跳躍」的痛苦了。

最後,我們通常把實體變數定義在類的頂部,這個只是我們Java程序員的習慣操作,如果突然在類的中間位置出現一個變數聲明會讓人覺得很奇怪。如果你想說,定義在中間是不想讓定義位置和調用位置離太遠,那麼只能說明你的類定義出現了問題。建議你看一下舊文代碼潔癖系列(三):整潔的類和函數。

橫向格式

介紹完垂直格式,緊接著自然要來介紹一下它的兄弟,橫向格式。或許你會問為什麼不叫水平格式,我的回答是:也可以叫水平格式,只要你喜歡。橫向格式也是需要間隔和靠近的,這裡的間隔主要是為了起到強調的效果。舉個例子。

int lineSize = line.length();

這裡等號兩邊的空格分別是為了強調左右兩邊的元素。橫向格式另一個比較重要的元素就是縮進,Java程序對縮進沒有強制性要求,而Python程序對縮進的要求非常嚴格,稍有不慎,執行的結果就會不同。但是Java程序員也要注意縮進,因為我們的代碼是層級關係,而縮進可以幫我們快速理清層級關係。

最後,橫向代碼格式對每行代碼長度是有要求的,如果代碼過長,那麼在閱讀的時候就需要左右滑動,而這個操作其實是不受人喜歡的。雖然現在代碼編輯器可顯示的長度變大了,但我們還是習慣每行代碼最多100個字元。

團隊的規則

每一個優秀的團隊都已一套屬於自己的代碼格式要求,有些是特定的,有些是使用公共的。我們team所用的代碼規範就是Google的代碼規範,阿里的代碼規範也是比較被大家認可的。這裡給大家一個小福利,在我的公眾號後台回復【代碼規範】,就可以獲得一份阿里的Java開發手冊。

推薦閱讀:

不怕你龜毛,搞定潔癖王的年末大掃除指南
巨蟹女:極度敏感,重度精神潔癖,嚴重戀舊
這些星座男有嚴重感情潔癖
岳飛死於精神潔癖:自己不貪污 認為大家都該如此

TAG:潔癖 | 代碼 | 計算機科學 |