[轉]高質量JAVA程式碼編寫規範
1. Java 命名約定
除了以下幾個特例之外,命名時應始終採用完整的英文描述符。此外,一般應採用小寫字母,但類名、介面名以及任何非初始單詞的第一個字母要大寫。
1.1 一般概念
* 儘量使用完整的英文描述符
* 採用適用於相關領域的術語
* 採用大小寫混合使名字可讀
* 儘量少用縮寫,但如果用了,要明智地使用,且在整個工程中統一
* 避免使用長的名字(小於 15 個字母是個好主意)
* 避免使用類似的名字,或者僅僅是大小寫不同的名字
* 避免使用下劃線(除靜態常量等)
1.2 示範
* 包(Package) 採用完整的英文描述符,應該都是由小寫字母組成。對於全域性包,將你的 Internet 域名反轉並接上包名。 如:
java.awt
com.ambysoft.www.persistence
* 類(Class) 採用完整的英文描述符,所有單詞的第一個字母大寫。 如:
Customer
SavingsAccount
* 介面(Interface) 採用完整的英文描述符說明介面封裝,所有單詞的第一個字母大寫。習慣上,名字後面加上字尾 able, ible 或者 er,但這不是必需的。如:
Contactable
Prompter
* 元件/部件(Component) 使用完整的英文描述來說明元件的用途,末端應接上元件型別。 如:
okButton
customerList
fileMenu
* 異常(Exception) 通常採用字母 e 表示異常。 e
* 類變數 欄位採用完整的英文描述,第一個字母小寫,任何中間單詞的首字大寫,如: firstName
lastName
* 實參/引數 同欄位/屬性的命名規則
public void setFirstName(String firstName){
this.firstName = firstName;
}
* 區域性變數 同欄位/屬性的命名規則
** 獲取成員函式 被訪問欄位名的前面加上字首 get。 getFirstName(), getLastName()
** 布林型的獲取成員函式 所有的布林型獲取函式必須用單詞 is 做字首。 isPersistent(), isString()
** 設定成員函式 被訪問欄位名的前面加上字首 set。 setFirstName(), setLastName(),setWarpSpeed()
** 普通成員函式 採用完整的英文描述說明成員函式功能,第一個單詞儘可能採用一個生動的動詞,第一個字母小寫。 openFile(), addAccount()
* 靜態常量欄位(static final) 全部採用大寫字母,單詞之間用下劃線分隔。 MIN_BALANCE, DEFAULT_DATE
* 迴圈計數器 通常採用字母 i,j,k 或者 counter 都可以接受。 i, j, k, counter
* 陣列 陣列應該總是用下面的方式來命名: byte[] buffer;
2. Java 註釋約定
一個很好的可遵循的有關注釋的經驗法則是:問問你自己,你如果從未見過這段程式碼,要在合理的時間內有效地明白這段程式碼,你需要哪些資訊。
2.1. 一般概念
* 註釋應該增加程式碼的清晰度
* 保持註釋的簡潔
* 在寫程式碼之前寫註釋
* 註釋出為什麼做了一些事,而不僅僅是做了什麼
2.2. 示範
* 文件註釋
在緊靠介面、類、成員函式和欄位宣告的前面註釋它們。
/**
*
* 客戶:客戶是我們將服務和產品賣給的人或機構。
*/
* C 語言風格
採用 C 語言風格的註釋去掉不再使用但你仍想保留的程式碼。仍想保留是因為使用者萬一會改變想法,或者在除錯過程中想讓它暫時失效。如:
/* 這部分程式碼因為已被它之前的程式碼取代,由 B.Gustafsson, 於 1999 年 6 月
*4 日註釋掉。如果兩年之後還未使用,將其刪除。. . .
*(原始碼)
*/
* 單行
在成員函式內採用單行註釋,來說明業務邏輯、程式碼段和暫時變數的宣告。註釋符"//"後必須緊跟一個空格,然後才是註釋資訊。 如:
// 遵照 Sarek 的規定,給所有
// 超過 $1000 的發貨單
// 打 5% 的折扣。讓利活
// 動於 1995年 2 月開始.
2.3. 註釋哪些部分
類 類的目的、即類所完成的功能,註釋出採用的變數。
介面 設定介面的目的、它應如何被使用以及如何不被使用。
成員函式註釋 對於設定與獲取成員函式,在成員變數已有說明的情況下,可以不加註釋;普通成員函式要求說明完成什麼功能,引數含義是什麼返回什麼;
普通成員函式內部註釋 控制結構,程式碼做了些什麼以及為什麼這樣做,處理順序等。
實參/引數 引數含義、及其它任何約束或前提條件
欄位/屬性 欄位描述
區域性變數 無特別意義的情況下不加註釋
3. Java 檔案樣式約定
所有的 Java(*.java) 檔案都必須遵守如下的樣式規則:
1) 版權資訊
版權資訊必須在 java 檔案的開頭,比如:
/**
* Copyright @ 2000 Shanghai XXX Co. Ltd.
* All right reserved.
* @author: gcgmh
* date: 2008-12-22
*/
其他不需要出現在 javadoc 的資訊也可以包含在這裡。
2) Package/Imports
package 行要在 import 行之前,import 中標準的包名要在本地的包名之前,而且按照字母順序排列。如果 import 行中包含了同一個包中的不同子目錄,則應該用 * 來處理。
package hotlava.net.stats;
import java.io.*;
import java.util.Observable;
import hotlava.util.Application;
這裡 java.io.* 是用來代替InputStream and OutputStream 的。
3) Class
接下來的是類的註釋,一般是用來解釋類的。
/**
* A class representing a set of packet and byte counters
* It is observable to allow it to be watched, but only
* reports changes when the current set is complete
*/
接下來是類定義,包含了在不同的行的 extends 和 implements
public class CounterSet extends Observable implements Cloneable{
……
……
}
4) Class Fields
接下來是類的成員變數:
/**
* Packet counters
*/
protected int[] packets;
public的成員變數必須生成文件(JavaDoc)。proceted、private和 package 定義的成員變數如果名字含義明確的話,可以沒有註釋。
5) 存取方法(類的設定與獲取成員函式)
接下來是類變數的存取的方法。它只是簡單的用來將類的變數賦值獲取值的話,可以簡單的寫在一行上,如類的成員變數已經有註釋,類變數的存取方法可以沒有註釋。
public int[] getPackets() { return this.packets; }
public void setPackets(int[] packets) { this.packets = packets; }
……
要求說明的是,對於集合,加入成員函式來插入和刪除項;另其它的方法不要寫在一行上。
6) 建構函式
接下來是建構函式,它應該用遞增的方式寫(比如:引數多的寫在後面)。
public CounterSet(int size){ this.size = size;}
7) 克隆方法
如果這個類是可以被克隆的,那麼下一步就是 clone 方法:
public Object clone() { try { …… }catch(CloneNotSupportedException e) { …… }}
8) 類方法 (類的普通成員函式)
下面開始寫類的方法:
/**
* Set the packet counters
* param r1 - ……
* param r2 - ……
* ……
*/
protected final void setArray(int[] r1, int[] r2, int[] r3, int[] r4) throws IllegalArgumentException{
// Ensure the arrays are of equal size
……
}
9) toString 方法
一般情況下,每一個類都應該定義 toString 方法:
public String toString() { ……}
10) main 方法
普通類,考慮置入一個main()方法,其中包含用於測試那個類的程式碼,如果包含了main() 方法, 那麼它應該寫在類的底部。
4. Java編碼其它約定
n 文件化
必須用 javadoc 來為類生成文件。不僅因為它是標準,這也是被各種 java 編譯器都認可的方法。使用 @author 標記是不被推薦的,因為程式碼不應該是被個人擁有的。
n 縮排
縮排應該是每行2個空格。 不要在原始檔中儲存Tab字元, 在使用不同的原始碼管理工具時Tab字元將因為使用者設定的不同而擴充套件為不同的寬度。
如果你使用 UltrEdit 作為你的 Java 原始碼編輯器的話,你可以通過如下操作來禁止儲存Tab字元, 方法是通過 UltrEdit中先設定 Tab 使用的長度室2個空格,然後用 Format|Tabs to Spaces 選單將 Tab 轉換為空格。
n 頁寬
頁寬應該設定為80字元。 原始碼一般不會超過這個寬度, 並導致無法完整顯示, 但這一設定也可以靈活調整。 在任何情況下, 超長的語句應該在一個逗號或者一個操作符後折行。 一條語句折行後, 應該比原來的語句再縮排2個字元。
n {} 對
{} 中的語句應該單獨作為一行。 例如, 下面的第1行是錯誤的, 第2行是正確的:
if (i>0) { i ++ }; // 錯誤, { 和 } 在同一行 if (i>0) { i ++ }; // 正確, 單獨作為一行
n 括號
左括號和後一個字元之間不應該出現空格; 同樣, 右括號和前一個字元之間也不應該出現空格。 下面的例子說明括號和空格的錯誤及正確使用:
CallProc(AParameter); // 正確
不要在語句中使用無意義的括號,括號只應該為達到某種目的而出現在原始碼中。
n JSP檔案命名
採用完整的英文描述說明JSP所完成的功能,儘可能包括一個生動的動詞,第一個字母小寫,如:viewMessage.jsp、editUser.jsp或者forumChooser.jsp等。
n Servlet類命名
一般對應於所服務的物件加字尾Service來命名,如:UserService,TradeService等。
5. 一些程式設計建議
n 使用 StringBuffer 物件
在處理 String 的時候要儘量使用 StringBuffer 類,StringBuffer 類是構成 String 類的基礎。String 類將 StringBuffer 類封裝了起來,(以花費更多時間為代價)為開發人員提供了一個安全的介面。當我們在構造字串的時候,我們應該用 StringBuffer 來實現大部分的工作,當工作完成後將 StringBuffer 物件再轉換為需要的 String 物件。比如:如果有一個字串必須不斷地在其後新增許多字元來完成構造,那麼我們應該使用 StringBuffer 物件和它的 append() 方法。如果我們用 String 物件代替 StringBuffer 物件的話,會花費許多不必要的建立和釋放物件的 CPU 時間。
n 避免太多的使用 synchronized 關鍵字
避免不必要的使用關鍵字 synchronized,應該在必要的時候再使用它,這是一個避免死鎖的好方法。 必須使用時,也儘量控制範圍,最好在塊級控制。
n 避免使用 java.util.Vector 類
因為"Unlike the new collection implementations, Vector is synchronized.",所以使用java.util.Vector類在效能上會有所減低。
n 儘量使用介面而不是一個具體的類
比方如下需求,給定一個SQL語句,返回一個物件的列表,實現中用java.util.ArrayList實現,於是定義方法為:
public java.util.ArrayList getObjectItems(String sql)
上面的方法存在一個問題,當getObjectItems內改用Vector或LinkedList實現,外部類必須做相應更改。一個更好的方法是定義返回值為java.util.AbstractList更合適:
public java.util.AbstractList getObjectItems(String sql)
這樣即使更改實現,外部類也不必做相應更改。
n 避免使用索引來呼叫資料庫中間層元件返回的結果集
如:
for(int i=1; i<=dt.getRowCount(); i++){ String field1 = dt.getField(i, 0).toString(); ……}
而應用欄位名來存取結果集:
for(int i=1; i<=dt.getRowCount(); i++){ String field1 = dt.getField(i, "field1").toString(); ……}
這樣在資料庫設計更改或查詢的SQL語句發生變化時,不會影響到程式的執行。
除了以下幾個特例之外,命名時應始終採用完整的英文描述符。此外,一般應採用小寫字母,但類名、介面名以及任何非初始單詞的第一個字母要大寫。
1.1 一般概念
* 儘量使用完整的英文描述符
* 採用適用於相關領域的術語
* 採用大小寫混合使名字可讀
* 儘量少用縮寫,但如果用了,要明智地使用,且在整個工程中統一
* 避免使用長的名字(小於 15 個字母是個好主意)
* 避免使用類似的名字,或者僅僅是大小寫不同的名字
* 避免使用下劃線(除靜態常量等)
1.2 示範
* 包(Package) 採用完整的英文描述符,應該都是由小寫字母組成。對於全域性包,將你的 Internet 域名反轉並接上包名。 如:
java.awt
com.ambysoft.www.persistence
* 類(Class) 採用完整的英文描述符,所有單詞的第一個字母大寫。 如:
Customer
SavingsAccount
* 介面(Interface) 採用完整的英文描述符說明介面封裝,所有單詞的第一個字母大寫。習慣上,名字後面加上字尾 able, ible 或者 er,但這不是必需的。如:
Contactable
Prompter
* 元件/部件(Component) 使用完整的英文描述來說明元件的用途,末端應接上元件型別。 如:
okButton
customerList
fileMenu
* 異常(Exception) 通常採用字母 e 表示異常。 e
* 類變數 欄位採用完整的英文描述,第一個字母小寫,任何中間單詞的首字大寫,如: firstName
lastName
* 實參/引數 同欄位/屬性的命名規則
public void setFirstName(String firstName){
this.firstName = firstName;
}
* 區域性變數 同欄位/屬性的命名規則
** 獲取成員函式 被訪問欄位名的前面加上字首 get。 getFirstName(), getLastName()
** 布林型的獲取成員函式 所有的布林型獲取函式必須用單詞 is 做字首。 isPersistent(), isString()
** 設定成員函式 被訪問欄位名的前面加上字首 set。 setFirstName(), setLastName(),setWarpSpeed()
** 普通成員函式 採用完整的英文描述說明成員函式功能,第一個單詞儘可能採用一個生動的動詞,第一個字母小寫。 openFile(), addAccount()
* 靜態常量欄位(static final) 全部採用大寫字母,單詞之間用下劃線分隔。 MIN_BALANCE, DEFAULT_DATE
* 迴圈計數器 通常採用字母 i,j,k 或者 counter 都可以接受。 i, j, k, counter
* 陣列 陣列應該總是用下面的方式來命名: byte[] buffer;
2. Java 註釋約定
一個很好的可遵循的有關注釋的經驗法則是:問問你自己,你如果從未見過這段程式碼,要在合理的時間內有效地明白這段程式碼,你需要哪些資訊。
2.1. 一般概念
* 註釋應該增加程式碼的清晰度
* 保持註釋的簡潔
* 在寫程式碼之前寫註釋
* 註釋出為什麼做了一些事,而不僅僅是做了什麼
2.2. 示範
* 文件註釋
在緊靠介面、類、成員函式和欄位宣告的前面註釋它們。
/**
*
* 客戶:客戶是我們將服務和產品賣給的人或機構。
*/
* C 語言風格
採用 C 語言風格的註釋去掉不再使用但你仍想保留的程式碼。仍想保留是因為使用者萬一會改變想法,或者在除錯過程中想讓它暫時失效。如:
/* 這部分程式碼因為已被它之前的程式碼取代,由 B.Gustafsson, 於 1999 年 6 月
*4 日註釋掉。如果兩年之後還未使用,將其刪除。. . .
*(原始碼)
*/
* 單行
在成員函式內採用單行註釋,來說明業務邏輯、程式碼段和暫時變數的宣告。註釋符"//"後必須緊跟一個空格,然後才是註釋資訊。 如:
// 遵照 Sarek 的規定,給所有
// 超過 $1000 的發貨單
// 打 5% 的折扣。讓利活
// 動於 1995年 2 月開始.
2.3. 註釋哪些部分
類 類的目的、即類所完成的功能,註釋出採用的變數。
介面 設定介面的目的、它應如何被使用以及如何不被使用。
成員函式註釋 對於設定與獲取成員函式,在成員變數已有說明的情況下,可以不加註釋;普通成員函式要求說明完成什麼功能,引數含義是什麼返回什麼;
普通成員函式內部註釋 控制結構,程式碼做了些什麼以及為什麼這樣做,處理順序等。
實參/引數 引數含義、及其它任何約束或前提條件
欄位/屬性 欄位描述
區域性變數 無特別意義的情況下不加註釋
3. Java 檔案樣式約定
所有的 Java(*.java) 檔案都必須遵守如下的樣式規則:
1) 版權資訊
版權資訊必須在 java 檔案的開頭,比如:
/**
* Copyright @ 2000 Shanghai XXX Co. Ltd.
* All right reserved.
* @author: gcgmh
* date: 2008-12-22
*/
其他不需要出現在 javadoc 的資訊也可以包含在這裡。
2) Package/Imports
package 行要在 import 行之前,import 中標準的包名要在本地的包名之前,而且按照字母順序排列。如果 import 行中包含了同一個包中的不同子目錄,則應該用 * 來處理。
package hotlava.net.stats;
import java.io.*;
import java.util.Observable;
import hotlava.util.Application;
這裡 java.io.* 是用來代替InputStream and OutputStream 的。
3) Class
接下來的是類的註釋,一般是用來解釋類的。
/**
* A class representing a set of packet and byte counters
* It is observable to allow it to be watched, but only
* reports changes when the current set is complete
*/
接下來是類定義,包含了在不同的行的 extends 和 implements
public class CounterSet extends Observable implements Cloneable{
……
……
}
4) Class Fields
接下來是類的成員變數:
/**
* Packet counters
*/
protected int[] packets;
public的成員變數必須生成文件(JavaDoc)。proceted、private和 package 定義的成員變數如果名字含義明確的話,可以沒有註釋。
5) 存取方法(類的設定與獲取成員函式)
接下來是類變數的存取的方法。它只是簡單的用來將類的變數賦值獲取值的話,可以簡單的寫在一行上,如類的成員變數已經有註釋,類變數的存取方法可以沒有註釋。
public int[] getPackets() { return this.packets; }
public void setPackets(int[] packets) { this.packets = packets; }
……
要求說明的是,對於集合,加入成員函式來插入和刪除項;另其它的方法不要寫在一行上。
6) 建構函式
接下來是建構函式,它應該用遞增的方式寫(比如:引數多的寫在後面)。
public CounterSet(int size){ this.size = size;}
7) 克隆方法
如果這個類是可以被克隆的,那麼下一步就是 clone 方法:
public Object clone() { try { …… }catch(CloneNotSupportedException e) { …… }}
8) 類方法 (類的普通成員函式)
下面開始寫類的方法:
/**
* Set the packet counters
* param r1 - ……
* param r2 - ……
* ……
*/
protected final void setArray(int[] r1, int[] r2, int[] r3, int[] r4) throws IllegalArgumentException{
// Ensure the arrays are of equal size
……
}
9) toString 方法
一般情況下,每一個類都應該定義 toString 方法:
public String toString() { ……}
10) main 方法
普通類,考慮置入一個main()方法,其中包含用於測試那個類的程式碼,如果包含了main() 方法, 那麼它應該寫在類的底部。
4. Java編碼其它約定
n 文件化
必須用 javadoc 來為類生成文件。不僅因為它是標準,這也是被各種 java 編譯器都認可的方法。使用 @author 標記是不被推薦的,因為程式碼不應該是被個人擁有的。
n 縮排
縮排應該是每行2個空格。 不要在原始檔中儲存Tab字元, 在使用不同的原始碼管理工具時Tab字元將因為使用者設定的不同而擴充套件為不同的寬度。
如果你使用 UltrEdit 作為你的 Java 原始碼編輯器的話,你可以通過如下操作來禁止儲存Tab字元, 方法是通過 UltrEdit中先設定 Tab 使用的長度室2個空格,然後用 Format|Tabs to Spaces 選單將 Tab 轉換為空格。
n 頁寬
頁寬應該設定為80字元。 原始碼一般不會超過這個寬度, 並導致無法完整顯示, 但這一設定也可以靈活調整。 在任何情況下, 超長的語句應該在一個逗號或者一個操作符後折行。 一條語句折行後, 應該比原來的語句再縮排2個字元。
n {} 對
{} 中的語句應該單獨作為一行。 例如, 下面的第1行是錯誤的, 第2行是正確的:
if (i>0) { i ++ }; // 錯誤, { 和 } 在同一行 if (i>0) { i ++ }; // 正確, 單獨作為一行
n 括號
左括號和後一個字元之間不應該出現空格; 同樣, 右括號和前一個字元之間也不應該出現空格。 下面的例子說明括號和空格的錯誤及正確使用:
CallProc(AParameter); // 正確
不要在語句中使用無意義的括號,括號只應該為達到某種目的而出現在原始碼中。
n JSP檔案命名
採用完整的英文描述說明JSP所完成的功能,儘可能包括一個生動的動詞,第一個字母小寫,如:viewMessage.jsp、editUser.jsp或者forumChooser.jsp等。
n Servlet類命名
一般對應於所服務的物件加字尾Service來命名,如:UserService,TradeService等。
5. 一些程式設計建議
n 使用 StringBuffer 物件
在處理 String 的時候要儘量使用 StringBuffer 類,StringBuffer 類是構成 String 類的基礎。String 類將 StringBuffer 類封裝了起來,(以花費更多時間為代價)為開發人員提供了一個安全的介面。當我們在構造字串的時候,我們應該用 StringBuffer 來實現大部分的工作,當工作完成後將 StringBuffer 物件再轉換為需要的 String 物件。比如:如果有一個字串必須不斷地在其後新增許多字元來完成構造,那麼我們應該使用 StringBuffer 物件和它的 append() 方法。如果我們用 String 物件代替 StringBuffer 物件的話,會花費許多不必要的建立和釋放物件的 CPU 時間。
n 避免太多的使用 synchronized 關鍵字
避免不必要的使用關鍵字 synchronized,應該在必要的時候再使用它,這是一個避免死鎖的好方法。 必須使用時,也儘量控制範圍,最好在塊級控制。
n 避免使用 java.util.Vector 類
因為"Unlike the new collection implementations, Vector is synchronized.",所以使用java.util.Vector類在效能上會有所減低。
n 儘量使用介面而不是一個具體的類
比方如下需求,給定一個SQL語句,返回一個物件的列表,實現中用java.util.ArrayList實現,於是定義方法為:
public java.util.ArrayList getObjectItems(String sql)
上面的方法存在一個問題,當getObjectItems內改用Vector或LinkedList實現,外部類必須做相應更改。一個更好的方法是定義返回值為java.util.AbstractList更合適:
public java.util.AbstractList getObjectItems(String sql)
這樣即使更改實現,外部類也不必做相應更改。
n 避免使用索引來呼叫資料庫中間層元件返回的結果集
如:
for(int i=1; i<=dt.getRowCount(); i++){ String field1 = dt.getField(i, 0).toString(); ……}
而應用欄位名來存取結果集:
for(int i=1; i<=dt.getRowCount(); i++){ String field1 = dt.getField(i, "field1").toString(); ……}
這樣在資料庫設計更改或查詢的SQL語句發生變化時,不會影響到程式的執行。
相關文章
- 編寫靈活、穩定、高質量的HTML程式碼的規範HTML
- 編寫靈活、穩定、高質量的CSS程式碼的規範CSS
- 編寫靈活、穩定、高質量的CSS程式碼的規範(推薦收藏)CSS
- 程式碼規範之前端編寫碼規範前端
- iOS 編寫高質量Objective-C程式碼iOSObjectC程式
- 如何編寫高質量的C#程式碼(一)C#
- iOS編寫高質量Objective-C程式碼(六)iOSObjectC程式
- iOS 編寫高質量Objective-C程式碼(七)iOSObjectC程式
- iOS 編寫高質量Objective-C程式碼(八)iOSObjectC程式
- iOS 編寫高質量Objective-C程式碼(六)iOSObjectC程式
- iOS 編寫高質量Objective-C程式碼(五)iOSObjectC程式
- iOS 編寫高質量Objective-C程式碼(一)iOSObjectC程式
- iOS 編寫高質量Objective-C程式碼(二)iOSObjectC程式
- iOS 編寫高質量Objective-C程式碼(四)iOSObjectC程式
- iOS編寫高質量Objective-C程式碼(四)iOSObjectC程式
- iOS編寫高質量Objective-C程式碼(二)iOSObjectC程式
- iOS 編寫高質量Objective-C程式碼(三)iOSObjectC程式
- iOS 編寫高質量Objective-C程式碼(一)—— 簡介iOSObjectC程式
- 我們應該如何編寫高質量的前端程式碼前端
- 🐒編寫高質量程式碼(手撕程式碼)
- 《Effective JavaScript 編寫高質量JavaScript程式碼的68個有效方法》JavaScript
- Java語言編碼規範Java
- 編寫shell指令碼的規範指令碼
- 《編寫高質量程式碼:改善Java程式的151個建議》筆記Java筆記
- 消除程式碼中的壞味道,編寫高質量程式碼
- JavaScript寫程式碼要規範JavaScript
- 如何提高Java程式碼質量-優雅的寫程式碼Java
- HTML編寫規範HTML
- 編寫高質量程式碼的十個祕訣
- Java語言編碼規範(Java Code Conventions)Java
- 編寫高質量的js之正確理解正規表示式回溯JS
- HTML、CSS程式碼書寫規範HTMLCSS
- python編碼規範以及推導式的編寫Python
- Java 程式碼規範if巢狀Java巢狀
- 編碼規範 - 養成良好的Java編碼習慣Java
- 編寫高質量程式碼 改善Python程式的91個建議Python
- 程式碼質量與規範,那些年你欠下的技術債
- 編寫高質量可維護的程式碼:一目瞭然的註釋
- 如何編寫高質量的函式 -- 敲山震虎篇函式